royalwzy
作者royalwzy·2017-03-30 14:03
技术经理·海通证券股份有限公司

Oracle数据库的备份与恢复—使用RMAN恢复备份

字数 10026阅读 3211评论 0赞 1

Objectives

1.当关键或者非关键数据文件丢失时,执行完全恢复;
2.使用增量更新备份恢复;
3.使用镜像拷贝快速恢复;
4.把数据库还原到一个新服务器上;
5.使用备份的控制文件恢复

Using RMAN RESTORE and RECOVER Commands

1.restore命令:从备份中还原数据库文件;
2.recover命令:应用改变,需要用到增量备份和在线日志中的日志条目;
3.也可以使用EM恢复向导来创建和运行rman的脚本

Performing Complete Recovery: Loss of a Noncritical Data File in ARCHIVELOG Mode

1.如果丢失了一个不属于SYSTEM,SYSAUX和UNDO表空间的数据文件,可以不停数据库直接还原数据文件;
2.测试的例子;
2.1全备:
rman target sys/ORACLE@ORCL catalog rman/oracle@ORCL
backup database plus archivelog delete input;
2.2模拟损坏:
mv /u01/app/oracle/oradata/ORCL/example01.dbf /u01/app/oracle/oradata/ORCL/example01.dbf.bak
2.3验证损坏:
SELECT * FROM dba_tables WHERE tablespace_name = 'EXAMPLE';
SELECT COUNT(*) FROM hr.jobs;
2.4还原:
rman target /
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online';
select count(*) from hr.jobs

Performing Complete Recovery: Loss of a System-Critical Data File in ARCHIVELOG Mode

1.如果丢失了属于SYSTEM,SYSAUX或者UNDO表空间的数据文件,必须要停止数据库然后进行恢复;
2.测试的例子;
2.1模拟损坏:
mv /u01/app/oracle/oradata/ORCL/system01.dbf /u01/app/oracle/oradata/ORCL/system01.dbf.bak
2.2验证损坏:
alter system flush buffer_cache;
select count(*) from dba_objects;
2.3还原:
shutdown immediate;
shutdown abort;
startup mount;
rman target /
restore datafile 1;
recover datafile 1;
alter database open

Recovering Image Copies

1.在rman中,可以使用增量备份来恢复镜像拷贝;
2.原理是:首先做一个镜像拷贝,然后把增量备份应用到这个镜像拷贝上,此时镜像拷贝就会被更新到增量备份截止的SCN的位置,就好像重新做了一个到此SCN位置的一个镜像拷贝;
3.优点是:省去了使用备份集做媒体恢复的时间,因为需要应用上次增量备份以来所有的归档日志;同样也不需要每次都执行一次全量的镜像拷贝

Recovering Image Copies: Example

1.幻灯片中演示的例子可以获得一个连续可更新的数据库的镜像拷贝;
2.第一天:只是做一个全库的镜像拷贝,不需要执行恢复操作;
backup as copy incremental level 0 database tag 'full_db_copy';
3.第二天:只是做一个1级备份,也不执行恢复操作;
backup incremental level 1 for recover of copy with tag 'full_db_copy' database;
4.第三天:首先要做一个基于镜像拷贝的恢复操作,然后再进行增量备份,之后每天的操作都如此;
recover copy of database with tag 'full_db_copy';
backup incremental level 1 for recover of copy with tag 'full_db_copy' database;
5.这类的备份策略中,最重要的就是使用tag,它可以把增量备份与相应的镜像拷贝连接起来;如果没有tag的话,有可能会发生错误;
6.如果恢复进程失败的话,只需要重启恢复进程即可,rman自动决定需要应用增量备份的镜像拷贝

Performing a Fast Switch to Image Copies

1.场景一:假设EXAMPLE表空间所在磁盘损坏了,表空间无法访问;但是有这个表空间的镜像拷贝,可以直接使用switch命令,使用此镜像拷贝作为数据库的文件;

