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;

 

最后,别忘了,全备数据库

 

posted @ 2016-07-23 18:56  当年亦如是  阅读(490)  评论(0)    收藏  举报