Linux 环境Oracle日志误删解决

578 阅读3分钟

服务器长时间运行,难免会积累大量的各种日志文件以及运行产生的垃圾文件,在linux下使用各种工具或命令去维护,本人在一次服务器维护过程中就遇到误删了redo日志文件,导致oracle 启动失败, 现在看看本人的补救方式。

su oracle
cd ~
source .bash_profile
sqlplus /nolog
connect sys/123456@sid as sysdba;
select GROUP#, SEQUENCE#, STATUS from v$log;
          GROUP#              SEQUENCE# STATUS
----------------- --------------------- -------------------------------------------------------
                 1                   45  CURRENT
                 3                   44  INACTIVE
                 2                   43  INACTIVE
select GROUP#, MEMER from v$logfile;
           GROUP# SEQUENCE#
----------------- -----------------------------------------------------------------------------
                3  /u01/app/oracle/oradata/sid/redo03.log
                1 /u01/app/oracle/oradata/sid/redo01.log
                2 /u01/app/oracle/oradata/sid/redo02.log

我们先查看oracle的日志管理,从上面的日志表中可以看出 GROUP# == 1 的是当前数据库正在使用的日志文件,正好,这个文件被误删,在指定的地址中不存在该文件,要想恢复该文件已是不可能的事情了,现在我只有恢复数据库的日志管理记录。

cd /u01/app/oracle/oradata/sid/
vi redo01.log
!wq

生成一个空的日志文件后,我们需要修改数据库的日志记录信息。

sqlplus /nolog
connect sys/123456@sid as sysdba;
--清除当前正在使用的日志组。
alter database clear logfile group 1;
--删除没有用的日志组。
alter database drop logfile group 2;
alter database drop logfile group 3;
--确保关闭数据库
shutdown immediate;
--使用normal启动数据库,此处会报database not open,但是数据库加载成功。
startup normal;
Total System Global Area      714014720 bytes
Fixed Size                                  2231792 bytes
Variable Size                          578814480 bytes
Database Buffers                   125829120 bytes
Redo Buffers                              7139328 bytes
Database normal.
database not open...    此处会出现数据库打开异常,暂时我们不去理它。
create pfile='/u01/app/oracle/corrupt.ora' from spfile;
shutdown immediate;
exit;

上面主要是清除当前数据库使用的日志记录,并删掉无用的日志记录(做为程序员,谨慎此步,如果对oracle不是非常了解,建议备份日志文件),然后重启数据库,重启过程中提示database not open,忽略它,我们创建一个新的表空间,然后关闭数据库,退出。

vim /u01/app/oracle/corrupt.ora
*._allow_resetlogs_corruption=TRUE
*.audit_file_dest='/u01/oracle/admin/elvis/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/oracle/oradata/elvis/control01.ctl','/u01/oracle/flash_recovery_area/elvis/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='sid'
*.db_recovery_file_dest='/u01/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4322230272
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=sidDB)'
*.memory_target=716177408
*.open_cursors=6000
*.processes=300      --个人服务器原因,进程数量增大
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.undo_management='MANUAL'    --添加此句
!wq  --保存

sqlplus /nolog
connect sys/123456@sid as sysdba;
startup mount pfile='/u01/app/oracle/corrupt.ora'
Total System Global Area      714014720 bytes
Fixed Size                                  2231792 bytes
Variable Size                          578814480 bytes
Database Buffers                   125829120 bytes
Redo Buffers                              7139328 bytes
Database mounted;
database not open;    --此处还是会报database not open.
alter database open resetlogs;   --打开数据库,重置日志文件。
database altered;

只要上述中alter database open resetlogs持行成功,没有报错,数据库即可恢复成功,数据也不会丢失,大家的环境不同,持行过程中,可能有细微的差别,应当查看oracle异常日志来解决。

本人在修改corrupt.ora过程中,保存后,数据库也无法启动,查看日志,大概的意思是进程数不够,因此将参数*.processes修改为300。