利用Linux操作系统的NFS为UNIX提供磁盘空间,利用数据库的RMAN工具实施数据库的备份,备份数据集中存放于备份服务器的磁盘空间内。
数据库服务器:dbserver0 ~ n ,数据库备份服务器10.1.251.133
1、 备份服务器提供的磁盘空间
Ø 备份服务器通过本地的磁盘提供给数据库备份的磁盘空间;
Ø 磁盘空间上创建ext3文件系统;
Ø 通过NFS系统将文件系统提供给UNIX数据库服务器;
Ø 通过SMB系统将文件系统提供给Windows数据库服务器。
Ø 建议配置稳定高速的磁盘系统,具有单独的磁盘子系统更好。
2、备份服务器的目录结构
对于每个要备份的数据库服务器,我们在备份服务器上创建相应的目录
3、每个数据库的目录结构
4、在备份服务器上创建备份管理用户
• 在NFS服务器上创建用户orabackup和组orabackup。
• 例如
– 用户:orabackup [uid = 501]
– 组:orabackup [gid = 502]
• 将/data下面的所有目录由orabackup管理
# cd /data
# chown –R orabackup.orabackup *
5、配置NFS
Ø NFS – Network File System
Ø NFS允许一个主机系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件;
Ø UNIX/Linux系统都支持的文件共享访问标准;
Ø 该方案就是利用NFS系统将UNIX/Linux上的Oracle数据库的备份集中化管理。
创建/orabackup目录 并授予权限772
打开/etc/exports文件增加内容为:/orabacku p10.1.252.152(rw,sync,all_squash,anonsid=501,anongid=502)
启动/etc/init.d/portmap restart
启动/etc/init.d/nfs restart
查看是否启动成功:netstat -ultn
* portmap 啟動的 port 在 111;
* NFS 啟動的 port 在 2049;
* 其他 rpc.daemons 啟動的 port 則是隨機產生的,因此需向 port 111 註冊。
客户端设置
启动/etc/init.d/portmap restart
启动/etc/init.d/nfs restart
sudo mount -t nfs 10.1.252.20:/orabackup /home/oracle/orabackup -o rw,bg,rsize=32768,wsize=32768,hard,vers=3,nointr,timeo=600,proto=tcp
将NFS设置为开机即挂载
进入10.1.252.152 在/etc/fstab中增加
10.1.252.153:/orabackup /orabackup nfs rw,hard,nointr,tcp,noac,vers=3,timeo=600,rsize=32768,wsize=32768 0 0
3.创建RMAN备份脚本
create tablespace rman_tbs datafile '/oradata/luke/rman_tbs01.dbf' size 1024M; create user rman identified by rman default tablespace rman_tbs temporary tablespace temp; grant connect,resource ,recovery_catalog_owner to rman; rman catalog rman/rman create catalog tablespace rman_tbs; connect target sys/congqing@orcl register database; report schema; configure retention policy to redundancy 2; configure retention policy to recovery window of 7 days;
导出RMAN用户数据脚本exp_rman.par (即备份catalog库) userid=rman/rman file=/home/oracle/backup/export/rman.dmp log=/home/oracle/backup/log/rman.log 导出RMAN数据SHELL脚本exp_rman.sh #!/bin/bash cd $HOME . .bash_profile cd $HOME/backup/script exp parfile=exp_rman.par
零级备份RMAN脚本level0_backup.rcv connect catalog rman/rman connect target sys/congqing@orcl
run {
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; allocate channel d1 type disk; allocate channel d2 type disk; backup incremental level 0 database format '/home/oracle/rman_backup/level0_%d_%s_%p_%u.bak' tag='level 0' include current controlfile; sql 'alter system archive log current'; backup archivelog all format '/home/oracle/rman_backup/log_%d_%s_%p_%u.bak' delete all input; release channel d2; release channel d1; }
crosscheck backup; delete noprompt expired backup; delete noprompt obsolete; resync catalog;
零级备份SHELL脚本的level0_backup.sh #!/bin/bash cd $HOME . .bash_profile cd $HOME/backup/script rman cmdfile=level0_backup.rcv msglog=$HOME/backup/log/level0_backup.log . /home/oracle/backup/script/exp_rman.sh
一级差异增量备份RMAN脚本 level1_backup.rcv connect catalog rman/rman connect target sys/congqing@ORCL run { allocate channel d1 type disk; backup incremental level 1 format '/home/oracle/rman_backup/level1_%d_%s_%p_%u.bak' tag = 'level 1' database; sql 'alter system archive log current'; backup archivelog all format '/home/oracle/rman_backup/log_%d_%s_%p_%u.bak' delete all input; release channel d1; } crosscheck backup; delete noprompt expired backup; delete noprompt obsolete; resync catalog;
一级差异增量备份SHELL脚本level1_backup.sh
#!/bin/bash cd $HOME . .bash_profile cd /home/oracle/backup/script rman cmdfile=level1_backup.rcv msglog=$HOME/backup/log/level1.log . /home/oracle/backup/script/exp_rman.sh
二级差异增量备份RMAN脚本 level2_backup.rcv connect catalog rman/rman connect target sys/congqing@orcl run { allocate channel d1 type disk; backup incremental level 2 format '/home/oracle/rman_backup/level2_%d_%s_%p_%u.bak' tag = 'level 2' database; sql 'alter system archive log current'; backup archivelog all format '/home/oracle/rman_backup/log_%d_%s_%p_%u.bak' delete all input; release channel d1; } crosscheck backup; delete noprompt expired backup; delete noprompt obsolete; resync catalog;
二级差异增量备份SHELL脚本level2_backup.sh #!/bin/bash cd $HOME . .bash_profile cd /home/oracle/backup/script rman cmdfile=level2_backup.rcv msglog=$HOME/backup/log/level2.log . /home/oracle/backup/script/exp_rman.sh
提高 RMAN增量备份性能
alter database enable block change tracking using file '/u01/app/oracle/admin/devdb/bdump/luke.log';
desc v$block_change_tracking;
linux下定时执行备份脚本
crontab -e -u oracle SHELL=/bin/bash --以下脚本在bash下执行 MAILTO=oracle --执行日志以邮件形式邮给oracle用户,可以/var/spool/mail/oracle下查收 10 1 * * 0 /home/oracle/backup/script/level0_backup.sh 10 1 * * 1 /home/oracle/backup/script/level2_backup.sh 10 1 * * 2 /home/oracle/backup/script/level2_backup.sh 10 1 * * 3 /home/oracle/backup/script/level1_backup.sh 10 1 * * 4 /home/oracle/backup/script/level2_backup.sh 10 1 * * 5 /home/oracle/backup/script/level2_backup.sh 10 1 * * 6 /home/oracle/backup/script/level2_backup.sh
一周差异备份策略:
备份目标库和catalog库,周日0级全备,周一周二周三为2级,周四为1级,周五周六为2级。每天凌晨1点10分开始备份。
恢复窗口设置为7天,数据库可以恢复到七天内的任何时间点,一周以前的备份集将被标记为过期备份集;每次备份完成后检查备份集并删除过期的备份集,周日0级备份完成后会删除之前的所有备份集; 采用自动备份控制文件和、参数文件,数据库结构变化时自动将其备份;每次除备份数据文件外,还包括控制文件、参数文件以及归档日志,备份完毕后自动删除备份过的归档日志以及过期的备份集; 备份完毕后自动检查备份集的完整性,问题会反映在日志中。
1. 查看备份集是否可用
List backupset summary;
validate backupset 118,130,164,177;
validate backupset 118,130,164,177 check logical –模拟还原.
2. 模拟非系统表空间遭到破坏(直接删除数据文件)
先创建一个表,然后插入一条数据提交
然后删除对应的数据文件
执行alter system flush buffer_cache,再次查询该表时就会提示;
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/home/oracle/oradata/ocm/users.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
执行恢复脚本
run {
allocate channel d1 device type disk;
sql "alter database datafile 4 offline";
restore datafile 4;
recover datafile 4;
sql "alter database datafile 4 online";
}
3. 模拟undo表空间遭到破坏(直接删除UNDO数据文件)
Undo表空间不能做online offline readonly 所以在恢复时不需要执行这些语句
在恢复之前要显式通过数据库undo表空间丢失。 在sqlplus里执行命令,
Alter database datafile 2 online;
Alter database datafile 2 offline;
Run {
allocate channel d1 device type disk;
restore datafile 2;
}
Recover 可能会失败,直接在sqlplus 里面来完成,如果失败多试几次
4. 模拟system 表空间遭到破坏(直接删除系统数据文件)
5. 模拟控制文件遭到破坏(直接删除控制文件)
Startup target with nomount
Connect to catalog
Restore controlfile,recover database;
Alter database open resetlogs or noresetlogs
当模拟删除控制文件后,试图恢复时失败
玩大了,只有下面两种情况能恢复
1、设置CONFIGURE CONTROLFILE AUTOBACKUP ON; 才能恢复。
2、或者catalog 在独立的数据库上
不过可以试图通过下面这种方式重建
startup nomout;
create controlfile reuse database "ocm" noresetlogs archivelog
maxlogfiles 16
maxlogmembers 3
maxdatafiles 100
maxinstances 1
maxloghistory 292
logfile
group 1 '/home/oracle/oradata/ocm/redo01.log' size 50m,
group 2 '/home/oracle/oradata/ocm/redo02.log' size 50m,
group 3 '/home/oracle/oradata/ocm/redo03.log' size 50m
datafile
'/home/oracle/oradata/ocm/system01.dbf',
'/home/oracle/oradata/ocm/undotbs01.dbf',
'/home/oracle/oradata/ocm/sysaux01.dbf',
'/home/oracle/oradata/ocm/users.dbf',
'/home/oracle/oradata/ocm/tbs_rman01.dbf'
CHARACTER SET ZHS16GBK;
重建成功后,马上recover database 再次open即可。
如果使用的是resetlog模式,oracle 会认为当前的日志文件已经损坏,那么就意味着oracle可能丢失提交成功的数据,恢复将是一次不完全的介质恢复。 不完全恢复最终要求数据库通过resetlogs方式打开,resetlogs将会强制清空或重建在线日志文件。此时执行恢复必须使用backup controlfile选项,否则将出现错误 ORA-01610 ,使用如下命令恢复数据库:
SQL> recover database using backup controlfile until cancel;
为了防止过于复杂的恢复,建议配置RMAN配置模式为
CONFIGURE CONTROLFILE AUTOBACKUP ON;
控制文件重建以后原先的备份集不再有效,要重新全量备份数据库。
6. 模拟联机日志遭到破坏
在INIT参数文件中加入_allow_resetlogs_corruption=true以后重起即可。
1. 解决备份慢的问题
毫无疑问这是个大问题,我做过测试,例如:直播星生产环境的数据总量为10G
RMAN备份时将备份片上传到NFS服务器上,脚本里同时开了三个channel,结果4个小时只传了4G的备份片,于是我放弃了。 然后我在本地创建了一个恢复目录,用同样的脚本,结果为意外:elapsed time: 00:02:56。问题已经很明显,是NFS的问题。我在网上查了一些方法,试着在mount时增加了一些参数
mount –f nfs -o rw,hard,nointr,noac,vers=3,rsize=32768,wsize=32768 10.1.251.133:/data /data.
所有的2.4的的client都支持最大32K的传输块而默认只有4K。最笨的方法可以通过下面的方法测试NFS的读写。
time dd if=/dev/zero of=/data/dbserver0/testfile bs=16k count=65536
将读写块的大小,调到16384
[root@test_host1 backupsets]# mount -t nfs -o wsize=16384,rsize=16384 10.1.251.133:/data /data
[root@test_host1 backupsets]# time dd if=/dev/zero of=/data/dbserver0/testfile bs=16k count=65536
65536+0 records in
65536+0 records out
1073741824 bytes (1.1 GB) copied, 103.746 seconds, 10.3 MB/s
real 1m43.825s
user 0m0.101s
sys 0m1.125s
将读写块的大小,调到8192
[root@test_host1 backupsets]# mount -t nfs -o wsize=8192,rsize=8192 10.1.251.133:/data /data
time dd if=/dev/zero of=/data/dbserver0/testfile bs=16k count=65536
65536+0 records in
65536+0 records out
1073741824 bytes (1.1 GB) copied, 112.968 seconds, 9.5 MB/s
real 1m53.000s
user 0m0.079s
sys 0m1.456s
经过几次调整后,再次执行备份脚本,总共备份时间20分钟左右,NFS读写问题解决。
