ORACLE数据库的备份恢复(6)

来源:互联网 发布:了不起的盖茨比知乎 编辑:程序博客网 时间:2024/06/16 02:48
RMAN恢复
和手动管理的恢复一样,RMAN的恢复有完全恢复和不完全恢复,本节内容主要是如何使用RMAN完成完全恢复和不完全恢复。
RMAN的恢复操作比手动的恢复要简单的多,这是因为RMAN在备份期间自动记录了很多备份信息。

RMAN 在还原和恢复操作中的用法
使用RMAN 执行还原和数据文件介质恢复,RMAN 自动执行还原文件的过程。发出RESTORE 命令后,RMAN 将使用服务器会话还原正确的备份和副本。
RMAN 资料档案库用于选择最完整的可用备份集或映像副本来进行还原。缺省情况下,如果某一文件已处于正确位置且其文件头包含有正确的信息,则RMAN 将不还原该文件。
而在Oracle9i 以前的版本中,将始终还原该文件。发出RMAN RECOVER 命令后,RMAN 将应用联机重做日志文件和归档重做日志文件中的更改,或使用增量备份来恢复已还原的文件。
使用RMAN 可以在以下级别执行恢复数据库,表空间,数据文件。在完全恢复过程中,归档重做日志文件和联机重做日志文件中的所有重做条目都将用于恢复数据库。
损坏的文件将从备份进行还原,而日志文件则用于将数据文件更新到当前时间点。

ARCHIVELOG 模式下执行完全恢复
使用RMAN 还原ARCHIVELOG 模式下的数据库。在该示例中,使用RMAN 来还原并恢复整个数据库。该示例假定:磁盘上有使用RMAN 生成的完全备份。当前控制文件未损坏,无需还原。所有数据文件都已损坏或丢失。
rman target /
RMAN> STARTUP MOUNT
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

将数据文件还原到其它位置
如果遇到介质故障,如磁盘驱动器丢失,则可能需要将数据文件还原到新位置。可以如下面这么操作:
1. 连接到RMAN。
rman target
2. 装载数据库。
RMAN> STARTUP MOUNT
3. 使用RMAN 将数据文件还原到新位置并在控制文件中记录更改。
run{
set newname for datafile 1 to ‘/<newdir>/system01.dbf’;
restore database;
switch datafile all;
recover database;
alter database open; }

