冷备份与冷恢复是指发生在数据库已经正常关闭的情况下进行的备份和恢复。由于此时数据库已经关闭,通过冷备份可以将数据库的关键性文件拷贝到另外存储位置。冷备份因为只是拷贝文件,因此备份的速度非常快。在执行恢复时,只需将文件再拷贝回去就可以很容易恢复到某个时间点上。冷备份的最大缺点在于在冷备份过程中,数据库必须是关闭状态,不能提供外部的访问。
视频讲解如下:
执行Oracle的冷备份与冷恢复 |
---|
【赵渝强老师】执行Oracle的冷备份与冷恢复 |
下面将通过具体的操作示例来演示如何使用Oracle RMAN执行数据库的冷备份与冷恢复。
一、使用Oracle RMAN执行数据库的冷备份
使用RMAN执行数据库的冷备份具体的步骤如下:
(1)创建RMAN冷备份存放的目录。
mkdir -p /home/oracle/backup/rman/archive/cold
(2)执行RMAN的脚本对Oracle数据库进行冷备份。
RMAN> run{
# 关闭数据库
shutdown immediate;
# 启动数据库到mount状态
startup mount;
# 分配备份的通道
allocate channel c1 type disk format '/home/oracle/backup/rman/archive/cold/full_%d_%T_%s';
# 执行备份
backup database include current controlfile;
# 释放通道
release channel c1;
# 打开数据库
sql 'alter database open';
}
二、使用Oracle RMAN执行数据库的冷备份
下面将收到删除数据文件和控制文件来模拟数据库运行出错的情况。由于丢失了所有的数据文件和控制文件,因此在使用RMAN执行恢复的时候,需要先恢复控制文件,再恢复数据文件。
(1)确认c##scott用户下员工表中的记录数。
SQL> select count(*) from c##scott.emp;
COUNT(*)
----------
14
# 这里显示的14条数据是有备份的。
(2)往表中新插入一条记录
SQL> insert into c##scott.emp(empno,ename,sal,deptno) values(1,'Tom',1000,10);
SQL> commit;
SQL> select count(*) from c##scott.emp;
COUNT(*)
----------
15
# 新插入的第15条记录没有备份。
(3)强制关闭数据库
SQL> shutdown abort;
(4)模拟文件的丢失,删除所有的数据文件和控制文件
cd /u01/app/oracle/oradata/ORCL
rm -rf *.dbf
cd /u01/app/oracle/oradata/ORCL
rm -rf control01.ctl
cd /u01/app/oracle/fast_recovery_area/ORCL
rm -rf control02.ctl
(5)启动数据库到nomount状态,恢复控制文件。
RMAN> startup nomount
(6)执行控制文件的恢复
RMAN> restore controlfile from '/home/oracle/backup/rman/archive/cold/full_ORCL_20220327_14';
这里使用了前面的冷备份恢复控制文件。如果生成的备份集有多个,体积较小的备份集中包含了控制文件的备份。
输出的信息如下:
Starting restore at 27-MAR-22
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=47 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
Finished restore at 27-MAR-22
(8)将数据库开启到mount状态,恢复数据文件。
RMAN> alter database mount; # 将数据库启动到mount状态
RMAN> restore database; # 转储数据库文件
RMAN> recover database; # 恢复数据库
RMAN> alter database open resetlogs; # 打开数据库
使用resetlogs代表这是是一个不完全恢复,但由于当前是在归档模式下,因此可以实现数据库的完全恢复。
(9)验证c##scott用户下员工表中的记录数。
SQL> select count(*) from c##scott.emp;
输出的信息如下:
COUNT(*)
----------
15
# 员工表中的15条记录被恢复成功了。