数据库恢复的基本技术有哪些 一次误操作引起的Oracle数据库大恢复
一次误操作引起的Oracle数据库大恢复
事情起由是在Oracle g手动建库脚本中看到dbms_backup_restore zerodbid( )过程 其中作用是修改数据库的dbid 于是想通过该存储直接在sqlplus中执行修改dbid
修改之前记录其dbid
引用
SQL> select dbid from v$database;
DBID
修改dbid
引用
SQL> exec dbms_backup_restore zerodbid( );
PL/SQL procedure successfully pleted
貌似执行成功了 但随后alert日志显示ckpt进程将数据实例终止
引用
Tue Mar : :
CKPT: terminating instance due to error
Instance terminated by CKPT pid =
Tue Mar : :
再次启动数据库报错
引用
Tue Mar : :
Errors in file /ora g/app/admin/ldbra/udump/ldbra_ora_ trc:
ORA : data file is not the same file to a background process
ORA signalled during: ALTER DATABASE OPEN
dump Oracle数据文件头
引用
SQL> ALTER SESSION SET EVENTS immediate trace name file_hdrs level ;
通过跟踪文件可以看到dbid以被重置为
引用
V STYLE FILE HEADER:
Compatibility Vsn = = xa
Db ID= = x Db Name= LDBRA
Activation ID= = x
Control Seq= = x fba File size= = xff
File Number= Blksiz= File Type= DATA
还有一种途径是通过bbed工具观察
引用
struct kcvfhhdr bytes @
ub kccfhswv @ x
ub kccfhcvn @ x a
ub kccfhdbi @ x
当然第一反应是重建控制文件 看看能不能恢复成功
引用
SQL> alter database backup controlfile to trace;

