Oracle lưu trữ data trong các block. Do đó nếu block bị lỗi, thao tác đọc ghi sẽ không thể thực hiện được. Việc kiểm tra block có bị hư hại hay không được kiểm soát bằng tham số DB_BLOCK_CHECKING
1 2 3 4 5 |
SQL> show parameter db_block_checking NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_checking string FALSE |
Tham số này nên để là FALSE/OFF. Không nên cấu hình bật lên vì sẽ ảnh hưởng lớn tới performance database.
Trong trường hợp block bị corrupt, Oracle sẽ ghi nhận thông tin lỗi vào file alert log. Ta cũng có thể kiểm tra trong các view hệ thống hay validate bằng RMAN, hay dùng DB verify…
Trong bài này chúng ta sẽ thử giả lập tình huống block corruption và xử lý.
Giả lập block corruption
Đầu tiên ta tìm 1 “ứng cử viên” để phá hoại. Ta sẽ thử phá 1 block chứa dữ liệu của table HR.Employees rồi phục hồi.
[warningbox]Lưu ý: chỉ thử nghiệm trên database test và trên dữ liệu không quan trọng để tránh rủi ro[/warningbox]
Sử dụng package DBMS_ROWID, ta có thể xác định datafile và vị trí block của 1 row dữ liệu.
1 2 3 4 5 6 7 |
SQL> SELECT DBMS_ROWID.rowid_relative_fno (ROWID) REL_FNO,DBMS_ROWID.rowid_block_number (ROWID) BLOCKNO,employee_id,first_name,last_name 2 FROM hr.employees 3 where employee_id = 101; REL_FNO BLOCKNO EMPLOYEE_ID FIRST_NAME LAST_NAME ---------- ---------- ----------- -------------------- ------------------------- 5 219 101 Neena Kochhar |
Ở đây ta tìm được vị trí row chứa thông tin của nhân viên có mã 101 trong table Employees nằm ở datafile 5, block 219.
Ta cũng có thể chuyển vị trí file# và block# thành DBA và ngược lại nếu muốn
1 2 3 4 5 6 7 8 9 10 11 12 |
SQL> select dbms_utility.make_data_block_address(5, 219) from dual; DBMS_UTILITY.MAKE_DATA_BLOCK_ADDRESS(5,219) ------------------------------------------- 20971739 SQL> SELECT dbms_utility.data_block_address_file(20971739) "FILE", dbms_utility.data_block_address_block(20971739) "BLOCK" 2 from dual; FILE BLOCK ---------- ---------- 5 219 |
Kiểm tra datafile
1 2 3 4 5 |
SQL> select name from v$datafile where file# = 5; NAME -------------------------------------------------------------------------------- /u02/app/oracle/oradata/orcldb01/example01.dbf |
Như vậy, ta sẽ phá hư block 219 trong datafile này. Đơn giản nhất là dùng lệnh dd
1 2 3 4 |
$ dd if=/dev/zero of=/u02/app/oracle/oradata/orcldb01/example01.dbf bs=8192 seek=219 count=1 conv=notrunc 1+0 records in 1+0 records out 8192 bytes (8.2 kB) copied, 0.000172648 seconds, 47.4 MB/s |
Flush buffer cache và query lại là thấy lỗi liền
1 2 3 4 5 6 7 8 9 10 |
SQL> alter system flush buffer_cache; System altered. SQL> select * from hr.employees where employee_id = 101; select * from hr.employees where employee_id = 101 * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 5, block # 219) ORA-01110: data file 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' |
Trong alert log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
ALTER SYSTEM: Flushing buffer cache Wed Jan 06 14:38:37 2016 Hex dump of (file 5, block 219) in trace file /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/trace/orcldb01_ora_23763.trc Corrupt block relative dba: 0x014000db (file 5, block 219) Completely zero block found during multiblock buffer read Reading datafile '/u02/app/oracle/oradata/orcldb01/example01.dbf' for corruption at rdba: 0x014000db (file 5, block 219) Reread (file 5, block 219) found same corrupt data (no logical check) Wed Jan 06 14:38:38 2016 Corrupt Block Found TSN = 6, TSNAME = EXAMPLE RFN = 5, BLK = 219, RDBA = 20971739 OBJN = 88047, OBJD = 93139, OBJECT = EMPLOYEES, SUBOBJECT = SEGMENT OWNER = HR, SEGMENT TYPE = Table Segment Corrupt Block Found TSN = 6, TSNAME = EXAMPLE RFN = 5, BLK = 219, RDBA = 20971739 OBJN = 88047, OBJD = 93139, OBJECT = EMPLOYEES, SUBOBJECT = SEGMENT OWNER = HR, SEGMENT TYPE = Table Segment Errors in file /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/trace/orcldb01_ora_23763.trc (incident=81840): ORA-01578: ORACLE data block corrupted (file # 5, block # 219) ORA-01110: data file 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' Incident details in: /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/incident/incdir_81840/orcldb01_ora_23763_i81840.trc Wed Jan 06 14:38:43 2016 Sweep [inc][81840]: completed Wed Jan 06 14:38:44 2016 Dumping diagnostic data in directory=[cdmp_20160106143844], requested by (instance=1, osid=23763), summary=[incident=81840]. Hex dump of (file 5, block 219) in trace file /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/incident/incdir_81840/orcldb01_m000_29965_i81840_a.trc Corrupt block relative dba: 0x014000db (file 5, block 219) Completely zero block found during validation Reread of blocknum=219, file=/u02/app/oracle/oradata/orcldb01/example01.dbf. found same corrupt data Reread of blocknum=219, file=/u02/app/oracle/oradata/orcldb01/example01.dbf. found same corrupt data Reread of blocknum=219, file=/u02/app/oracle/oradata/orcldb01/example01.dbf. found same corrupt data Reread of blocknum=219, file=/u02/app/oracle/oradata/orcldb01/example01.dbf. found same corrupt data Reread of blocknum=219, file=/u02/app/oracle/oradata/orcldb01/example01.dbf. found same corrupt data Checker run found 1 new persistent data failures |
Kiểm tra trong view v$database_block_corruption
1 2 3 4 5 |
SQL> select * from v$database_block_corruption; FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO ---------- ---------- ---------- ------------------ --------- 5 219 1 0 ALL ZERO |
Trong RMAN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
RMAN> validate tablespace example; Starting validate at 06/01/2016 14:43:48 using channel ORA_DISK_1 channel ORA_DISK_1: starting validation of datafile channel ORA_DISK_1: specifying datafile(s) for validation input datafile file number=00005 name=/u02/app/oracle/oradata/orcldb01/example01.dbf channel ORA_DISK_1: validation complete, elapsed time: 00:00:07 List of Datafiles ================= File Status Marked Corrupt Empty Blocks Blocks Examined High SCN ---- ------ -------------- ------------ --------------- ---------- 5 FAILED 0 31551 42004 1926484 File Name: /u02/app/oracle/oradata/orcldb01/example01.dbf Block Type Blocks Failing Blocks Processed ---------- -------------- ---------------- Data 0 4521 Index 0 1213 Other 1 4715 validate found one or more corrupt blocks See trace file /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/trace/orcldb01_ora_30004.trc for details Finished validate at 06/01/2016 14:43:55 |
Dùng DBV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[oracle@orcldb01 ~]$ dbv file=/u02/app/oracle/oradata/orcldb01/example01.dbf DBVERIFY: Release 11.2.0.4.0 - Production on Wed Jan 6 14:45:10 2016 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/orcldb01/example01.dbf Page 219 is marked corrupt Corrupt block relative dba: 0x014000db (file 5, block 219) Completely zero block found during dbv: DBVERIFY - Verification complete Total Pages Examined : 42000 Total Pages Processed (Data) : 4521 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 1213 Total Pages Failing (Index): 0 Total Pages Processed (Other): 4714 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 31551 Total Pages Marked Corrupt : 1 Total Pages Influx : 0 Total Pages Encrypted : 0 Highest block SCN : 1926484 (0.1926484) |
Xử lý block corruption
Khi đã biết block bị corrupt, ta có thể dễ dàng xử lý bằng RMAN. Trong RMAN cũng có thể dùng nhiều lệnh khác nhau để xử lý block corruption.
Dùng lệnh blockrecover
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
RMAN> blockrecover datafile 5 block 219; Starting recover at 07/01/2016 16:05:01 using channel ORA_DISK_1 channel ORA_DISK_1: restoring block(s) channel ORA_DISK_1: specifying block(s) to restore from backup set restoring blocks of datafile 00005 channel ORA_DISK_1: reading from backup piece /u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp tag=TAG20160107T155420 channel ORA_DISK_1: restored block(s) from backup piece 1 channel ORA_DISK_1: block restore complete, elapsed time: 00:00:15 starting media recovery media recovery complete, elapsed time: 00:00:03 Finished recover at 07/01/2016 16:05:21 |
Nếu có nhiều block bị corrupt, có thể khôi phục toàn bộ bằng lệnh
1 |
RMAN> blockrecover corruption list; |
Dùng lệnh recover
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
RMAN> recover datafile 5 block 219; Starting recover at 07/01/2016 16:12:18 using channel ORA_DISK_1 channel ORA_DISK_1: restoring block(s) channel ORA_DISK_1: specifying block(s) to restore from backup set restoring blocks of datafile 00005 channel ORA_DISK_1: reading from backup piece /u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp tag=TAG20160107T155420 channel ORA_DISK_1: restored block(s) from backup piece 1 channel ORA_DISK_1: block restore complete, elapsed time: 00:00:15 starting media recovery media recovery complete, elapsed time: 00:00:01 Finished recover at 07/01/2016 16:12:35 |
Dùng tính năng advise & repair failure. Thực ra nó cũng chỉ advise ra câu lệnh recover như bên trên thôi, nhưng tính năng này cho ta nhìn rõ hơn về lỗi cũng như hỗ trợ tự động việc sửa lỗi. Đối với các lỗi lớn cần nhiều lệnh xử lý hơn thì tính năng này rất hữu ích.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
RMAN> list failure; List of Database Failures ========================= Failure ID Priority Status Time Detected Summary ---------- -------- --------- ------------------- ------- 3862 HIGH OPEN 07/01/2016 16:03:41 Datafile 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' contains one or more corrupt blocks RMAN> list failure 3862 detail; List of Database Failures ========================= Failure ID Priority Status Time Detected Summary ---------- -------- --------- ------------------- ------- 3862 HIGH OPEN 07/01/2016 16:03:41 Datafile 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' contains one or more corrupt blocks Impact: Some objects in tablespace EXAMPLE might be unavailable List of child failures for parent failure ID 3862 Failure ID Priority Status Time Detected Summary ---------- -------- --------- ------------------- ------- 3865 HIGH OPEN 07/01/2016 16:03:41 Block 219 in datafile 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' is media corrupt Impact: Object EMPLOYEES owned by HR might be unavailable RMAN> advise failure; List of Database Failures ========================= Failure ID Priority Status Time Detected Summary ---------- -------- --------- ------------------- ------- 3862 HIGH OPEN 07/01/2016 16:03:41 Datafile 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' contains one or more corrupt blocks Impact: Some objects in tablespace EXAMPLE might be unavailable List of child failures for parent failure ID 3862 Failure ID Priority Status Time Detected Summary ---------- -------- --------- ------------------- ------- 3865 HIGH OPEN 07/01/2016 16:03:41 Block 219 in datafile 5: '/u02/app/oracle/oradata/orcldb01/example01.dbf' is media corrupt Impact: Object EMPLOYEES owned by HR might be unavailable analyzing automatic repair options; this may take some time using channel ORA_DISK_1 analyzing automatic repair options complete Mandatory Manual Actions ======================== no manual actions available Optional Manual Actions ======================= no manual actions available Automated Repair Options ======================== Option Repair Description ------ ------------------ 1 Perform block media recovery of block 219 in file 5 Strategy: The repair includes complete media recovery with no data loss Repair script: /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/hm/reco_1264574462.hm RMAN> repair failure; Strategy: The repair includes complete media recovery with no data loss Repair script: /u01/app/oracle/diag/rdbms/orcldb01/orcldb01/hm/reco_1264574462.hm contents of repair script: # block media recovery recover datafile 5 block 219; Do you really want to execute the above repair (enter YES or NO)? yes executing repair script Starting recover at 07/01/2016 16:14:23 using channel ORA_DISK_1 channel ORA_DISK_1: restoring block(s) channel ORA_DISK_1: specifying block(s) to restore from backup set restoring blocks of datafile 00005 channel ORA_DISK_1: reading from backup piece /u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/ORCLDB01/backupset/2016_01_07/o1_mf_nnndf_TAG20160107T155420_c8w9xz69_.bkp tag=TAG20160107T155420 channel ORA_DISK_1: restored block(s) from backup piece 1 channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01 starting media recovery media recovery complete, elapsed time: 00:00:03 Finished recover at 07/01/2016 16:14:27 repair failure complete |
Ngoài dùng RMAN, có thể dùng 1 số cách khác để khôi phục block như package DBMS_REPAIR, hay tool BBED,… có thời gian mình sẽ giới thiệu thêm.
Trong trường hợp có sử dụng Data Guard, việc khôi phục block có thể được thực hiện tự động bằng việc sao chép block từ standby database.
Nhìn sơ qua cũng khá đơn giản phải không nào. Tuy nhiên đi sâu vào vụ corruption này nó cũng còn nhiều thứ lắm. Trong các bài viết khác chúng ta sẽ cùng tìm hiểu kỹ hơn
12/01/2016 at 10:44
Rất hay. Bạn có thể bổ sung thêm về Logical Corrupt Block không? Giải thích cơ chế, giả lập tình huống và phương pháp xử lý.
12/01/2016 at 11:11
Mình sẽ có thêm các bài viết về corrupt block 🙂
24/04/2016 at 22:18
Bạn ơi, database của mình đang noarchivelog, thì có cách gì giải quyết Corrupt Block không.
25/04/2016 at 10:56
Nếu không chạy ở archive mode thì không recover được rồi (http://docs.oracle.com/cd/E25054_01/backup.1111/e10642/rcmblock.htm#CHDFHEID) Khả năng chỉ có thể bỏ qua corruption block đó thôi, hoặc muốn xử luôn thì di chuyển object sang tablespace khác rồi drop tablespace có datafile dính corruption block đó đi