使用RMAN恢复表空间和重新定位表空间
使用RMAN 恢复表空间,如果已确定需要还原和恢复USERS 表空间,则可发出下面的RMAN 命令:
run{
sql “alter tablespace users offline immediate”;
restore tablespace users;
recover tablespace users;
sql “alter tablespace users online”;使用RMAN恢复表空间和重新定位表空间
使用RMAN 恢复表空间,如果已确定需要还原和恢复USERS 表空间,则可发出下面的RMAN 命令:
run{
sql “alter tablespace users offline immediate”;
restore tablespace users;
recover tablespace users;
sql “alter tablespace users online”;}

使用RMAN 重新定位表空间,如果由于磁盘故障而无法访问某一数据文件,则需要将其还原到一个新位置或切换到现有的映像副本。
如果由于某个驱动器的磁盘空间不足,或需要重新组织数据库来提高性能,因而您需要重新定位表空间,上述过程也非常有用。下面看一个例子:
当前,u03 已经损坏,但数据库仍然打开。有时用户会抱怨无法访问编号为3 的数据文件中的信息。按照以下过程操作可将该数据文件还原到一个新位置:
1. 使用以下命令检查u03 上数据文件的位置和大小:
SQL> SELECT file#, name, bytes FROM v$datafile;
FILE# NAME BYTES
----- ------------------------ ----------
1 /ORADATA/u01/system01.dbf 120586240
2 /ORADATA/u02/undotbs.dbf 31457280
3 /ORADATA/u03/users01.dbf 5242880
...
确定u04 上是否有足够的空间来容纳数据文件3。
2. 确保文件(如果需要,则为表空间)处于脱机状态,以便可以使用RESTORE 命令成
功还原。
3. 因为文件已复制到一个新位置(使用SET NEWNAME 命令),所以必须使用SWITCH
命令通知Oracle 服务器新的文件位置,以使该文件成为当前文件。
4. 使用RECOVER 命令开始将增量备份、累积备份、归档重做日志文件和联机重做日志
的组合应用于已还原的文件,以便使数据库同步。
5. 完成恢复后,使数据文件联机。通知用户数据库可以使用,需要重新输入系统发生故
障前未提交的所有数据。
可以使用以下命令:
RUN{
SQL “alter tablespace users offline immediate”;
SET NEWNAME FOR datafile ‘/ORADATA/u03/users01.dbf’
to ‘/ORADATA/u04/users01.dbf’; #Specify where to restore the file
RESTORE (tablespace users); #Restore the datafile
SWITCH datafile 3;#Update the control file and recovery catalog
RECOVER TABLESPACE users; #Recover the tablespace
SQL “alter tablespace tbs1 online”;}

RMAN不完全恢复
使用RMAN进行不完全恢复的过程,与手动的不完全恢复基本是一样的,只是不用再手动的查找备份文件在哪里,只需一条restore命令,RMAN会自动的根据记录的备份信息,查找应该到哪里寻找恢复用的备份片。

使用RMAN进行不完全恢复的过程
1. 装载数据库。
2. 为并行化分配多个通道。
3. 还原所有数据文件。
4. 使用UNTIL TIME、UNTIL SEQUENCE 或UNTIL SCN恢复数据库。
5. 使用RESETLOGS 打开数据库。
6. 执行整体数据库备份。
不完全恢复的还原和恢复进程的步骤和语法与完全恢复相同,只是需要从过去的备份中还原所有数据文件。
目标数据库必须处于已装载的状态。要还原的文件必须处于脱机状态。只有在备份是通过RMAN 生成或注册的情况下,才能使用RMAN 进行还原。

使用UNTIL TIME 进行不完全数据库恢复
使用UNTIL TIME 进行RMAN 不完全恢复的示例,在2000 年12 月9 日星期二夜间12 点,确定EMPLOYEES 表被删除后,立即关闭数据库并开始恢复。
已知故障发生的大概时间,并且上午11 点44 分以来没有更改过数据库结构。在此情况下,可以使用UNTIL TIME 方法:
1. 如果目标数据库已打开,则彻底关闭它。
2. 装载目标数据库。不要在恢复期间备份数据库。
3. 确保NLS_LANG 和NLS_DATE_FORMAT 环境变量已正确设置:
$NLS_LANG=american
$NLS_DATE_FORMAT=’YYYY-MM-DD:HH24:MI:SS’
4. 启动恢复管理器并连接至目标数据库。
$rman target rman/rman@DB00
5. 可分配多个通道以改善性能:
RMAN> run {allocate channel c1 type DISK;
allocate channel c2 type DISK;
6. 指定使用RMAN 命令从备份恢复和还原所有数据文件的时间。RMAN 根据SET
UNTIL 命令选择正确的文件:
RMAN> ... set until time = ‘2000-12-09:11:44:00’;
RMAN> ... restore database;
注:如果需要将归档重做日志文件还原到新位置,则可使用RMAN SET
ARCHIVELOG DESTINATION TO <location> 命令。
7. 将数据库恢复到SET UNTIL 命令中指定的时间:
RMAN> ... recover database;
8. 使用RESETLOGS 选项打开数据库:
RMAN> ... alter database open resetlogs; }
9. 确认表存在,然后执行备份。
10. 通知用户数据库可以使用,需要重新输入系统发生故障前未提交的所有数据。
11. 如果使用恢复目录,则注册数据库的新复本:

使用UNTIL SEQUENCE 进行不完全数据库恢复
使用UNTIL SEQUENCE 进行RMAN 不完全恢复的示例,UNTIL SEQUENCE 子句指定重做日志序列号和线程号的上限。
RMAN 对日志序列号小于指定日志序列号的文件执行操作。以上示例假定日志序列号120 由于磁盘损坏而丢失,需要使用可用的归档重做日志恢复数据库。
RMAN> RUN {
2> SET UNTIL SEQUENCE 120 THREAD 1;
3> ALTER DATABASE MOUNT;
4> RESTORE DATABASE;
5> RECOVER DATABASE; # recovers through log 119
6> ALTER DATABASE OPEN RESESTLOGS;
7> }

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
备份恢复示例
非归档模式下的备份与恢复
非归档模式下的备份以冷备为主,可以适当采用RMAN的增量备份恢复。总的来说,除非有其他方法可以保证数据的安全,或者数据的安全性并不是非常重要,不要使用非归档模式。
备份方案:采用OS冷备份
1.连接数据库并创建测试表
SQL*Plus: Release 10.2.0.3.0 - Production on Tue May 6 13:46:32 2003
(c) Copyright 1999 Oracle Corporation. All rights reserved.
SQL> connect internal/password as sysdba;
Connected.
SQL> create table test(a int);
Table created
SQL> insert into test values(1);
1 row inserted
SQL> commit;
Commit complete
2.备份数据库
SQL> @coldbak.sql 或在DOS下svrmgrl @coldbak.sql
3.再插入记录
SQL> insert into test values(2);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from test;
4.关闭数据库
SQL> shutdown immediate;
5.毁坏一个或多个数据文件,如删除user01.dbf
C:\>del D:\ORACLE\ORADATA\TEST\USERS01.DBF
6.重新启动数据库,会发现错误
SQL> startup
在报警文件中,会有更详细的信息
7.拷贝备份复原到原来位置(restore过程)
C:\>xcopy d:\database\*.* d:\oracle\oradata\test/H/R/S
8.打开数据库,检查数据
SQL> alter database open;
Database altered.
SQL> select * from test;
这里可以发现,数据库恢复成功,但在备份之后与崩溃之前的数据丢失了。
说明:
1、非归档模式下的恢复方案可选性很小,一般情况下只能有一种恢复方式,就是数据库的冷备份的完全恢复,仅仅需要拷贝原来的备份就可以(restore),不需要recover。
2、这种情况下的恢复,可以完全恢复到备份的点上,但是可能是丢失数据的,在备份之后与崩溃之前的数据将全部丢失。
3、不管毁坏了多少数据文件或是联机日志或是控制文件,都可以通过这个办法恢复,因为这个恢复过程是Restore所有的冷备份文件,
而这个备份点上的所有文件是一致的,与最新的数据库没有关系,就好比把数据库又放到了一个以前的“点”上。
4、对于非归档模式下,最好的办法就是采用OS的冷备份,建议不要用RMAN来作冷备份,效果不好,因为RMAN不备份联机日志,restore不能根本解决问题。
5、如果没有备份联机日志,如RMAN的备份,就需要利用不完全恢复(until cancel)的方法来重新创建联机日志文件。

归档模式下丢失或损坏数据文件
OS备份方案
在归档方式下损坏或丢失一个数据文件,如果存在相应的备份与该备份以来的归档日志,恢复还是比较简单的,可以作到尽量少的Down机时间,并能作到数据库的完全恢复。
1、连接数据库,创建测试表并插入记录
SQL> create table test(a int) tablespace users;
SQL> insert into test values(1);
SQL> commit;
2、备份数据库
SQL> @hotbak.sql 或在DOS下svrmgrl @hotbak.sql
3、继续在测试表中插入记录
SQL> insert into test values(2);
SQL> commit;
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
4、关闭数据库,模拟丢失数据文件
SQL> shutdown immediate;
5、启动数据库错误,脱机该数据文件
SQL> startup
还可以查看报警文件(见上一个恢复案例)或动态视图v$recover_file
如SQL> select * from v$recover_file;
脱机数据文件
SQL> alter database datafile 3 offline drop;
6、打开数据库,拷贝备份回来(restore),恢复(recover)该数据文件,并联机
SQL> alter database open;
拷贝备份从备份处
copy d:\databak\ users01.dbf d:\oracle\oradata\test;
恢复该数据文件
SQL> recover datafile 3;
Log applied.
Media recovery complete.
恢复成功,联机该数据文件
SQL> alter database datafile 3 online;
7、检查数据库的数据(完全恢复)
SQL> select * from test;
说明:
1、采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失。
2、可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率)
3、如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法。
4、如果是系统表空间的损坏,不能采用此方法

