安装环境: Window Server 2008 R2 64bit
Oracle版本: Oracle 11g R2
实现目标
每周全量备份一次数据库,每天增量备份,最坏情况是丢失一天的数据.
备份计划
- 星期一全量备份
- 星期二增量备份
- 星期三增量备份
- 星期四增量备份
- 星期五累计备份
- 星期六增量备份
- 星期日增量备份
假设在星期日,数据库遭到意外破坏,数据库管理员可按以下步骤来恢复数据库:
- 用命令CREATE DATABASE重新生成数据库结构
- 创建一个足够大的附加回段
- 完全增量导入全量备份 (恢复数据库必须要存在一个完全增量备份)
- 累计增量导入(周五)
- 最近增量导入(周六)
Oracle设置为归档模式
- 以dba身份登录数据库
sqlplus / as sysdba
或者
sqlplus /nolog
conn /as sysdba
- 检查oracle是否处于归档模式
archive log list;
- 如果没有,执行下面步骤,将数据库转换为归档模式
--若报错已经打开,可以先执行shutdown immediate命令再执行)
startup mount;
alter database archivelog;
alter database open;
成功更改后数据库已经处于归档模式.
创建备份脚本
全量备份
备份整个数据库,是后面的基础
在D盘下创建backup文件夹(路径跟文件名可以自己随意)
- 创建文件 d:\backup\script\rman_backup_full.txt (文件跟路径可以自拟)
run{
backup incremental level 0 database format 'D:/backup/backup_%d_%T_%s';
}
- 创建文件 d:\backup\script\rman_backup_full.bat (文件跟路径可以自拟)
rman target / nocatalog CMDFILE 'd:/backup/script/rman_backup_full.txt' LOG 'd:/backup/rmanbackup_%DATE:~0,4%_%DATE:~5,2%_%DATE:~8,2%.log';
差异备份
备份上一次备份后改变的数据
- 创建文件 d:\backup\script\rman_backup_incremental.txt (文件跟路径可以自拟)
run{
backup incremental level 1 database format 'D:/backup/backup_%d_%T_%s';
}
- 创建文件 d:\backup\script\rman_backup_incremental.bat (文件跟路径可以自拟)
rman target / nocatalog CMDFILE 'd:/backup/script/rman_backup_incremental.txt' LOG 'd:/backup/rmanbackup_%DATE:~0,4%_%DATE:~5,2%_%DATE:~8,2%.log';
累计备份
备份上一次**完全备份后改变的数据
- 创建文件 d:\backup\script\rman_backup_cumulative.txt (文件跟路径可以自拟)
run{
backup incremental level 1 cumulative database format 'D:/backup/backup_%d_%T_%s';
}
- 创建文件 d:\backup\script\rman_backup_cumulative.bat (文件跟路径可以自拟)
rman target / nocatalog CMDFILE 'd:/backup/script/rman_backup_cumulative.txt' LOG 'd:/backup/rmanbackup_%DATE:~0,4%_%DATE:~5,2%_%DATE:~8,2%.log';
在控制面板->管理工具->任务计划程序 中创建基本任务将这3个bat文件根据备份计划设置每周执行即可.
PS:设置计划之前,请先执行一次全量备份.
删除前30天的备份文件:
@echo off
::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例需要Win2003/Vista/Win7系统自带的forfiles命令的支持
rem 指定待删除文件的存放路径
set SrcDir=D:\backup
rem 指定天数
set DaysAgo=30
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c echo del /f /q /a @path"
pause