手工备份与恢复
手工备份与恢复
官方文档入口:
Backup and Recovery User's Guide ---> Part VIII Performing User-Managed Backup and Recovery
1 相关命令
- 备份和还原都使用OS命令,如linux中的拷贝命令:cp
- 恢复用sqlplus命令:recover
2 备份前进行检查
冷备考虑两种文件:数据文件和控制文件
2.1 检查需要备份的数据文件
select name from v$datafile;
2.2 检查要备份的控制文件
select name from v$controlfile;
2.3 在线redo日志不需要做备份(需注意)
注意:如果是shutdown immediate干净关闭数据库,可以不备份online redo log,可以在需要的时候重新创建。但是如果在备份前由于某些错误造成实例异常终止,那么如果备份中没有包括联机重做日志文件,会在restore还原数据库后无法打开数据库,因为不能执行必需的recover恢复
重建所有日志文件组命令:
alter database clear logfile group n;
2.3.1日志组状态
在任何给定时间,重做日志组的状态都会是以下值之一
CURRENT:LGWR进程当前正在向重做日志组写入重做数据
ACTIVE:不再向重做日志组写入数据,但是仍需要它来恢复实例
INACTIVE:不再向重做日志组写入数据,且不再需要它来恢复实例
2.3.2丢失日志组后的恢复
select member from v$logfile;
建议把联机日志文件也一起备份
2.4 dbv检查坏块
在手工备份前,可以使用dbv命令检查datafile是否有坏块,备份完后对备份也要做检查
对某个datafile做坏块检查
3 手工冷备的注意事项
1)必须干净的关闭数据库,以保证数据一致性
shutdwon immediate;
2)在OS下必须备份所有数据文件
3)在OS下必须备份控制文件(至少备份一个)
4)非归档备份还原策略
恢复时还原所有备份,重建所有在线日志,没有recover步骤
startup mount alter database clear logfile group n; --n为所有在线日志组 alter database open;
4 手工冷备数据库(一致性备份)
4.1 创建目录、赋予权限
mkdir -p /u01/backup/orcl/cold ls -ld /u01/backup/orcl/cold/
4.2 正常关库
shutdown immediate;
4.3 cp 数据文件、控制文件、(日志文件)
cd /u01/app/oracle/oradata/ORCL/ ll cp * /u01/backup/orcl/cold ll /u01/backup/orcl/cold
4.4 开库
startup
4.5 临时文件不需做备份
即使临时文件受损,也总能够重新创建而不丢失数据
select name from v$tempfile;
5 手工热备的注意事项
5.1 热备必须是归档模式
archive log list
NOARCHIVE模式下不支持热备
5.2 在备份前要进入热备模式,备份后要结束热备模式
执行begin backup设置备份模式(在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn为起点)
- 对整个数据库设置热备模式:
alter database begin backup;
- 对整个数据库结束热备模式:
alter database end backup;
- 对单个表空间设置热备模式:
alter tablespace users begin backup;
- 对单个表空间结束热备模式:
alter tablespace users end backup;
注意:
- 对只读的表空间不能做热备份
- 临时表空间不需要备份
select tablespace_name,status from dba_tablespaces;
6 热备表空间(非一致性备份)
6.1 创建目录、赋予权限
mkdir -p /u01/backup/orcl/hot ls -ld /u01/backup/orcl/hot
6.2 进入热备模式(database/tablespace)
alter tablespace users begin backup;
select file#,name,checkpoint_change# from v$datafile_header;
在备份期间,scn被冻结,它是恢复阶段运用日志的起点
select * from v$backup;
STATUS是ACTIVE,表示可以cp命令备份相应的数据文件
6.3 转储(cp)文件
cp /u01/app/oracle/oradata/ORCL/users01.dbf /u01/backup/orcl/hot/ ll /u01/backup/orcl/hot/
6.4 结束热备模式
alter tablespace users end backup; select file#,name,checkpoint_change# from v$datafile_header; select * from v$backup;
备份完毕,尽快执行end backup,如果在执行end backup命令之前发生数据库abort,那么可以在下次启动到mount时end backup,从而完成实例恢复
7 查看数据库热备模式
alter database begin backup; select * from v$backup;
此时可以对所有数据文件进行cp热备。当表空间处于备份模式时,所有针对表空间中对象的DML产生的redo会显著增加
alter database end backup; select * from v$backup;
8 块分裂问题split block
一个Oracle block一般包含多个os block (dbca默认8KB,linux 默认1KB),当手工热备时,OS的cp单位不是Oracle block而是 OS block。热备过程中,Oracle的DBWR又可能不时的从内存中刷新Oracle block(脏块)到磁盘上,如此,OS级的拷贝便可能造成:一个Oracle Block是由不同的版本组成,比如未被DBWR刷新Header block加上另一部分被刷新的foot block,这样cp出来的Oracle blcok就是split block
数据库的一致性是不允许oracle block是split的,Oracle采取的办法是:在 begin backup后,冻结数据文件头,对数据文件设置检查点并且调整redo生成算法。正常运行过程中,redo记录应用到oracle block的最小变更向量;begin backup热备模式下,如果发现首次DBWR要写脏块,则将该块被刷新之前整个块的镜像数据记录到redo buffer。这样,虽然 cp后的备份文件里仍然含有split block,而当需要利用备份进行恢复时,日志会前滚该块的前镜像,以保证所有被恢复的oracle block最终是一个完整的版本
当表空间处于备份模式时,所有针对表空间中对象的DML产生的redo会显著增加。这就是我们常常发现在热备时日志文件会急剧增大的原因。为了降低维护额外的重做数据带来的开销,Oracle建议一次将一个表空间置于备份模式,同时复制其数据文件。RMAN可以设法处理此问题。如果读取的块是破碎的,则将不停地重复读取该块,直到该块一致为止
9 手工冷热备脚本
cd /u01/backup/orcl/
ll
9.1 手工冷备脚本
vi /u01/backup/orcl/cold.sql
添加脚本:
set echo off trimspool off heading off feedback off verify off time off set pagesize 0 linesize 200 define bakdir='/u01/backup/orcl/cold' define bakscp='/u01/backup/orcl/coldbak.sql' spool &bakscp select 'host cp '||name||' &bakdir ' from v$datafile order by 1; select 'host cp '||name||' &bakdir ' from v$controlfile order by 1; spool off shutdown immediate @&bakscp startup
9.2 手工热备脚本
vi /u01/backup/orcl/hot.sql
添加脚本:
set echo off trimspool off heading off feedback off verify off time off set pagesize 0 linesize 200 define bakdir='/u01/backup/orcl/hot' define bakscp='/u01/backup/orcl/hotbak.sql' set serveroutput on spool &bakscp declare cursor cu_tablespace is select tablespace_name from dba_tablespaces where contents not like 'TEMP%' and status='ONLINE'; cursor cu_datafile(name varchar2) is select file_name from dba_data_files where tablespace_name=name; begin dbms_output.put_line('alter system switch logfile;'); for i in cu_tablespace loop dbms_output.put_line('alter tablespace '||i.tablespace_name||' begin backup;'); for j in cu_datafile(i.tablespace_name) loop dbms_output.put_line('host cp '||j.file_name||' &bakdir '); end loop; dbms_output.put_line('alter tablespace '||i.tablespace_name||' end backup;'); end loop; dbms_output.put_line('alter database backup controlfile to trace;'); dbms_output.put_line('alter database backup controlfile to ''&bakdir/control01.ctl'' reuse;'); dbms_output.put_line('alter system switch logfile;'); end; / spool off @&bakscp
9.3 执行冷热备脚本测试
@/u01/backup/orcl/cold.sql @/u01/backup/orcl/hot.sql
冷备:
热备: