DBA 测试人员误删手册-redo log篇
情况一:数据库还在运行,只是报错找不到redo log
1.查询当前redo log运行情况
SQL>select * from v$log;
看下哪些组日志是INACTIVE状态,记住组号(GROUP#)
2.对它们执行重建
针对非归档模式:
SQL>alter database clear logfile group <组号>;
针对归档模式:
SQL>alter database clear unarchived logfile group <组号>;
3.称当前还没写入的redo刷到你刚刚重建的redo log中
SQL>alter system checkpoint;
SQL>alter system switch logfile;
4.重复步骤1、2、3,指导所有redo log都被重建。
情况二:数据库还在运行,报错无法归档,无法用情况一中步骤2的方式重建。
1.强制关闭数据库
SQL>shutdown abort;
2.创建参数文件
SQL>create pfile='/opt/oralce/xx.ora' from spfile;
3.退出sqlplus,打开xx.ora:
添加:
|
_allow_resetlogs_corruption=true undo_management='Manual' |
修改:
| undo_tablespace='' |
4.启动实例到mount模式
SQL>startup mount;
5.生产控制文件
SQL>alter database backup conrolfile to trace as '/opt/oracle/xx.ctl';
6.关闭数据库
SQL>shutdown immediate;
7.用xx.ora参数打开实例到nomount状态
SQL>startup pfile='/opt/oracle/xx.ora' nomount;
8.新启动一个窗口B,打开xx.ctl文件,复制其中类似如下段落:
|
CREATE CONTROFILE REUSE DATABASE "IPTVMEN" RESETLOGS NOARCHIVELOG --注意:非归档复制 NOARCHIVELOG, 归档复制ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/opt/oracle/oradata/redo01.log' SIZE 1024M BLOCKSIZE 512, GROUP 2 '/opt/oracle/oradata/redo02.log' SIZE 1024M BLOCKSIZE 512, GROUP 3 '/opt/oracle/oradata/redo03.log' SIZE 1024M BLOCKSIZE 512, GROUP 4 '/opt/oracle/oradata/redo04.log' SIZE 1024M BLOCKSIZE 512, GROUP 5 '/opt/oracle/oradata/redo05.log' SIZE 1024M BLOCKSIZE 512 DATAFILE '/opt/oracle/oradata/system01.dbf', '/opt/oracle/oradata/sysaux01.dbf', '/opt/oracle/oradata/undotbs01.dbf', '/opt/oracle/oradata/user01.dbf', '/opt/oracle/oradata/lv_iptvmem1tbs', '/opt/oracle/oradata/lv_iptvmem2tbs', '/opt/oracle/oradata/lv_iptvmem3tbs', '/opt/oracle/oradata/lv_iptvmem4tbs', '/opt/oracle/oradata/lv_iptvmem5tbs', '/opt/oracle/oradata/lv_iptvmem6tbs' CHARACTER SET AL32UTF8 ; |
9.返回第一个窗口A,在SQL中,粘贴第8步的命令,直到系统返回system alter。
10.查询alert日志路径
SQL>show parameter background_dump_dest
查看对应的value,显示的路径
11.返回窗口B,打开alter日志路径,跟踪日志
tail -f alert_实例名.log
12.返回窗口A,启动数据库,同时观察窗口B,数据库在启动时有么有报错。
SQL>alter database open resetlogs;
13.查看alert日志是否报错。
如果没有报错执行13步,如果有报错,看情况三。
14.查看xx.ctl文件,复制类似如下段落,创建临时表空间
SQL>ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/temp01.dbf' SIZE 1000M REUSE AUTOEXTEND OFF;
15.重建undo表空间
SQL>drop tablespace undo表空间名 including contents and datafiles;
SQL>create undo undo表空间名 datafile '路径和文件名通过上面xx.ctl文件找' size 1000M;
16.再次关闭数据库,用自由意志启动数据库。
SQL>shutdown immediate;
SQL>startup;
17.再次观察alert日志是否报错
如果有报错看情况三
情况三:数据库已经挂了,你已经不清楚数据库在死之前是啥惨样。。
重复情况二步骤2-13.
- 如果数据库可以启动,但altert日志报错ORA-01555
| ORAL-01555:snapshot too old:rollback segment number 9 with name "_SYSSMU9_895377034$" to small |
1.查询回滚段哪些是需要恢复状态
|
SQL>select segment_name,tablespace_name,status from dba_rollback_segs; SEGMENT_NAME TABLESPACE_NAME STATUS _SYSSMU22_1350439519$ UNDOTBS1 OFFLINE _SYSSMU21_1350439519$ UNDOTBS1 OFFLINE _SYSSMU20_1350439519$ UNDOTBS1 NEED RECOVERY _SYSSMU19_1350439519$ UNDOTBS1 OFFLINE _SYSSMU18_1350439519$ UNDOTBS1 OFFLINE _SYSSMU17_1350439519$ UNDOTBS1 OFFLINE _SYSSMU16_1350439519$ UNDOTBS1 OFFLINE _SYSSMU15_1350439519$ UNDOTBS1 OFFLINE _SYSSMU14_1350439519$ UNDOTBS1 OFFLINE _SYSSMU13_1350439519$ UNDOTBS1 OFFLINE _SYSSMU12_1350439519$ UNDOTBS1 OFFLINE |
2.复制“NEED RECOVERY”的回滚字段,以下列方式填写到xx.ora文件中
--只有一个回滚字段的情况,填写:
*._offline_rollback_segments=_SYSSMU20_1350439519$
--有多个回滚段的情况,填写:
*._offline_rollback_segments=(_SYSSMU1_1350439519$,_SYSSMU2_1350439519$,_SYSSMU3_1350439519$)
3.关闭数据库,并用xx.ora启动
SQL>shutdown immediate;
SQL>startup pfile='/opt/oracle/xx.ora';
4.执行情况二步骤14-15,重建undo表空间,并自然重启数据库。
- 如果数据库无法open,且alert日志报错ORA-00600[2662]
|
SQL>alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-00603:ORACLE server session ternimated by fatal error ORA-00600:internal error code,arguments:[2662],[0],[40532809],[0],[40543696],[12583040],[],[],[],[],[],[] ORA-00600:internal error code,arguments:[2662],[0],[40532808],[0],[40543696],[12583040],[],[],[],[],[],[] ORA-01092:ORACLE intance terminated. Disconnection forced ORA-00600:internal error code,arguments:[2662],[0],[40532806],[0],[40543696],[12583040],[],[],[],[],[],[] Process ID:7104 Session ID:769 Serial number:1 |
1.用xx.ora重启数据库到mount模式
SQL>startup pfile='/opt/oracle/xx.ora' mount;
2.查询当前实例SCN,在往前推进100W(此为经验值)
|
SQL>select to_char(checkpoint_change#+1000000,'XXXXXXXXXXXX') from v$datafile_header where rownum=1; TO_CHAR(CHECK ------------- 1C21502 |
记住上面的值:1C21502
3.poke SCN
--跟踪当前会话
SQL>oradebug setmypid
Statement processed.
---查看内存地址
|
SQL>oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_[060019598,1600195C8) = 01B322E7 00000000 00000000 00000000 003159EF 00000000 00000000 00000000 00000000 00000000 60019278 00000000 |
内存地址从060019598开始,记住这个值。
--以oradebug poke 内存地址(0x060019598) 4需要推进的值(0x1C21502)格式,修改SCN
|
SQL>oradebug poke 0x060019598 4 0x1C21502 BEFORE:[060019598,06001959C) = 01B32544 AFTER:[060019598,06001959C) = 01C21502 |
--再次查看内存地址
|
SQL>oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_[060019598,1600195C8) = 01C215CA 00000000 00000000 00000000 00315B95 00000000 00000000 00000000 00000000 00000000 60019278 00000000 |
4.启动数据库
SQL>alter database open;
最后,别忘了,全备数据库

浙公网安备 33010602011771号