Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

ซ่อมแซมการบล็อกความเสียหายในฐานข้อมูล Oracle

โพสต์นี้กล่าวถึงวิธีการซ่อมแซมไฟล์ข้อมูลเสียหายหลายบล็อกหรือบล็อกเดียว รวมถึงไฟล์ข้อมูลระบบในฐานข้อมูล Oracle® การบล็อกคอร์รัปชั่นเป็นสาเหตุทั่วไปของการหยุดทำงานของฐานข้อมูล

บล็อกฐานข้อมูลเสียหายเมื่อเนื้อหาแตกต่างจากที่ฐานข้อมูล 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