ORACLE集中备份方案之NFS篇

    技术2025-12-25  3

     

     

    1.方案概述

    利用Linux操作系统的NFSUNIX提供磁盘空间,利用数据库的RMAN工具实施数据库的备份,备份数据集中存放于备份服务器的磁盘空间内。

     

     

    数据库服务器:dbserver0 ~ n ,数据库备份服务器10.1.251.133

    2.搭建备份服务器

    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级。每天凌晨110分开始备份。

     

     

    恢复窗口设置为7天,数据库可以恢复到七天内的任何时间点,一周以前的备份集将被标记为过期备份集;每次备份完成后检查备份集并删除过期的备份集,周日0级备份完成后会删除之前的所有备份集; 采用自动备份控制文件和、参数文件,数据库结构变化时自动将其备份;每次除备份数据文件外,还包括控制文件、参数文件以及归档日志,备份完毕后自动删除备份过的归档日志以及过期的备份集; 备份完毕后自动检查备份集的完整性,问题会反映在日志中。

     

    4.可行性测试

    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以后重起即可。

     

    5.FAQ

    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读写问题解决。

     

     

     

     

     

    最新回复(0)