实验进阶OCP #3 DBMS _REPAIR修复块损坏
2011-05-17 16:25
281 查看
使用DBMS_PEPAIR进行块修复
一、Repair包所含的过程
1,ADMIN_TABLES 提供管理函数来修复关键表
2,CHECK_OBJECT 检测块损坏
3,DUMP_ORPHAN_KEY 修复损坏行的索引
4,FIX_CORRUPT_BLOCK 标记检测出的坏块位置
5,REBUILD_FREELISTS 重建可用列表
6,SEGMENT_FIX_STATUS 检测段损坏(自动段管理时可用)
7,SKIP_CORRUPT_BLOCKS 设置跳过坏块
使用限制
包含LOB类型,不支持check过程的集群环境,索引管理表和LOB索引
二、模拟坏块环境
1,创建表空间
2,建表插入测试记录
增量插入
3,创建索引
4 shutdown后,将user_data.dbf传到本地,使用ultraedit进行修改,传回到服务器上。注意一定要shutdown后再传文件,虽然没有读写操作,但是scn号会变化,影响控制文件造成version问题
找到连续的数据段,进行修改
5 dbv检查
dbv检查可以发现坏块:
如果是针对段,可以先通过段的检查,查出段ID
SELECT TABLESPACE_ID, HEADER_FILE, HEADER_BLOCK
FROM SYS_DBA_SEGS
WHERE SEGMENT_NAME = 'TEST';
dbv USERID=scott/oracle SEGMENT_ID=8.7.11(账户需要只需具有create session权限)
三、DBMS_REPAIR使用范例
1,建立修复表
2,检测
查询信息
DESC REPAIR_TABLE;
......
3,标记坏块
这时可以在repair表中再查询下marked状态,确认所有坏块已经被标记
5,设置跳过坏块
可以查询DBA_TABLES中的skip,指定下用户和表名
6,处理无效键值 dump_orphan_keys
一、Repair包所含的过程
1,ADMIN_TABLES 提供管理函数来修复关键表
2,CHECK_OBJECT 检测块损坏
3,DUMP_ORPHAN_KEY 修复损坏行的索引
4,FIX_CORRUPT_BLOCK 标记检测出的坏块位置
5,REBUILD_FREELISTS 重建可用列表
6,SEGMENT_FIX_STATUS 检测段损坏(自动段管理时可用)
7,SKIP_CORRUPT_BLOCKS 设置跳过坏块
使用限制
包含LOB类型,不支持check过程的集群环境,索引管理表和LOB索引
二、模拟坏块环境
1,创建表空间
CREATE TABLESPACE USER_DATA DATAFILE '/u01/user_data.dbf' size 5M;
CREATE TABLESPACE USER_INDEX DATAFILE '/u01/user_index.dbf' SIZE 5M;
2,建表插入测试记录
增量插入
create table SCOTT.test tablespace USER_DATA as select * from all_tables;
insert into scott.test select * from scott.test;
3,创建索引
CREATE INDEX scott.test_idx ON scott.test(TABLE_NAME)
tablespace 'USER_INDEX' ;
4 shutdown后,将user_data.dbf传到本地,使用ultraedit进行修改,传回到服务器上。注意一定要shutdown后再传文件,虽然没有读写操作,但是scn号会变化,影响控制文件造成version问题
找到连续的数据段,进行修改
5 dbv检查
dbv检查可以发现坏块:
dbv file=/u01/user_data.dbf blocksize=8192
如果是针对段,可以先通过段的检查,查出段ID
SELECT TABLESPACE_ID, HEADER_FILE, HEADER_BLOCK
FROM SYS_DBA_SEGS
WHERE SEGMENT_NAME = 'TEST';
dbv USERID=scott/oracle SEGMENT_ID=8.7.11(账户需要只需具有create session权限)
三、DBMS_REPAIR使用范例
1,建立修复表
BEGIN
DBMS_REPAIR.ADMIN_TABLES (
TABLE_NAME => 'REPAIR_TABLE',
TABLE_TYPE => dbms_repair.repair_table,
ACTION => dbms_repair.create_action,
TABLESPACE => 'USERS');
END;
2,检测
SER SERVEROUTPUT ON
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT(
SCHEMA_NAME => 'SCOTT',
OBJECT_NAME => 'TEST',
REPAIR_TABLE_NAME => 'REPAIR_TABLE',
CORRUPT_COUNT => num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt : '|| TO_CHAR(num_corrupt));
END;
查询信息
DESC REPAIR_TABLE;
......
3,标记坏块
SER SERVEROUTPUT ON
DECLARE num_fix INT;
BEGIN
num_fix := 0;
DBMS_REPAIR.FIX_CORRUPT_BLOCKS(
SCHEMA_NAME => 'SCOTT',
OBJECT_NAME => 'TEST',
REPAIR_TABLE_NAME => 'REPAIR_TABLE',
FIX_COUNT => num_fix);
DBMS_OUTPUT.PUT_LINE('number fix : '|| TO_CHAR(num_fix));
END;
这时可以在repair表中再查询下marked状态,确认所有坏块已经被标记
5,设置跳过坏块
BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(
SCHEMA_NAME => 'SCOTT',
OBJECT_NAME => 'TEST',
OBJECT_TYPE => dbms_repair.table_object,
FLAGS => dbms_repair.skip_flag);
END;
可以查询DBA_TABLES中的skip,指定下用户和表名
6,处理无效键值 dump_orphan_keys
SET SERVEROUTPUT ON
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
SCHEMA_NAME => 'SCOTT',
OBJECT_NAME => 'scott.test_idx',
OBJECT_TYPE => dbms_repair.index_object,
REPAIR_TABLE_NAME => 'REPAIR_TABLE',
ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR (num_orphans));
END;
相关文章推荐
- dbms_repair包修复损坏的数据块
- DBMS_REPAIR包修复损坏数据块
- DBMS_REPAIR包修复损坏数据块
- MySQL数据库INNODB 表损坏修复处理过程 无法repair的变通方法
- dbms_repair包修复坏块
- 使用 DBMS_REPAIR 修复坏块
- 使用 DBMS_REPAIR 修复坏块
- 使用 DBMS_REPAIR 修复坏块
- dbms_repair(修复)
- 使用dbms_repair修复坏块
- sqlserver和Oracle内部的错误数据修复(DBCC、DBMS_REPAIR)
- 使用dbms_repair修复受损数据块
- centos 6.8 启动损坏修复实验
- 数据文件offline,未归档的非活动在线日志或当前在线日志损坏,在线修复(实验系列)
- redis突然掉电导致aof文件损坏修复一例 推荐
- centos7修复实验
- 修复断电等损坏的SQL 数据库
- 如何诊断/修复损坏的 Jet 4.0 数据库
- 使用DiskGenius(原DiskMan)修复损坏的硬盘分区
- dpkg 和 apt-get损坏修复