RMAN备份方案
RMAN也可以进行联机备份,而且备份与恢复方法将比OS备份更简单可靠。
1、连接数据库,创建测试表并插入记录
SQL> create table test(a int) tablespace users;
SQL> insert into test values(1);
SQL> commit;
2、备份数据库表空间users
RMAN> run{
2> allocate channel c1 type disk;
3> backup tag 'tsuser' format 'd:\backup\tsuser_%u_%s_%p'
4> tablespace users;
5> release channel c1;
6> }
3、继续在测试表中插入记录
SQL> insert into test values(2);
1 row inserted
SQL> commit;
SQL> alter system switch logfile;
4、关闭数据库,模拟丢失数据文件
SQL> shutdown immediate;
5、启动数据库,检查错误
SQL> startup
6、先打开数据库
SQL> alter database datafile 3 offline drop;
SQL> alter database open;
7、恢复该表空间
恢复脚本可以是恢复单个数据文件
run{
allocate channel c1 type disk;
restore datafile 3;
recover datafile 3;
sql 'alter database datafile 3 online';
release channel c1;
}
也可以是,恢复表空间
run{
allocate channel c1 type disk;
restore tablespace users;
recover tablespace users;
sql 'alter database datafile 3 online';
release channel c1;
}
8、检查数据是否完整
SQL> alter database open;
SQL> select * from test;
说明:
1、RMAN也可以实现单个表空间或数据文件的恢复,恢复过程可以在mount下或open方式下,如果在open方式下恢复,可以减少down机时间。
2、如果损坏的是一个数据文件,建议offline并在open方式下恢复。
3、这里可以看到,RMAN进行数据文件与表空间恢复的时候,代码都比较简单,而且能保证备份与恢复的可靠性,所以建议采用RMAN的备份与恢复。