Database altered
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE LDBRA RESETLOGS ARCHIVELOG
MAXLOGFILES
MAXLOGMEMBERS
MAXDATAFILES
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
STANDBY LOGFILE
DATAFILE
/ora g/app/oradata/ldbra/system dbf
/ora g/app/oradata/ldbra/undotbs dbf
/ora g/app/oradata/ldbra/sysaux dbf
/ora g/app/oradata/ldbra/users dbf
/ora g/app/oradata/ldbra/example dbf
/ora g/app/product/ /db_ /dbs/pany dbf
/ora g/app/product/ /db_ /dbs/streams dbf
CHARACTER SET ZHS GBK
;
郁闷的是重建控制文件不成功
引用
CREATE CONTROLFILE REUSE DATABASE LDBRA RESETLOGS NOARCHIVELOG
*
ERROR at line :
ORA : CREATE CONTROLFILE failed
ORA : log is inconsistent with other logs
想到还有另外一种语法重建控制文件(重建控制文件之前 备份controlfile和online redolog)
引用
Create controlfile reuse set database LDBRA
MAXINSTANCES
MAXLOGHISTORY
MAXLOGFILES
MAXLOGMEMBERS
MAXDATAFILES
Datafile
/ora g/app/oradata/ldbra/system dbf
/ora g/app/oradata/ldbra/undotbs dbf
/ora g/app/oradata/ldbra/sysaux dbf
/ora g/app/oradata/ldbra/users dbf
/ora g/app/oradata/ldbra/example dbf
/ora g/app/product/ /db_ /dbs/ pany dbf
/ora g/app/product/ /db_ /dbs/streams dbf
LOGFILE GROUP ( /ora g/app/oradata/ldbra/redo log ) SIZE K
GROUP ( /ora g/app/oradata/ldbra/redo log ) SIZE K
GROUP ( /ora g/app/oradata/ldbra/redo log ) SIZE K RESETLOGS;
似乎重建成功了!但是进行recover的时候报错了!
引用
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA : recovery session canceled due to errors
ORA : internal error code arguments: [kcvhvdf_ ] [] [] [] [] [] []
[]
可以看到控制文件在重建的过程中进行了dbid重置
引用
SQL> select dbid from v$database;
DBID
问题到这里似乎失去了头绪 呵呵 拷回之前备份的控制文件替换刚建的控制文件 因为我采用的是resetlog选项创建控制文件 从理论上来讲 应该是会重置redolog的 即重新创建redolog 但是目前采用此选项确报ORA 错误 不可思议!后来一想可能是跟数据文件中的dbid为 有关 于是采用终极修复方法 bbed!首先将所有数据文件的dbid用bbed工具重置为 其次将fuzzy标记打为 x (因为数据库被ckpt进程异常终止 将标记打为 x 表示数据库是shutdown immediate关闭) 采用上述方法之后控制文件成功创建!
引用
SQL> STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE LDBRA RESETLOGS ARCHIVELOG
MAXLOGFILES
MAXLOGMEMBERS
MAXDATAFILES
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
ORACLE instance started
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
GROUP /ora g/app/oradata/ldbra/redo log SIZE M
STANDBY LOGFILE
DATAFILE
/ora g/app/oradata/ldbra/system dbf
/ora g/app/oradata/ldbra/undotbs dbf
/ora g/app/oradata/ldbra/sysaux dbf
/ora g/app/oradata/ldbra/users dbf
/ora g/app/oradata/ldbra/example dbf
/ora g/app/product/ /db_ /dbs/pany dbf
/ora g/app/product/ /db_ /dbs/streams dbf
CHARACTER SET ZHS GBK
;
Control file created
尝试打开数据库
SQL> alter database open RESETLOGS;
出现数据库挂起状态 后台alert日志显示[ ]错误 呵呵 看到这个错误 希望就来了!
引用
SMON: enabling cache recovery
Tue Mar : :
Errors in file /ora g/app/admin/ldbra/udump/ldbra_ora_ trc:
ORA : internal error code arguments: [ ] [ ] [ ] [ ] [ ] [ ] [] []
Tue Mar : :
Errors in file /ora g/app/admin/ldbra/udump/ldbra_ora_ trc:
ORA : internal error code arguments: [ ] [ ] [ ] [ ] [ ] [ ] [] []
Tue Mar : :
由于shutdown abort实例不起作用 就采用杀Oracle进程 删除共享内存段的做法 将挂起的数据库实力强制abort
杀Oracle核心进程
引用
[ora g@test bdump]$ ps ef|grep ora_
ora g Feb ? : : ora_pmon_streams
ora g Feb ? : : ora_psp _streams
ora g Feb ? : : ora_mman_streams
ora g Feb ? : : ora_dbw _streams
ora g Feb ? : : ora_lgwr_streams
ora g Feb ? : : ora_ckpt_streams
ora g Feb ? : : ora_smon_streams
ora g Feb ? : : ora_reco_streams
ora g Feb ? : : ora_cjq _streams
ora g Feb ? : : ora_mmon_streams
ora g Feb ? : : ora_mmnl_streams
ora g Feb ? : : ora_d _streams
ora g Feb ? : : ora_s _streams
ora g Feb ? : : ora_qmnc_streams
ora g Feb ? : : ora_q _streams
ora g Feb ? : : ora_q _streams
ora g : ? : : ora_j _streams
ora g : pts/ : : grep ora_
[ora g@test bdump]$ kill
删除Oracle 共享内存段
引用
[ora g@test bdump]$ ipcs
Shared Memory Segments
key shmid owner perms bytes nattch status
xcc b c ora g
x b b ora g
Semaphore Arrays
key semid owner perms nsems
x d ec ora g
Message Queues
key msqid owner perms used bytes messages
[root@test ~]# ipcrm m
[root@test ~]# ipcrm s
再次尝试将实例打开 这里用到了 事件
引用
SQL> alter session set events trace name adjust_scn level ;
Session altered
SQL> alter database open;
alter database open
*
ERROR at line :
ORA : file needs media recovery
ORA : data file : /ora g/app/oradata/ldbra/system dbf
SQL> recover database;
Media recovery plete
SQL> alter database open;
Database altered
后续工作就是将tempfile添加到temp表空间中 终于恢复成功
引用
SQL> alter tablespace temp add tempfile /ora g/app/oradata/ldbra/temp dbf size m reuse;
lishixinzhi/Article/program/Oracle/201311/18247