I am trying to figure out how much non-logged write I/O an Oracle database is doing. I want to run an ALTER DATABASE FORCE LOGGING command on the database so that I can use Oracle GoldenGate(GGS) which reads updates from Oracle’s logs. GGS will miss writes that are not logged. But if I turn on force logging it may slow down applications that depend on non-logged writes for good performance. So, I want to find some Oracle performance metrics that give me an idea about how much non-logged write I/O we have so I have an estimate of how much force logging will degrade performance.
I created SQL*Plus and PythonDBAGraphs reports based on DBA_HIST_IOSTAT_FUNCTION that gives some insight into the write I/O that is not logged. Here is the Python based graphical version of the report for one recent weekend:
The purple-blue line represents Direct Writes. These may or may not be logged. The red-orange line represents writes through the DBWR process. These are always logged. The light green line represents log I/O through the LGWR process. My theory is that if the purple line is above the green line the difference must be write I/O that is not logged. But if the green line is equal to or greater than the purple line you really do not know if there was any write I/O that was not logged. But if there is non-logged write I/O it cannot be more than the amount indicated by the purple line. So, this graph does not directly answer my question about how much write I/O was not logged but it does show some numbers that relate to the question.
I did some experiments with the V$IOSTAT_FUNCTION view that populates DBA_HIST_IOSTAT_FUNCTION to see what values it gives for Direct Writes, DBWR, and LGWR using different scenarios. Here is the zip of these scripts and their output: nologgingscriptsandlogs09122018.zip. I tested four scenarios:
- Insert append nologging
- Insert append logging
- Insert noappend logging
- Insert noappend nologging
1 and 2 did Direct Writes. 3 and 4 did DBWR writes. 2, 3, and 4 all did LGWR writes.
Here are the relevant sections of the output that correspond to these statements.
Insert append nologging:
FUNCTION_NAME WRITE_DIFF_MEGABYTES
------------------ --------------------
Direct Writes 4660
LGWR 46
DBWR 27
Insert append logging:
FUNCTION_NAME WRITE_DIFF_MEGABYTES
------------------ --------------------
LGWR 4789
Direct Writes 4661
DBWR 37
Insert noappend logging:
FUNCTION_NAME WRITE_DIFF_MEGABYTES
------------------ --------------------
DBWR 6192
LGWR 4528
Direct Writes 2
Insert noappend nologging:
FUNCTION_NAME WRITE_DIFF_MEGABYTES
------------------ --------------------
DBWR 6213
LGWR 4524
Direct Writes 2
This pattern is similar to that in a Ask Tom post that I wrote about a while back. That post showed the different situations in which writes were logged or not. I also got some ideas about direct writes and logging from this Oracle support document:
Check For Logging / Nologging On DB Object(s) (Doc ID 269274.1)
It sounds like inserts into tables that go through the normal processing eventually get written to disk by DBWR but inserts with the append hint write directly to the datafiles and may or may not be logged and written out by LGWR.
These tests and documents gave me the idea of building a report and graph based on DBA_HIST_IOSTAT_FUNCTION showing the values for the Direct Writes, DBWR, and LGWR FUNCTION_NAME values. The graph above shows an example of a real system. I was surprised to see how high the DBWR and LGWR values were and how low the Direct Writes were. That made me think that it would be safe to try turning on FORCE LOGGING because it likely will have minimal impact on the overall weekend processing. It gave me enough evidence to push for approval to do a controlled test of enabling FORCE LOGGING in production over an upcoming weekend. I will update this post with the results if we move forward with the test.
Bobby
Pingback: Nologging | Oracle Scratchpad
Pingback: Impact of Force Logging | Bobby Durrett's DBA Blog
Pingback: So Far So Good with Force Logging | Bobby Durrett's DBA Blog