单实例Oracle数据库故障应对
一、前提
- 1.目标数据库打开归档模式
SQL> archive log list; #查看归档模式
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter databse archivelog;
SQL> alter datadase open;
#归档路径默认是快速恢复区。
- 2.使用恢复目录
1)dbca创建恢复目录数据库;
2)恢复目录数据库中创建表空间
$ . oraenv
$ sqlplus / as sysdba
SQL> select instance_name, status from v$instance; #查看实例状态
create tablespace <表空间名> datafile '<文件路径>' size <大小>M;
3)创建目录数据库的所有者用户
SQL> create user <用户名> identified by <口令>
2 default tablespce <表空间名> temporary <临时表空间名>
3 quota unlimited on <表空间名>;
4)创建恢复目录
$ rman catalog <恢复目录所有者用户>/<口令>@<恢复目录数据库名>
RMAN> cteate catalog;
5)在恢复目录数据库中注册目标数据库
$ . oraenv
? <目标数据库>
$ rman target / catalog <恢复目录所有者用户>@<恢复目录数据库>
RMAN> register database;
#注册后RMAN自动将控制文件的备份信息同步到恢复目录中。
RMAN> list incatnation; #检查是否注册成功
RMAN> report schema; #检查同步后恢复目录信息
- 3.配置RMAN的默认设置
#查看RMAN当前设置
RMAN> show all;
#配置备份集文件格式
RMAN> configure channel device type disk format '+FRA/backup/%d_%U.bak';
#配置默认存储设备为磁盘
RMAN> configure default device type to disk;
#设置控制文件自动备份
RMAN> configure controlfile autobackup on;
#设置备份的保留策略,提高恢复效率
RMAN> configure retention policy to recovery window of 3 days; #redundancy 3;
#设置备份优化选项
RMAN> configure backup optimization on;
- 4.整库备份,包括控制文件、服务器参数文件及所有归档日志,并删除旧的归档日志
RMAN> backup database plus archivelog delete input;
二、控制文件损坏
1.多路复用的控制文件没有损坏:关闭数据库,用完好的控制文件覆盖损坏的控制文件,或者修改参数文件的control_files参数,删除损坏的控制文件,然后重启数据库。
2.所有控制文件全部损坏:
RMAN> list backup of controlfile; #查看控制文件备份
SQL> show parameter control_files; #显示当前控制文件信息
#数据库置为mount阶段
$ rman target / catalog <恢复目录所有者>/<口令>@<恢复目录数据库>
RMAN> restore controlfile from autobackup;
RMAN> recover database;
RMAN> alter database open resetlogs;
采用了resetlogs选项,数据库正常打开后应进行一次整库备份。
三、服务器参数文件损坏
RMAN> restore spfile from autobackup;
四、重做日志组丢失
1.丢失的联机重做日志组处于inactive状态
$ cd /u01/app/oracle/diag/rdbms/<db_name>/<SID>/trace
$ tail -n100 alert_<SID>.log #查看预警日志判断故障
#数据库置为mount阶段
SQL> alter database clear logfile group 2; #清除故障日志组
SQL> alter database open;
SQL> select group#, thread#, sequence#, archived, status from v$log;
#查看联机日志组
2.损坏的联机重做日志组处于active状态,但是实例尚未停止
SQL> alter system switch logfile; #立即执行强制日志切换
SQL> alter database clear logfile group 2;
SQL> alter database open;
SQL> select group#, thread#, sequence#, archived, status from v$log;
联机事务处理数据库尽快备份。
五、非系统表空间故障
#可以使用数据恢复指导恢复
RMAN> list failure;
RMAN> advise failure; #可以查看产生的修复脚本知道将如何恢复该表空间
RMAN> repair failure;
六、SYSTEM表空间故障
系统(system)表空间存放了数据字典信息,该表空间不能采用脱机的方式实现联机的恢复。确保包含有系统表空间的数据库备份可用。
#数据库置为mount阶段
RMAN> restore tablespace system;
RMAN> recover tablespace system;
RMAN> alter database open;
七、块介质恢复(需要启用了闪回数据库)
块介质恢复是在数据文件因各种原因造成数据块损坏时,仅仅还原和恢复其中的受损的坏块,在恢复期间,受影响的数据文件仍然处于联机状态。
RMAN> validate datafile 7; #验证损坏的块,结果可在跟踪文件查看
RMAN> recover corruption list;
八、临时表空间损坏
如果有临时表空间的数据文件损坏,系统会在实例重启时自动创建新的临时文件。常见的做法是不用重启数据库实例,直接手工添加一个新的临时文件,然后删除损坏的临时文件即可。
SQL> drop tablespace temp1;
SQL> create temporary tablespace temp1
2 tempfile '<临时表空间文件路径,如/home/oracle/temp1.dbf>'
3 size 50M;
如果要删除数据库默认临时表空间,必须先更改其他临时表空间为系统默认临时表空间。
SQL> alter database default temporary tablespace temp2;
九、还原表空间损坏
1)如果有备份,使用备份恢复丢失的关键数据文件;
2)如果没有备份,重建undo表空间以实现恢复。
SQL> shutdown abort;
SQL> startup mount;
SQL> alter database datafile 3 offline drop; #可以启动数据库查看报错或查看跟踪文件得到丢失的还原表空间文件编号
SQL> alter database open;
SQL> create undo tablespace UNDOTBS2 datafile '+DATA' size 300M; #创建新的还原表空间
SQL> alter system set undo_tablespace = 'UNDOTBS2' scope = both;
SQL> drop tablespace <故障表空间> including contents and datafiles;