丢失多个数据文件,实现整个数据库的恢复
OS备份方案
OS备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复
1、连接数据库,创建测试表并插入记录
SQL> create table test(a int) tablespace users;
SQL> insert into test values(1);
SQL> commit;
2、备份数据库,备份除临时数据文件后的所数据文件
SQL> @hotbak.sql 或在DOS下svrmgrl @hotbak.sql
3、继续在测试表中插入记录
SQL> insert into test values(2);
SQL> commit;
SQL> alter system switch logfile;
4、关闭数据库,模拟丢失数据文件
SQL> shutdown immediate;
5、启动数据库,检查错误
SQL> STARTUP
详细信息可以查看报警文件
通过查询v$recover_file可以看到
6、拷贝备份回到原地点(restore),开始恢复数据库(recover)
Recover过程:
SQL> recover database;
7、打开数据库,检查数据库的数据(完全恢复)
SQL> alter database open;
Database altered.
SQL> select * from test;
说明:
1、只要有备份与归档存在,就可以实现数据库的完全恢复(不丢失数据)
2、适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复
3、恢复过程在mount下进行,如果恢复成功,再打开数据库,down机时间可能比较长一些。

RMAN备份方案
RMAN备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复
1、连接数据库,创建测试表并插入记录
SQL> create table test(a int) tablespace users;
SQL> insert into test values(1);
SQL> commit;
2、备份数据库
11> run{
12> allocate channel c1 type disk;
13> backup full tag 'dbfull' format 'd:\backup\full%u_%s_%p' database
14> include current controlfile;
15> sql 'alter system archive log current';
16> release channel c1;
17> }
3、继续在测试表中插入记录
SQL> insert into test values(2);
1 row inserted
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
4、关闭数据库,模拟丢失数据文件
5、启动数据库,检查错误
6、利用RMAN进行恢复
RMAN> run{
2> allocate channel c1 type disk;
3> restore database;
4> recover database;
5> sql 'alter database open';
6> release channel c1;
7> }
7、检查数据库的数据(完全恢复)
SQL> select * from test;
说明:
1、只要有备份与归档存在,RMAN也可以实现数据库的完全恢复(不丢失数据)
2、同OS备份数据库恢复,适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复
3、目标数据库在mount下进行,如果恢复成功,再打开数据库。
4、RMAN的备份与恢复命令相对比较简单并可靠,建议有条件的话,都采用RMAN进行数据库的备份。

