数据库物理备份与恢复系列之——数据库手动热备份和恢复
数据库手动热备份和恢复
一.手动热备份原理
手动热备份是指数据库处于OPEN状态下利用操作系统命令备份数据库。
手动热备份使用begin backup命令备份数据库,只适用于备份数据文件。
手动热备份必须处于归档模式
设置begin backup的作用:
①锁定数据文件头的SCN
②告诉oracle需要在日志文件中额外存储发生改变的数据块信息
SQL> select * from v$backup; FILE# STATUS CHANGE# TIME SQL> alter database begin backup; Database altered. SQL> select * from v$backup; FILE# STATUS CHANGE# TIME ACTIVE状态表示在锁定状态 |
这时候不允许以shutdown immediate方式关闭数据库 SQL> shutdown immediate --如果使用shutdown abort关闭数据库,开启的时候会报错 Total System Global Area 1.0055E+10 bytes 解决方式一:end backup Database altered. Database altered. 解决方式二:按照提示,进行介质恢复 SQL> recover database; Database altered. SQL> select * from v$backup; FILE# STATUS CHANGE# TIME |
二.手动热备份日志产生量
数据库正在被改变,使用操作命令复制数据块的过程中,就可能产生分裂,然后造成坏块。 oracle为了避免这种情况,需要将数据库内容保存在在线日志中,所以手动热备份日志产生量比正常情况大。 Release 11.2.0.4.0 发起数据库级别的BEGIN BACKUP SQL> alter database begin backup; Database altered. 查询v$STATNAME和v$MYSTAT视图观察当前会话产生的日志量为17220字节 SQL> col name for a20; NAME VALUE 更改一个数据块中一行数据,产生的日志量为8780字节。 SQL> update scott.employee set comm=100 where empno=7844; 1 row updated. SQL> commit; Commit complete. SQL> col name for a20 NAME VALUE SQL> select 26000-17220 from dual; 26000-17220 |
正常情况下产生的日志量仅仅548字节 SQL> select * from v$backup; FILE# STATUS CHANGE# TIME SQL> col name for a20; NAME VALUE SQL> update scott.employee set comm=100 where empno=7844; 1 row updated. SQL> commit; Commit complete. SQL> col name for a20; NAME VALUE SQL> select 2196-1648 from dual; 2196-1648 总结:begin backup产生的日志量比正常情况大约多产生8K的日志量,约一个数据块的大小。 |
三.手动热备份下数据文件的恢复
当数据文件出现问题时,只要将热备份数据文件使用操作系统命令复制到原路径即可。和冷备份的区别是,热备份的数据库需要先应用归档日志,当数据文件和控制文件一致之后才能打开数据库。
热备份的数据文件内部肯定处于不一致的状态,所以开启的时候都必须应用归档日志进行media recovery。修复的起点就是v$backup.CHANGE#记录的SCN。即这里的412056
SQL> alter database begin backup;
Database altered.
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- ---------
1 ACTIVE 412056 08-DEC-16
2 ACTIVE 412056 08-DEC-16
3 ACTIVE 412056 08-DEC-16
4 ACTIVE 412056 08-DEC-16
下面演示一下恢复的过程
SQL> alter database begin backup; --置数据库为begin backup Database altered. |
|
系统cp命令拷贝数据文件到另外一个目录 oracle@test1: /DATA/ORA11G> cp users01.dbf ../ |
|
SQL> alter database end backup; --备份完成后置数据库end backup | |
这时候我们删掉数据文件 oracle@test1: /DATA/ORA11G> rm -rf users01.dbf |
|
SQL> shutdown immediate; Total System Global Area 1.0055E+10 bytes 开启的时候提示找不到数据文件 |
|
恢复我们刚才备份的数据文件到原路径 oracle@test1: /DATA/ORA11G> cp ../users01.dbf . |
|
SQL> shutdown immediate; Total System Global Area 1.0055E+10 bytes Database altered. --这样我们就恢复了数据文件 |