Giới Thiệu
Bài viết này thảo luận về cách sửa chữa hỏng block đơn hoặc đa block của data file, bao gồm system data file, trong cơ sở dữ liệu Oracle®. Hỏng block là nguyên nhân phổ biến gây ra sự cố cơ sở dữ liệu.
Một block cơ sở dữ liệu bị hỏng khi nội dung của nó khác với những gì cơ sở dữ liệu Oracle mong đợi tìm thấy. Nếu hỏng block không được ngăn chặn hoặc sửa chữa, sự hỏng hóc có thể làm sập cơ sở dữ liệu và có thể gây mất mát dữ liệu kinh doanh quan trọng.
Đây là một trong những vấn đề thực tế mà bạn cần đối mặt và khắc phục trong cơ sở dữ liệu production.
Tìm Và Khắc Phục Hỏng Block
Hình ảnh sau hiển thị một trường hợp hỏng block có thể xảy ra:

Nguồn hình ảnh: https://blog.toadworld.com/2017/12/01/block-corruption-in-an-oracle-database
Tìm Sự Hỏng Hóc
Để tìm sự hỏng hóc, thực thi các lệnh sau:
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
Lưu ý: Trong trường hợp này, segment đối tượng SYS I_COL3 có hỏng block. Block hỏng, như được báo cáo bởi lệnh dbv, được hiển thị là free trong view dba_free_space.
Giải Phóng Các Block
Để giải phóng các block cho file 352, thực thi các lệnh sau:
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
Buộc Xóa Các Block
Sau khi các block được giải phóng, bạn có thể sử dụng các lệnh sau để buộc xóa các block hỏng đó. Đây còn được gọi là định dạng lại các block hỏng không phải là một phần của bất kỳ segment nào.
1. Tạo người dùng và cấp quyền truy cập cơ sở dữ liệu
create user Scott identified by password default tablespace SYSTEM;
grant resource, connect, create table, create trigger to Scott;
2. Xác định block hỏng đối với data file
[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. Tìm không gian trống
Select * from dba_free_space where file_id= and 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. Định dạng lại block hỏng đầu tiên
Lặp lại bước 4 cho đến khi tất cả các block hỏng được định dạng lại.
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. Xác minh các block hỏng đã được khắc phục
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:~ ] $
Kết Luận
Để phát hiện và ngăn chặn hỏng dữ liệu, hãy thực hiện các thực hành tốt nhất Maximum Availability Architecture (MAA) sau:
- Sử dụng Oracle Data Guard.
- Thiết lập tham số phát hiện hỏng block cơ sở dữ liệu Oracle.
- Triển khai chiến lược sao lưu và khôi phục với Recovery Manager (RMAN).
Các giải pháp sẵn sàng cao này được tích hợp với Oracle Database và tận dụng các cấu trúc dữ liệu cơ bản. Do đó, các công cụ cung cấp một lớp mới của bảo vệ dữ liệu thông minh và khôi phục thảm họa.
Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào.
Tìm hiểu thêm về các dịch vụ cơ sở dữ liệu và dịch vụ ứng dụng Rackspace của chúng tôi.