不完全恢复案例
不完全恢复,是应对误操作的重要的恢复手段。除误操作外,对于有些情况的介质损坏,也必须使用不完全恢复才能解决,比如当前联机重做日志损坏。
不完全恢复将会丢失部分数据,这从它的名字“不完全”上,也可以看的出来。

OS备份下的基于时间的恢复
不完全恢复可以分为基于时间的恢复,基于改变的恢复与基于撤消的恢复,这里已基于时间的恢复为例子来说明不完全恢复过程。
基于时间的恢复可以不完全恢复到现在时间之前的某一个时间,对于某些误操作,如删除了一个数据表,可以在备用恢复环境上恢复到表的删除时间之前,然后把该表导出到正式环境,避免一个人为的错误。
1、连接数据库,创建测试表并插入记录
2、备份数据库,这里最好备份所有的数据文件,包括临时数据文件
3、删除测试表,假定删除前的时间为T1,在删除之前,便于测试,继续插入数据并应用到归档。
4、准备恢复到时间点T1,找回删除的表,先关闭数据库
SQL> shutdown immediate;
5、拷贝刚才备份的所有数据文件回来
6、启动到mount下
7、开始不完全恢复数据库到T1时间
SQL> recover database until time '2003-05-21:14:43:01';
8、打开数据库,检查数据
SQL> alter database open resetlogs;
说明:
1、不完全恢复最好备份所有的数据,冷备份亦可,因为恢复过程是从备份点往后恢复的,如果因为其中一个数据文件的时间戳(SCN)大于要恢复的时间点,那么恢复都是不可能成功的。
2、不完全恢复有三种方式,过程都一样,仅仅是recover命令有所不一样,这里用基于时间的恢复作为示例。
3、不完全恢复之后,都必须用resetlogs的方式打开数据库,建议马上再做一次全备份,因为resetlogs之后再用以前的备份恢复是很难了。
4、以上是在删除之前获得时间,但是实际应用中,很难知道删除之前的实际时间,但可以采用大致时间即可,或可以采用分析日志文件(logmnr),取得精确的需要恢复的时间。
5、一般都是在测试机后备用机器上采用这种不完全恢复,恢复之后导出/导入被误删的表回生产系统

RMAN备份下的基于改变的恢复
以上用OS备份说明了一个基于时间的恢复,现在用RMAN说明一个基于改变的恢复
1、连接数据库,创建测试表并插入记录
2、备份数据库
RMAN> run{
2> allocate channel c1 type disk;
3> backup full tag 'dbfull' format 'd:\backup\full%u_%s_%p' database
4> include current controlfile;
5> sql 'alter system archive log current';
6> release channel c1;
7> }
3、删除测试表,在删除之前,便于测试,继续插入数据并应用到归档,并获取删除前的scn号。
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe;
4、准备恢复到SCN 31014,先关闭数据库,然后启动到mount下
5、开始恢复到改变点SCN 31014
RMAN> run{
2> allocate channel c1 type disk;
3> restore database;
4> recover database until scn 31014;
5> sql 'ALTER DATABASE OPEN RESETLOGS';
6> release channel c1;
7> }
6、检查数据
说明:
1、RMAN也可以实现不完全恢复,方法比OS备份恢复的方法更简单可靠
2、RMAN可以基于时间,基于改变与基于日志序列的不完全恢复,基于日志序列的恢复可以指定恢复到哪个日志序列,如
run {
allocate channel ch1 type disk;
allocate channel ch2 type 'sbt_tape';
set until logseq 1234 thread 1;
restore controlfile to '$ORACLE_HOME/dbs/cf1.f' ;
replicate controlfile from '$ORACLE_HOME/dbs/cf1.f';
alter database mount;
restore database;
recover database;
sql "ALTER DATABASE OPEN RESETLOGS";
}
3、与所有的不完全恢复一样,必须在mount下,restore所有备份数据文件,需要resetlogs
4、基于改变的恢复比基于时间的恢复更可靠,但是可能也更复杂,需要知道需要恢复到哪一个改变号(SCN),在正常生产中,获取SCN的办法其实也有很多,
如查询数据库字典表(V$archived_log or v$log_history),或分析归档与联机日志(logmnr)等。
0 0
原创粉丝点击