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

 

 

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.

 

 

Ở đâ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

 

 

Kiểm tra datafile

 

 

Như vậy, ta sẽ phá hư block 219 trong datafile này. Đơn giản nhất là dùng lệnh dd

 

 

Flush buffer cache và query lại là thấy lỗi liền

 

 

Trong alert log

 

 

Kiểm tra trong view v$database_block_corruption

 

 

Trong RMAN

 

 

Dùng DBV

 

 

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

 

 

Nếu có nhiều block bị corrupt, có thể khôi phục toàn bộ bằng lệnh

 

 

 

Dùng lệnh recover

 

 

 

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.

 

 

 

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 lookdown