โพสต์นี้กล่าวถึงวิธีการซ่อมแซมไฟล์ข้อมูลเสียหายหลายบล็อกหรือบล็อกเดียว รวมถึงไฟล์ข้อมูลระบบในฐานข้อมูล Oracle® การบล็อกคอร์รัปชั่นเป็นสาเหตุทั่วไปของการหยุดทำงานของฐานข้อมูล
บล็อกฐานข้อมูลเสียหายเมื่อเนื้อหาแตกต่างจากที่ฐานข้อมูล Oracle คาดว่าจะพบ หากไม่มีการป้องกันหรือซ่อมแซมความเสียหายของบล็อก การทุจริตอาจทำให้ฐานข้อมูลลดลงและอาจทำให้ข้อมูลธุรกิจหลักสูญหายได้
นี่เป็นหนึ่งในปัญหาแบบเรียลไทม์ที่คุณต้องเผชิญและแก้ไขในฐานข้อมูลการผลิต
ค้นหาและแก้ไขความเสียหายของบล็อก
รูปภาพต่อไปนี้แสดงความเสียหายของบล็อกที่อาจเกิดขึ้น:
แหล่งที่มาของรูปภาพ :https://blog.toadworld.com/2017/12/01/block-คอร์รัปชั่น-in-an-oracle-database
ค้นหาการทุจริต
หากต้องการค้นหาการทุจริต ให้รันคำสั่งต่อไปนี้:
SQL> select * from V$DATABASE_BLOCK_CORRUPTION;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION
----- ---------- ---------- ------------------ ----------
352 173191 9 0 ALL ZERO
SQL> SELECT FILE_ID,RELATIVE_FNO,FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES WHERE FILE_ID=352;
FILE_ID RELATIVE_FNO FILE_NAME TABLESPACE_NAME
---------- ------------ -------------------------------------------------- ------------------
352 352 /u01/apps_st/samusxxxxxxxx_data2/system09.dbf SYSTEM
SQL> SELECT owner, segment_name, segment_type FROM dba_extents WHERE RELATIVE_FNO = 352 AND Block_id BETWEEN 173191 AND 173191 + blocks - 1;
OWNER SEGMENT_NAME SEGMENT_TYPE
-------- --------------- ------------------
SYS I_COL3 INDEX
SYS C_OBJ# CLUSTER
หมายเหตุ :ในกรณีนี้ ส่วนอ็อบเจ็กต์ SYS I_COL3 มีบล็อกเสียหาย บล็อกที่เสียหายตามที่รายงานโดย dbv
คำสั่งจะแสดงเป็นฟรีในdba_free_space
มุมมอง
ปลดปล่อยบล็อก
หากต้องการเพิ่มบล็อกสำหรับไฟล์ 352 ให้รันคำสั่งต่อไปนี้:
SQL> select * from V$DATABASE_BLOCK_CORRUPTION;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION
----- ---------- ---------- ------------------ ----------
352 173191 9 0 ALL ZERO
SQL> Select * from dba_free_space where file_id =352 and 173191 between block_id and block_id + blocks -1;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
--------------- ------- -------- ----- ---------- ------------
SYSTEM 352 173191 73728 9 352
บังคับล้างบล็อก
หลังจากที่บล็อกนั้นว่าง คุณสามารถใช้คำสั่งต่อไปนี้เพื่อบังคับล้างบล็อกที่เสียหาย ซึ่งเรียกอีกอย่างว่าการจัดรูปแบบบล็อกที่เสียหายซึ่งไม่ได้เป็นส่วนหนึ่งของส่วนใดๆ
1. สร้างผู้ใช้และให้สิทธิ์ผู้ใช้เข้าถึงฐานข้อมูล
create user Scott identified by password default tablespace SYSTEM;
grant resource, connect, create table, create trigger to Scott;
2. ระบุบล็อกที่เสียหายกับไฟล์ข้อมูล
[Thu Nov 17 11:59:19 orbdev@samusxxxxxxxx:~ ] $ dbv file='/mnt/apps_st/samusxxxxxxxx_data2/system09.dbf' userid=sys/xxxxx
DBVERIFY: Release 11.2.0.4.0 - Production on Thu Nov 17 11:59:21 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
DBVERIFY - Verification starting: FILE = /mnt/apps_st/samusxxxxxxxx_data2/system09.dbf
Page 173191 is marked corrupt
Corrupt block relative dba: 0x5802a487 (file 352, block 173191)
Completely zero block found during dbv:
Page 173192 is marked corrupt
Corrupt block relative dba: 0x5802a488 (file 352, block 173192)
Completely zero block found during dbv:
Page 173193 is marked corrupt
Corrupt block relative dba: 0x5802a489 (file 352, block 173193)
Completely zero block found during dbv:
Page 173194 is marked corrupt
Corrupt block relative dba: 0x5802a48a (file 352, block 173194)
Completely zero block found during dbv:
Page 173195 is marked corrupt
Corrupt block relative dba: 0x5802a48b (file 352, block 173195)
Completely zero block found during dbv:
Page 173196 is marked corrupt
Corrupt block relative dba: 0x5802a48c (file 352, block 173196)
Completely zero block found during dbv:
Page 173197 is marked corrupt
Corrupt block relative dba: 0x5802a48d (file 352, block 173197)
Completely zero block found during dbv:
Page 173198 is marked corrupt
Corrupt block relative dba: 0x5802a48e (file 352, block 173198)
Completely zero block found during dbv:
Page 173199 is marked corrupt
Corrupt block relative dba: 0x5802a48f (file 352, block 173199)
Completely zero block found during dbv:
DBVERIFY - Verification complete
Total Pages Examined : 917504
Total Pages Processed (Data): 253735
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 335744
Total Pages Failing (Index): 0
Total Pages Processed (Other): 375
Total Pages Processed (Seg) : 17
Total Pages Failing (Seg) : 0
Total Pages Empty : 327624
Total Pages Marked Corrupt : 9
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 3412538527 (1421.3412538527)
[Thu Nov 17 12:00:13 orbdev@samusxxxxxxxx:~ ] $
3. ค้นหาพื้นที่ว่าง
Select * from dba_free_space where file_id= <Absolute file number> and <corrupted block number> between block_id and block_id + blocks -1;
SQL> Select * from dba_free_space where file_id=352 and 173191 between block_id and block_id + blocks -1;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
--------------- ---------- ---------- ---------- --------- ------------
SYSTEM 352 173196 73728 9 352
4. ฟอร์แมตบล็อกที่เสียหายครั้งแรก
ทำซ้ำขั้นตอนที่ 4 จนกว่าจะมีการฟอร์แมตบล็อกที่เสียหายทั้งหมด
create table scott.s (n number,c varchar2(4000)) nologging tablespace SYSTEM;
select owner,table_name,tablespace_name from dba_tables where table_name='S';
SQL> CREATE OR REPLACE TRIGGER corrupt_trigger
AFTER INSERT ON scott.s
REFERENCING OLD AS p_old NEW AS new_p
FOR EACH ROW
DECLARE
corrupt EXCEPTION;
BEGIN
IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
RAISE corrupt;
END IF;
EXCEPTION
WHEN corrupt THEN
RAISE_APPLICATION_ERROR(-20000, 'Corrupt block has been formatted');
END;
/
Enter value for blocknumber: 173191
old 8: IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
new 8: IF (dbms_rowid.rowid_block_number(:new_p.rowid)=173191)
Enter value for filenumber: 352
old 9: and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
new 9: and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=352) THEN
Trigger created.
Select BYTES/1024/1024 from dba_free_space where file_id=352 and 173191 between block_id and block_id + blocks -1;
72K
SQL> BEGIN
FOR i IN 1..100000 LOOP
EXECUTE IMMEDIATE 'alter table scott.s allocate extent (DATAFILE '||'''/mnt/apps_st/samusxxxxxxxx_data2/system09.dbf''' ||'SIZE 72K)';
END LOOP;
END;
/
SQL> BEGIN
FOR i IN 1..1000000 LOOP
INSERT /*+ APPEND */ INTO scott.s select i, lpad('REFORMAT',3092, 'R') from dual;
commit ;
END LOOP;
END;
/
SQL> Select * from v$database_block_corruption;
no rows selected
DROP TABLE scott.s;
Alter system switch logfile;
Alter system checkpoint;
DROP trigger corrupt_trigger;
5. ตรวจสอบว่าบล็อกที่เสียหายได้รับการแก้ไขแล้ว
SQL> select * from V$DATABASE_BLOCK_CORRUPTION;
no rows selected
[Wed Nov 16 08:12:37 orbdev@samusxxxxxx:~ ] $ dbv file='/mnt/apps_st/samusxxxxxx_data2/system09.dbf' userid=sys/****
DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 16 08:12:41 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
DBVERIFY - Verification starting : FILE = /mnt/apps_st/samusxxxxxx_data2/system09.dbf
DBVERIFY - Verification complete
Total Pages Examined : 655359
Total Pages Processed (Data) : 260868
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 340482
Total Pages Failing (Index): 0
Total Pages Processed (Other): 278
Total Pages Processed (Seg): 15
Total Pages Failing (Seg): 0
Total Pages Empty : 53716
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 136830000 (1422.136830000)
[Wed Nov 16 08:14:50 orbldev2@samusxxxxxx:~ ] $
บทสรุป
ในการตรวจจับและป้องกันข้อมูลเสียหาย ให้ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด MaximumAvailability Architecture (MAA):
- ใช้ Oracle Data Guard
- ตั้งค่าพารามิเตอร์การตรวจหาความเสียหายของบล็อกฐานข้อมูล Oracle
- ใช้กลยุทธ์การสำรองข้อมูลและการกู้คืนด้วย Recovery Manager (RMAN)
โซลูชันที่มีความพร้อมใช้งานสูงเหล่านี้ผสานรวมกับ Oracle Database และใช้ประโยชน์จากโครงสร้างข้อมูลพื้นฐาน ดังนั้น เครื่องมือนี้จึงนำเสนอการปกป้องข้อมูลอัจฉริยะและการกู้คืนจากความเสียหายระดับใหม่
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม
เรียนรู้เพิ่มเติมเกี่ยวกับบริการฐานข้อมูลและบริการแอปพลิเคชัน Rackspace