Home » RDBMS Server » Server Administration » Fractured block during buffer read (10g Release 10.2.0.5.0)
Fractured block during buffer read [message #531716] Thu, 17 November 2011 07:48 Go to next message
jackypilou
Messages: 7
Registered: October 2011
Junior Member
Hello all,

I am in charge of several instances located on a Linux server CentOS, virtualized on a ESX 3.5 environment.

From time to time (every 4 to 5 days), I have some errors in the alert.log. Last occurence was last night :

Corrupt block relative dba: 0x01004e12 (file 4, block 19986)
Fractured block found during buffer read
Data in bad block:
 type: 6 format: 2 rdba: 0x01004e12
 last change scn: 0x0000.131aaa5b seq: 0x2 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x00000006
 check value in block header: 0x9f16
 computed block checksum: 0xd3f5
Reread of rdba: 0x01004e12 (file 4, block 19986) found same corrupted data
ORA-01578: ORACLE data block corrupted (file # 4, block # 19986)
ORA-01110: data file 4: '/u01/app/oracle/oradata/aaaaa.dbf'
*** 2011-11-17 01:03:02.483
GATHER_STATS_JOB: GATHER_TABLE_STATS('"owner"','"table"','""', ...)
ORA-01578: ORACLE data block corrupted (file # 4, block # 19986)
ORA-01110: data file 4: '/u01/app/oracle/oradata/aaaaa.dbf'



We are doing user manual backup (with BEGIN/END BACKUP) every night at 8PM, ending at 9PM approx.
Then, fractured blocks never occur during backups.
At 1AM, the maintenance window is opening, thus explaining the GATHER_STATS_JOB job.

When I check corruption on early morning, I am always unable to reproduce the problem. DBV is OK without issues.
We never had a problem with the data itself, whatever it is a table or an index in the reported failed block.

I would like to know what could cause these logical corruption, and how to stop them ?

Thx in advance
Re: Fractured block during buffer read [message #531722 is a reply to message #531716] Thu, 17 November 2011 07:56 Go to previous messageGo to next message
Michel Cadot
Messages: 58573
Registered: March 2007
Location: Nanterre, France, http://...
Senior Member
Account Moderator
Outsite restore time, fractured blocks occure when:
1/ The OS IO is smaller then the Oracle block
2/ 2 processes writes the same block at the same time.

During restore, a fractured block can occur when:
1/ The OS IO is smaller then the Oracle block
2/ during the backup the tablespace was not put in backup mode.

The better way to solve this is to modify OS parameters to make it write file with an IO greater than the Oracle block (or recreate the database with an Oracle block smaller than the OS IO size).

Regards
Michel
Re: Fractured block during buffer read [message #531742 is a reply to message #531722] Thu, 17 November 2011 08:40 Go to previous messageGo to next message
jackypilou
Messages: 7
Registered: October 2011
Junior Member
I understood I am in the first case (not during a restore).
How can 2 process write to this datafile ? I would imagine 2 Oracle process would not generate fractured blocks...
Re: Fractured block during buffer read [message #531746 is a reply to message #531742] Thu, 17 November 2011 08:43 Go to previous messageGo to next message
Michel Cadot
Messages: 58573
Registered: March 2007
Location: Nanterre, France, http://...
Senior Member
Account Moderator
Quote:
I would imagine 2 Oracle process would not generate fractured blocks...

But they could if point 1 is satified, you can prevent this setting db_block_checking and db_block_checksum to TRUE.

Regards
Michel
Re: Fractured block during buffer read [message #531762 is a reply to message #531746] Thu, 17 November 2011 09:25 Go to previous messageGo to next message
jackypilou
Messages: 7
Registered: October 2011
Junior Member
Then, if I understood correctly, I need both parameters set (db_block_checking to FULL and db_block_checksum to TRUE/TYPICAL) and my problem would disappear ?
According to the documentation, the overhead is 1-10%, and I want to avoid the overhead, I need to set a block size equal to the OS IO.

As I never observed the problem in the morning, data it not corrupted at the end, but I have failures while reading at some time.

Are all these statements corrects ?

Thx again for assistance.
Re: Fractured block during buffer read [message #531785 is a reply to message #531762] Thu, 17 November 2011 11:20 Go to previous messageGo to next message
Michel Cadot
Messages: 58573
Registered: March 2007
Location: Nanterre, France, http://...
Senior Member
Account Moderator
Quote:
Then, if I understood correctly, I need both parameters set (db_block_checking to FULL and db_block_checksum to TRUE/TYPICAL) and my problem would disappear ?

It will not disappear but you will be notified as soon as it happens and not maybe far after when you will read the block and maybe many has been done assuming the block was correctly written.

Quote:
I need to set a block size equal to the OS IO.

Equal or less than the OS IO.

Regards
Michel
Re: Fractured block during buffer read [message #531889 is a reply to message #531785] Fri, 18 November 2011 05:39 Go to previous messageGo to next message
jackypilou
Messages: 7
Registered: October 2011
Junior Member
I thought again about my issue, and I still do not understand how 2 oracle processes, that basically know Oracle block size is 8k, can write only some parts of a block.
The only thing I could imagine is an external process is using system IO and touching some blocks in the datafile.

Is that correct ?
Can asyncIO, directIO have any influence on fractured blocks ? in which ways ?

Thx

[Updated on: Fri, 18 November 2011 05:40]

Report message to a moderator

Re: Fractured block during buffer read [message #531896 is a reply to message #531889] Fri, 18 November 2011 06:01 Go to previous message
Michel Cadot
Messages: 58573
Registered: March 2007
Location: Nanterre, France, http://...
Senior Member
Account Moderator
Here's a case:
- process 1 send an 1 out of 2 IO to write an Oracle block.
- IO 1 is on-going, process 1 is swap from CPU.
- process 2 send an 1 out of 2 IO to write the same Oracle block.
- IO 1 is on-going, process 2 is swap from CPU.
- IO 1 of process 1 is over, process 1 is eligible to CPU.
- IO 1 of process 2 is over, process 1 is eligible to CPU.
- Process 2 is selected to CPU and send the second IO.
- IO 2 of process 2 is on-going, process 2 is swap from CPU.
- Process 1 is selected to CPU and send its second IO.
...
At the end, the beginning of the Oracle block is from process 2 and the end from process 1.

Regards
Michel


Previous Topic: Maximum concurrent logins
Next Topic: dropping lower case tablespace
Goto Forum:
  


Current Time: Fri Jul 25 22:09:45 CDT 2014

Total time taken to generate the page: 0.19300 seconds