1.1模拟磁盘损坏:
mv /u01/app/oracle/oradata/ORCL/example01.dbf /u01/app/oracle/oradata/ORCL/example01.dbf.bak
select count(*) from hr.jobs;
1.2查看镜像备份,并直接使用:
rman target /
list copy; -- 位置在快速闪回区:/u01/app/oracle/fast_recovery_area/ORCL/datafile/o1_mf_example_9m59co8o_.dbf
SQL "ALTER TABLESPACE example OFFLINE IMMEDIATE";
SWITCH TABLESPACE example TO COPY;
RECOVER TABLESPACE example;
SQL "ALTER TABLESPACE example ONLINE";
1.3查看数据文件的位置:
SELECT NAME FROM v$datafile WHERE file# = 5;

2.还是刚刚的场景,但是想把文件移动到默认的位置;这就需要使用set newname命令,而这个命令必须放在一个run块中;

2.1还原场景:
alter tablespace example offline;
cp /u01/app/oracle/fast_recovery_area/ORCL/datafile/o1_mf_example_9m59co8o_.dbf /u01/app/oracle/oradata/ORCL/example01.dbf
alter database rename file '/u01/app/oracle/fast_recovery_area/ORCL/datafile/o1_mf_example_9m59co8o_.dbf' to '/u01/app/oracle/oradata/ORCL/example01.dbf';
alter tablespace example online;
SELECT NAME FROM v$datafile WHERE file# = 5;

2.2然后在再生成一个example表空间的镜像拷贝;
backup as copy tablespace example;

2.3模拟损坏:
mv /u01/app/oracle/oradata/ORCL/example01.dbf /u01/app/oracle/oradata/ORCL/example01.dbf.bak
select count(*) from hr.jobs; -- 如果还是可以查看到的话就是有缓存,alter system flush buffer_cache;或者查看其它表;

2.4还原文件到默认位置;
RUN
{
SQL "ALTER TABLESPACE example OFFLINE IMMEDIATE";
SET NEWNAME FOR DATAFILE '/u01/app/oracle/fast_recovery_area/ORCL/datafile/o1_mf_example_9m59co8o_.dbf'

                    TO '/u01/app/oracle/oradata/ORCL/example01.dbf';

RESTORE TABLESPACE example;
SWITCH DATAFILE ALL;
RECOVER TABLESPACE example;
SQL "ALTER TABLESPACE example ONLINE";
}
SELECT NAME FROM v$datafile WHERE file# = 5;

3.可以使用switch命令恢复数据文件,表空间,临时文件,甚至整个数据库;
set newname for datafile/tempfile/tablespace/database;

-- Using SET NEWNAME for Switching Files
1.set newname命令只能被用于run块中,它代表接下来操作的名称映射;
2.相对于针对每个文件都设置一次,更高效的方式是针对所有的文件都设置一个缺省名称;
3.缺省的名称可以被用于duplicate,restore和switch命令中

Substitution Variables for SET NEWNAME

1.相关的变量:

  • %b:指定不带目录的文件名;
  • %f:指定一个文件编号;
  • %I:指定DBID;
  • %N:指定表空间名称;
  • %U:由系统生成,格式为data-D-%d_id-%I_TS-%N_FNO-%f

2.幻灯片上讲的是针对1-4单独指定了名称,针对表空间EXAMPLE指定了一个默认名称;

Performing Restore and Recovery of a Database in NOARCHIVELOG Mode

1.如果数据库处于NOARCHVELOG模式,如果任何文件(只读文件除外)丢失,都需要执行以下步骤;
2.关闭数据库;
3.还原整个数据库,包括所有的数据文件,控制文件,参数文件,密码文件等;
4.打开数据库;
5.备份之后的改变都要重新录入;
6.如果丢失的是只读文件的话,则只需要单独还原这一个文件

Using Restore Points

