Oracle 数据库备份方案
一、概要
数据安全对一个系统来说,尤其的重要。在我们日常工作中,不但要极力保障数据库平
稳运行,还要尽量保证数据不丢失不被破坏。但是,为了应对一些突发事件,数据库的数据
备份工作也显得尤为重要,数据备份可以保证将损失降低到最低限度,使数据库系统再次恢
复到平稳运行状态。在一个完备的应用系统设计方案中,数据库备份工作必不可少,其重要
性不言而喻。数据备份是我们系统的最后一道防线,做一份好的备份策略可以最大限度的保
证我们的数据安全。
二、备份方式介绍
数据库备份,分为物理备份和逻辑备份两种,其中物理备份又分为冷备份和热备份,如
下表:
备份方式 优点
冷备份
1、 技术实现简单,只需拷贝文件
2、 备份速度非常快
3、 高安全性
4、 可与归档结合,作数据库“最新状态”的恢
复。
5、 恢复简单,只需把文件拷回原位置即可
热备份
ipm/exp
命令
1、 可以单独备份表空间、数据文件
2、 在线备份,数据库不需要关闭
3、 可以恢复数据库到最新状态(秒级)
4、 可以提供在线恢复
5、 可以选择增量备份
1、 灵活,快速
2、 技术成本低
3、 可以按用户、表进行备份
4、 提供增量备份方式
物
理
备
份
逻
辑
备
份
缺点
1、 停止服务(停止数据库)
2、 不能提供按用户、按表进行
恢复(只能全部恢复)
3、 单独使用时,只能恢复数据
库到最近备份时间。
4、 若磁盘空间有限,只能拷贝
到磁带等其它外部存储设备
上,速度会很慢。
5、 不能提供增量备份方式
1、 技术成本相对较高
2、 若热备份不成功,所得结果
不可用于时间点的恢复
3、数据库必须是归档模式
1、 大数据量时数据库压力会比
较大
2、 只能恢复到备份时的状态
基于上表的描述,我们可以看出,热备份还是有很大优势的;逻辑备份在面对大数据操
作的时候,会对数据库造成比较大的压力,并且不提供恢复数据库到最新状态;冷备份虽然
比较安全、快速,但是需要停机进行维护,这些都是我们不能接受的。
因此,本文档采用热备份+归档日志的方式进行设计。
三、备份前的工作
采用热备份进行数据库备份,数据库必须处于归档模式,下面是数据库更改归档模式已
经确认的方法,如下:
1、确认数据库的归档方式
SQL>archive log list;
使用上面命令可以查看当前数据库的归档模式,如果返回如下内容的话,则表示当
前数据库为非归档模式,需要修改为归档模式:
Database log mode
Automatic archival
Archive destination
Oldest online log sequence
Current log sequence
No Archive Mode
Disabled
USE_DB_RECOVERY_FILE_DEST
12
13
2、归档目录
归档功能要求必须提供一个目录存放归档文件,为了方便管理,最好提供一个共享存储
来存放归档日志,两个节点目录名一致,要求如下:
归档目录
归档目录大小
/archlog
1Tb
3、更改数据库相关参数
打开归档功能前需要先设置几个相关参数,如下:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/archlog' SCOPE=SPFILE SID='*';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=SPFILE SID='*';
修改完数据库参数之后,可以通过 spfile 导出 pfile 查看参数设置是否正确:
SQL>create pfile=’/home/oracle/p1.ora’ from spfile;
$grep log_archive /home/oracle/p1.ora
--根据 spfile 创建 pfile 文件
--查看参数设置是否正确
检查完参数设置之后,将数据库关闭:
在所有节点杀掉 Oracle Session 进程
$ps –ef|grep LOCAL=YES|grep –v grep|awk ‘{print $2}’|xargs kill -9
在所有节点 sqlplus 中切换几次在线日志:
SQL>alter system switch logfile;
SQL>/
关闭数据库:
$srvctl stop database –d UPAY
4、修改数据库为归档模式并打开数据库
下面步骤在一个节点操作:
打开数据库为 mount 状态:
$sqlplus / as sysdba
SQL>startup mount
修改数据库为归档模式,打开数据库(所有节点)
SQL>alter database archivelog;
SQL>alter databae open;
检查归档是否设置成功:
SQL>archive log list;
另外,可以通过切换日志,然后查看归档目录是否生成归档日志来确认归档设置成功:
SQL> alter system switch logfile;
SQL>exit
$cd /archlog
$ls -l
四、备份数据库
1.备份数据库策略
这里我们通过 RMAN 对数据库进行备份,采用 level0+1+2 的方式进行全量、增量备份。
方案如下:
方案一:
备份时间
周日晚上 0 点
周一晚上 0 点
周二晚上 0 点
周三晚上 0 点
周四晚上 0 点
周五晚上 0 点
Level 1
Level 2
Level 1
Level 2
Level 1
周六晚上 0 点
Level 2
备份级别 恢复时需要恢复的文件
Level 0
上周日的 Level 0 备份 + 周五的 Level 1 备份+ 周六的 Level2 备
份+ 当天的归档日志
周日的 Level 0 备份 + 当天的归档日志
周日的 Level 0 备份 + 周一的 Level 1 备份 + 当天的归档日志
周日的 Level 0 备份 + 周一的 Level 1 备份+ 周二的 Level2 备份+
当天的归档日志
周日的 Level 0 备份 + 周三的 Level 1 备份+ 当天的归档日志
周日的 Level 0 备份 + 周三的 Level 1 备份+ 周四的 Level2 备份+
当天的归档日志
周日的 Level 0 备份 + 周五的 Level 1 备份+ 当天的归档日志
方案二:
备份时间
周日晚上 0 点
周一晚上 0 点
周二晚上 0 点
周三晚上 0 点
周四晚上 0 点
周五晚上 0 点
周六晚上 0 点
备份级别 恢复时需要恢复的文件
Level 0
Level 1
Level 1
Level 1
Level 1
Level 1
Level 1
上周日的 Level 0 备份 + 周六的 Level1 备份+ 当天的归档日志
周日的 Level 0 备份 + 当天的归档日志
周日的 Level 0 备份 + 周一的 Level 1 备份 + 当天的归档日志
周日的 Level 0 备份 + 周二的 Level 1 备份 + 当天的归档日志
周日的 Level 0 备份 + 周三的 Level 1 备份 + 当天的归档日志
周日的 Level 0 备份 + 周四的 Level 1 备份 + 当天的归档日志
周日的 Level 0 备份 + 周五的 Level 1 备份 + 当天的归档日志
方案一每次恢复最多需要恢复三个文件 + 当天的归档日志,方案二每次恢复最多需要
恢复两个文件 + 当天的归档日志,但是方案二占用空间稍大于方案一,两个方案均使用
incremental 方式进行备份。
Oracle 数据文件 (4 亿+天猫查询的量大约是充值交易的三分之一 1.3 亿笔 )* 3K(包含
索引文件)= 1516G。
每周日产生的数据库备份约 1.5T,每天产生的新数据约为 50G,周一到周六增量备份约
占用空间为 300G,一周的备份文件加上一周内产生的归档数据约为 2.1T。带库保存一个月
的数据,约占空间 8.5T。
rman 在开始做备份之前,删除前一天的备份数据;做完备份以后,由 TS3310 带库客户
端写入磁带服务器。
2.备份数据库脚本
Level 0 备份脚本:
RMAN> run {
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/Ctl_%F';
CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
allocate channel c1 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c2 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
backup incremental level=0 as compressed backupset database;
delete noprompt expired backup;
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt obsolete;
}
Level 1 备份脚本:
RMAN> run {
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/Ctl_%F';
CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
allocate channel c1 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c2 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
backup incremental level=1 as compressed backupset database;
delete noprompt expired backup;
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt obsolete;
}
Level 2 备份脚本:
RMAN> run {
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/Ctl_%F';
CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
allocate channel c1 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c2 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
allocate channel c4 device type disk format '/backup/upay/upay-%d_%T_set%s_piece%p_%c.bak';
backup incremental level=2 as compressed backupset database;
delete noprompt expired backup;
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt obsolete;
}
数据库通过 RMAN 将数据备份写到本地磁盘,然后通过 IBM 客户端将备份数据写入磁带机。
五、备份归档日志
归档日志数据库直接写在本地磁盘系统,由 IBM 磁带机客户端直接读取写入磁带服务器。
归档目录:/archlog
归档日志写入策略:
1. 没半个小时检查是否有新归档生成,备份所有的最近半个小时的归档日志文件。
2. 当归档目录使用率超过 50%的时候,备份新生成的归档日志文件。
3. 本地保存最近一个星期的归档日志,每天凌晨删除一周前的归档日志。
4. 当归档日志目录使用率超过 80%的时候,删除最前面的归档日志,保证有空间可以完成
新的归档日志存放。
六、数据库的恢复
数据库恢复情况很多,下面只简单列出几种简单的场景,如下:
1. 恢复控制文件
RMAN>restore controlfile from autobackup
2. 恢复 spfile
RMAN>restore spfile from autobackup
3. 恢复表空间
RMAN> run{
2> sql 'alter tablespace tbs1 offline immediate';
3> set newname for datafile 6 to '+DATA/upay/datafile/tbs01.dbf';
4> restore tablespace tbs1;
5> switch datafile all;
6> recover tablespace tbs1;
7> sql 'alter tablespace tbs1 online';}
4. 恢复数据文件
RMAN> run{
2> sql 'alter database datafile 6 offline immediate';
3> set newname for datafile 6 to '+DATA/upay/datafile/tbs01.dbf';
4> restore datafile 6;
5> switch datafile all;
6> recover datafile 6;
7> sql 'alter databaes datafile 6 online';}
5. 恢复数据库
RMAN> connect target /
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;