1.可以给定一个名字代表某一个时刻或者某一个SCN;
2.这对于以后的引用非常有用,比如在基于时间点的还原或者闪回操作中;
3.创建的语法为:CREATE RESTORE POINT rp_name [AS OF SCN scn_number] [PRESERVE];
4.正常情况下,还原点保存的时间取决于control_file_record_keep_time系统参数,但是可以通过制定PRESERVE选项来使还原点一直有效,直到显示的删除它;
5.可以通过视图查看SELECT * FROM v$restore_point

Performing Point-in-Time Recovery

1.确定要还原的点,可以根据SCN/时间/还原点/日志的编号来确定;
1.1查看当前时间:SELECT to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
1.2更新数据库:
select salary from hr.employees where employee_id = 200;
update hr.employees set salary = salary*1.1 where employee_id = 200;
commit;

2.设置环境变量;
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"

3.启动数据库到mount状态;
shutdown immediate;
startup mount;

4.还原数据库到指定的时间点;
rman target /
RUN
{

 SET UNTIL TIME '2014-03-26 20:38:51';
 RESTORE DATABASE;
 RECOVER DATABASE;

}

5.以只读的方式打开数据库,来验证数据书否正确;
sql'ALTER DATABASE OPEN READ ONLY';
select salary from hr.employees where employee_id = 200;

6.以resetlogs的方式打开数据库;
ALTER DATABASE OPEN RESETLOGS

Performing Recovery with a Backup Control File

1.当所有的控制文件都丢失时,需要还原控制文件,然后把数据库启动到mount状态;
1.1模拟控制文件全部丢失:
show parameter control_files;
mv /u01/app/oracle/oradata/ORCL/control01.ctl /u01/app/oracle/oradata/ORCL/control01.ctl.bak
mv /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl.bak
1.2还原控制文件:
shutdown abort;
startup nomount;
restore controlfile from autobackup;
alter database mount;
2.执行recover命令,恢复数据文件;
recover database;
3.以resetlogs的方式打开数据库;
ALTER DATABASE OPEN RESETLOGS

Recovery from Loss of Server Parameter File

1.可以使用create spfile/pfile from pfile/spfile/memory语法;11g中添加了memory子句,表示使用当前系统级别的参数创建pfile/spfile;
2.数据库启动时也会把非默认的参数记录到alert文件中,每次参数的修改在alert文件中也有,所以可以参考alert文件重新写一个pfile,然后使用

Restoring the Server Parameter File from the Control File Autobackup

1.模拟损坏,并关闭数据库;
show parameter spfile;
mv /u01/app/oracle/product/11.2.0/db_1/dbs/spfileORCL.ora /u01/app/oracle/product/11.2.0/db_1/dbs/spfileORCL.ora.bak
shutdown immediate;
2.还原参数文件并启动数据库;
rman target /
startup nomount; -- 启动默认实例;
restore spfile from autobackup recovery area = '/u01/app/oracle/fast_recovery_area' db_name = 'ORCL';
或者
restore spfile from '/u01/app/oracle/fast_recovery_area/ORCL/autobackup/2014_03_26/o1_mf_s_843253685_9m5n9qjf_.bkp';
startup force

Restoring the Control File from Autobackup

1.首先生成一个创建控制文件的范本;
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/controlf.ctl' REUSE;
2.首先创建一个表空间;
CREATE TABLESPACE tbs_test1 DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_test1.dbf' size 5M;
SELECT * FROM dba_tablespaces;
3.模拟控制文件全部丢失:
show parameter control_files;
mv /u01/app/oracle/oradata/ORCL/control01.ctl /u01/app/oracle/oradata/ORCL/control01.ctl.bak
mv /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl.bak
shutdown abort
4.参考范本,手动创建控制文件;
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292

LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ORCL/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORCL/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/ORCL/system01.dbf',
'/u01/app/oracle/oradata/ORCL/sysaux01.dbf',
'/u01/app/oracle/oradata/ORCL/undotbs01.dbf',
'/u01/app/oracle/oradata/ORCL/users01.dbf',
'/u01/app/oracle/oradata/ORCL/example01.dbf'
CHARACTER SET AL32UTF8;
5.恢复数据库,这个过程中可以打开alert.log文件观察提示的过程;
RECOVER DATABASE USING BACKUP CONTROLFILE;
这个过程可能需要手动指定日志文件,根据提示的SCN号查询归档日志;
SELECT RECID,NAME,FIRST_CHANGE#,NEXT_CHANGE# from v$archived_log;
如果归档日志用完的话,可以尝试联机在线日志;
6.打开数据库,日志中提示缺少临时文件;
ALTER DATABASE;
7.临时文件;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp01.dbf' SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
8.缺少的表空间会自动添加到控制文件中;
8.1alert文件的提示:
Tablespace 'TBS_TEST1' #7 found in data dictionary,
but not in the controlfile. Adding to controlfile.
8.2修改表空间:
ALTER DATABASE RENAME FILE '/u01/app/oracle/product/11.2.0/db_1/dbs/MISSING00006' to '/u01/app/oracle/oradata/ORCL/tbs_test1.dbf';
recover datafile 6;
ALTER TABLESPACE TBS_TEST1 ONLINE

Using Incremental Backups to Recover a Database in NOARCHIVELOG Mode

1.在非归档模式下,增量备份只能执行有限的恢复;而且增量备份必须是一致性的;
2.如果联机日志丢失或者redo不能应用到增量备份的话,需要指定NOREDO选项,否则会报错;

Restoring and Recovering the Database on a New Host

1.因为只有一台测试机,所以把它还原到同一台机器上;
2.如果还原到新的机器上过程更简单,因为不用考虑重名的问题

Preparing to Restore the Database to a New Host

1.记录源数据库的DBID,主要是为了验证复制出来的数据库DBID相同;
SELECT DBID, NAME FROM v$database;
2.拷贝源数据库的pfile到新主机,因为是同一台机器,所以对参数文件修改吧ORCL都改为DUORCL;
2.1创建pfile;
create pfile from spfile;
cd $ORACLE_HOME/dbs
cp initORCL.ora initDUORCL.ora
2.2修改pfile;
mkdir -p /u01/app/oracle/admin/DUORCL/adump;
mkdir -p /u01/app/oracle/oradata/DUORCL;
mkdir -p /u01/app/oracle/fast_recovery_area/DUORCL;
sga_target=300M
pga_aggregate_target=100M
DB_FILE_NAME_CONVERT='ORCL','DUORCL'
LOG_FILE_NAME_CONVERT='ORCL','DUORCL'
3.保证备份可用,包含控制文件自动备份;
backup database plus archivelog delete input

Restoring the Database to a New Host

1.设置ORACLE_SID环境变量;
export ORACLE_SID=DUORCL;
2.启动DUORCL实例;
export ORACLE_SID=DUORCL;
startup nomount;
create spfile from pfile;
startup nomount;
3.连接到目标服务器上,不要使用catalog;
export ORACLE_SID=DUORCL;
rman target sys/ORACLE@ORCL auxiliary /
DUPLICATE TARGET DATABASE TO DUORCL;
4.出来的数据库是源数据库的克隆,可以用于测试环境

Performing Disaster Recovery

1.灾难意味着丢失了整个数据库,recovery catalog数据库,全部的控制文件,全部的在线日志文件和所有的参数文件;
2.灾难恢复包含还原和恢复目标数据库;
3.需要的最少的文件:

  • 数据文件的备份集;
  • 相应的归档日志文件;
  • 至少一份控制文件备份

4.恢复的过程:

  • 还原spfile;
  • 启动实例;
  • 还原控制文件;
  • 挂载数据库;
  • 还原数据文件;
  • 恢复数据文件;
  • 以resetlogs方式打开数据库

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广