
1、RAC Oracle备份脚本(对nbu模板作出修改的部分已红色标识)
#!/bin/sh
# $Header: hot_database_backup.sh,v 1.2 2002/08/06 23:51:42 $
#
#bcpyrght
#***************************************************************************
#* $VRTScprght: Copyright 1993 - 2007 Symantec Corporation, All Rights Reserved $ *
#***************************************************************************
#ecpyrght
#
# ---------------------------------------------------------------------------
# hot_database_backup.sh
# ---------------------------------------------------------------------------
# This script uses Recovery Manager to take a hot (inconsistent) database
# backup. A hot backup is inconsistent because portions of the database are
# being modified and written to the disk while the backup is progressing.
# You must run your database in ARCHIVELOG mode to make hot backups. It is
# assumed that this script will be executed by user root. In order for RMAN
# to work properly we switch user (su -) to the oracle dba account before
# execution. If this script runs under a user account that has Oracle dba
# privilege, it will be executed using this user's account.
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# Determine the user which is executing this script.
# ---------------------------------------------------------------------------
CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1`
# ---------------------------------------------------------------------------
# Put output in # Note: output directory requires write permission. # --------------------------------------------------------------------------- RMAN_LOG_FILE=${0}.out # --------------------------------------------------------------------------- # You may want to delete the output file so that backup information does # not accumulate. If not, delete the following lines. # --------------------------------------------------------------------------- if [ -f "$RMAN_LOG_FILE" ] then rm -f "$RMAN_LOG_FILE" fi # ----------------------------------------------------------------- # Initialize the log file. # ----------------------------------------------------------------- echo >> $RMAN_LOG_FILE chmod 666 $RMAN_LOG_FILE # --------------------------------------------------------------------------- # Log the start of this script. # --------------------------------------------------------------------------- echo Script $0 >> $RMAN_LOG_FILE echo ==== started on `date` ==== >> $RMAN_LOG_FILE echo >> $RMAN_LOG_FILE # --------------------------------------------------------------------------- # Replace /db/oracle/product/ora81, below, with the Oracle home path. # --------------------------------------------------------------------------- ORACLE_HOME=/oracle/product/db/10.2 export ORACLE_HOME # --------------------------------------------------------------------------- # Replace ora81, below, with the Oracle SID of the target database. # --------------------------------------------------------------------------- ORACLE_SID=gzyx1 export ORACLE_SID # --------------------------------------------------------------------------- # Replace ora81, below, with the Oracle DBA user id (account). # --------------------------------------------------------------------------- ORACLE_USER=oracle # --------------------------------------------------------------------------- # Set the target connect string. # Replace "sys/manager", below, with the target connect string. # --------------------------------------------------------------------------- TARGET_CONNECT_STR=/ # --------------------------------------------------------------------------- # Set the Oracle Recovery Manager name. # --------------------------------------------------------------------------- RMAN=$ORACLE_HOME/bin/rman # --------------------------------------------------------------------------- # Print out the value of the variables set by this script. # --------------------------------------------------------------------------- echo >> $RMAN_LOG_FILE echo "RMAN: $RMAN" >> $RMAN_LOG_FILE echo "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE echo "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE echo "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE # --------------------------------------------------------------------------- # Print out the value of the variables set by bphdb. # --------------------------------------------------------------------------- echo >> $RMAN_LOG_FILE echo "NB_ORA_FULL: $NB_ORA_FULL" >> $RMAN_LOG_FILE echo "NB_ORA_INCR: $NB_ORA_INCR" >> $RMAN_LOG_FILE echo "NB_ORA_CINC: $NB_ORA_CINC" >> $RMAN_LOG_FILE echo "NB_ORA_SERV: $NB_ORA_SERV" >> $RMAN_LOG_FILE echo "NB_ORA_POLICY: $NB_ORA_POLICY" >> $RMAN_LOG_FILE # --------------------------------------------------------------------------- # NOTE: This script assumes that the database is properly opened. If desired, # this would be the place to verify that. # --------------------------------------------------------------------------- echo >> $RMAN_LOG_FILE # --------------------------------------------------------------------------- # If this script is executed from a NetBackup schedule, NetBackup # sets an NB_ORA environment variable based on the schedule type. # The NB_ORA variable is then used to dynamically set BACKUP_TYPE # For example, when: # schedule type is BACKUP_TYPE is # ---------------- -------------- # Automatic Full INCREMENTAL LEVEL=0 # Automatic Differential Incremental INCREMENTAL LEVEL=1 # Automatic Cumulative Incremental INCREMENTAL LEVEL=1 CUMULATIVE # # For user initiated backups, BACKUP_TYPE defaults to incremental # level 0 (full). To change the default for a user initiated # backup to incremental or incremental cumulative, uncomment # one of the following two lines. # BACKUP_TYPE="INCREMENTAL LEVEL=1" # BACKUP_TYPE="INCREMENTAL LEVEL=1 CUMULATIVE" # # Note that we use incremental level 0 to specify full backups. # That is because, although they are identical in content, only # the incremental level 0 backup can have incremental backups of # level > 0 applied to it. # --------------------------------------------------------------------------- if [ "$NB_ORA_FULL" = "1" ] then echo "Full backup requested" >> $RMAN_LOG_FILE BACKUP_TYPE="INCREMENTAL LEVEL=0" elif [ "$NB_ORA_INCR" = "1" ] then echo "Differential incremental backup requested" >> $RMAN_LOG_FILE BACKUP_TYPE="INCREMENTAL LEVEL=1" elif [ "$NB_ORA_CINC" = "1" ] then echo "Cumulative incremental backup requested" >> $RMAN_LOG_FILE BACKUP_TYPE="INCREMENTAL LEVEL=1 CUMULATIVE" elif [ "$BACKUP_TYPE" = "" ] then echo "Default - Full backup requested" >> $RMAN_LOG_FILE BACKUP_TYPE="INCREMENTAL LEVEL=0" fi # --------------------------------------------------------------------------- # Call Recovery Manager to initiate the backup. This example does not use a # Recovery Catalog. If you choose to use one, replace the option 'nocatalog' # from the rman command line below with the # 'rcvcat # # Note: Any environment variables needed at run time by RMAN # must be set and exported within the switch user (su) command. # --------------------------------------------------------------------------- # Backs up the whole database. This backup is part of the incremental # strategy (this means it can have incremental backups of levels > 0 # applied to it). # # We do not need to explicitly request the control file to be included # in this backup, as it is automatically included each time file 1 of # the system tablespace is backed up (the inference: as it is a whole # database backup, file 1 of the system tablespace will be backed up, # hence the controlfile will also be included automatically). # # Typically, a level 0 backup would be done at least once a week. # # The scenario assumes: # o you are backing your database up to two tape drives # o you want each backup set to include a maximum of 5 files # o you wish to include offline datafiles, and read-only tablespaces, # in the backup # o you want the backup to continue if any files are inaccessible. # o you are not using a Recovery Catalog # o you are explicitly backing up the control file. Since you are # specifying nocatalog, the controlfile backup that occurs # automatically as the result of backing up the system file is # not sufficient; it will not contain records for the backup that # is currently in progress. # o you want to archive the current log, back up all the # archive logs using two channels, putting a maximum of 20 logs # in a backup set, and deleting them once the backup is complete. # # Note that the format string is constructed to guarantee uniqueness and # to enhance NetBackup for Oracle backup and restore performance. # # # NOTE WHEN USING TNS ALIAS: When connecting to a database # using a TNS alias, you must use a send command or a parms operand to # specify environment variables. In other words, when accessing a database # through a listener, the environment variables set at the system level are not # visible when RMAN is running. For more information on the environment # variables, please refer to the NetBackup for Oracle Admin. Guide. # # --------------------------------------------------------------------------- CMD_STR=" ORACLE_HOME=$ORACLE_HOME export ORACLE_HOME ORACLE_SID=$ORACLE_SID export ORACLE_SID $RMAN target $TARGET_CONNECT_STR rcvcat rman/rman@scdbixp msglog $RMAN_LOG_FILE append << EOF RUN { ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE'; BACKUP $BACKUP_TYPE SKIP INACCESSIBLE TAG hot_db_bk_level0 FILESPERSET 5 # recommended format FORMAT 'bk_%s_%p_%t' DATABASE; sql 'alter system archive log current'; RELEASE CHANNEL ch00; RELEASE CHANNEL ch01; # backup all archive logs ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE' connect 'sys/sys@gzyx1'; ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE' connect 'sys/sys@gzyx2'; BACKUP filesperset 20 FORMAT 'al_%s_%p_%t' ARCHIVELOG ALL; delete noprompt archivelog until time 'sysdate-5'; RELEASE CHANNEL ch00; RELEASE CHANNEL ch01; # # Note: During the process of backing up the database, RMAN also backs up the # control file. This version of the control file does not contain the # information about the current backup because "nocatalog" has been specified. # To include the information about the current backup, the control file should # be backed up as the last step of the RMAN section. This step would not be # necessary if we were using a recovery catalog. # ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; BACKUP # recommended format FORMAT 'cntrl_%s_%p_%t' CURRENT CONTROLFILE; RELEASE CHANNEL ch00; } EOF " # Initiate the command string if [ "$CUSER" = "root" ] then su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE RSTAT=$? else /usr/bin/sh -c "$CMD_STR" >> $RMAN_LOG_FILE RSTAT=$? fi # --------------------------------------------------------------------------- # Log the completion of this script. # --------------------------------------------------------------------------- if [ "$RSTAT" = "0" ] then LOGMSG="ended successfully" else LOGMSG="ended in error" fi echo >> $RMAN_LOG_FILE echo Script $0 >> $RMAN_LOG_FILE echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE echo >> $RMAN_LOG_FILE exit $RSTAT 附件二、Oracle恢复测试步骤 假设已经搭建好同平台的数据库测试环境: 备份源主机名:scdbdb01 恢复目标主机名:scdbtrnsvr 备份服务器主机名:erpbackupsvr2 数据库SID:GZYX(RAC的服务名) 本次恢复是把原建立在裸设备的RAC数据恢复到异机的文件系统,具体恢复过程如下: 1、在测试主机上安装NBU备份客户端和Oracle备份代理。 2、创建一个测试用的initgzyx.ora文件。 3、开始恢复。 以下均有恢复拷屏所得(具体输入的命令语句已红色标识) # su - oracle (c)Copyright 1983-2006 Hewlett-Packard Development Company, L.P. (c)Copyright 1979, 1980, 1983, 1985-1993 The Regents of the Univ. of California (c)Copyright 1980, 1984, 1986 Novell, Inc. (c)Copyright 1986-2000 Sun Microsystems, Inc. (c)Copyright 1985, 1986, 1988 Massachusetts Institute of Technology (c)Copyright 19-1993 The Open Software Foundation, Inc. (c)Copyright 1990 Motorola, Inc. (c)Copyright 1990, 1991, 1992 Cornell University (c)Copyright 19-1991 The University of Maryland (c)Copyright 1988 Carnegie Mellon University (c)Copyright 1991-2006 Mentat Inc. (c)Copyright 1996 Morning Star Technologies, Inc. (c)Copyright 1996 Progressive Systems, Inc. Confidential computer software. Valid license from HP required for possession, use or copying. Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software Documentation, and Technical Data for Commercial Items are licensed to the U.S. Government under vendor's standard commercial license. scdbtrnsvr/oracle$sqlplus /nolog SQL*Plus: Release 10.2.0.4.0 - Production on Tue Dec 30 17:41:21 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. SQL> connect / as sysdba Connected to an idle instance. SQL> startup nomount pfile='/oracle/initgzyx.ora' ORACLE instance started. Total System Global Area 1.0737E+10 bytes Fixed Size 2073976 bytes Variable Size 1560283784 bytes Database Buffers 9160359936 bytes Redo Buffers 14700544 bytes SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options scdbtrnsvr/oracle$rman rcvcat rman/rman@scdbixp Recovery Manager: Release 10.2.0.4.0 - Production on Tue Dec 30 17:42:34 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to recovery catalog database RMAN> set dbid=3984429810 executing command: SET DBID database name is "GZYX" and DBID is 3984429810 RMAN> connect target / connected to target database: GZYX (not mounted) 恢复控制文件 RMAN> run { ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; SEND 'NB_ORA_SERV=erpbackupsvr2, NB_ORA_CLIENT=scdbdb01'; restore controlfile; } allocated channel: ch00 channel ch00: sid=11 devtype=SBT_TAPE channel ch00: Veritas NetBackup for Oracle - Release 6.5 (2007111606) sent command to channel: ch00 Starting restore at 30-DEC-08 channel ch00: starting datafile backupset restore channel ch00: restoring control file channel ch00: reading from backup piece c-3984429810-20081230-01 channel ch00: restored backup piece 1 piece handle=c-3984429810-20081230-01 tag=TAG20081230T141517 channel ch00: restore complete, elapsed time: 00:01:36 output filename=/app01/oradata/gzyx/control01.ctl output filename=/app01/oradata/gzyx/control02.ctl output filename=/app01/oradata/gzyx/control03.ctl Finished restore at 30-DEC-08 released channel: ch00 RMAN> alter database mount; database mounted RMAN> RMAN> exit Recovery Manager complete. scdbtrnsvr/oracle$orapwd file=$ORACLE_HOME/dbs/orapwgzyx password=oracle scdbtrnsvr/oracle$rman rcvcat rman/rman@scdbixp Recovery Manager: Release 10.2.0.4.0 - Production on Tue Dec 30 17:56:07 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to recovery catalog database RMAN> set dbid=3984429810 executing command: SET DBID database name is "GZYX" and DBID is 3984429810 RMAN> connect target / connected to target database: GZYX (DBID=3984429810, not open) 恢复数据文件 RMAN> run { 2> ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; 3> ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE'; 4> SEND 'NB_ORA_SERV=erpbackupsvr2, NB_ORA_CLIENT=scdbdb01'; 5> set newname for datafile 1 to '/app01/oradata/gzyx/datafile01.dbf'; 6> set newname for datafile 2 to '/app01/oradata/gzyx/datafile02.dbf'; 7> set newname for datafile 3 to '/app01/oradata/gzyx/datafile03.dbf'; 8> set newname for datafile 4 to '/app01/oradata/gzyx/datafile04.dbf'; 9> set newname for datafile 5 to '/app01/oradata/gzyx/datafile05.dbf'; 10> set newname for datafile 6 to '/app01/oradata/gzyx/datafile06.dbf'; 11> set newname for datafile 7 to '/app01/oradata/gzyx/datafile07.dbf'; 12> set newname for datafile 8 to '/app01/oradata/gzyx/datafile08.dbf'; 13> set newname for datafile 9 to '/app01/oradata/gzyx/datafile09.dbf'; 14> set newname for datafile 10 to '/app01/oradata/gzyx/datafile10.dbf'; 15> set newname for datafile 11 to '/app01/oradata/gzyx/datafile11.dbf'; 16> set newname for datafile 12 to '/app01/oradata/gzyx/datafile12.dbf'; 17> set newname for datafile 13 to '/app01/oradata/gzyx/datafile13.dbf'; 18> set newname for datafile 14 to '/app01/oradata/gzyx/datafile14.dbf'; 19> set newname for datafile 15 to '/app01/oradata/gzyx/datafile15.dbf'; 20> set newname for datafile 16 to '/app01/oradata/gzyx/datafile16.dbf'; 21> set newname for datafile 17 to '/app01/oradata/gzyx/datafile17.dbf'; 22> set newname for datafile 18 to '/app01/oradata/gzyx/datafile18.dbf'; 23> set newname for datafile 19 to '/app01/oradata/gzyx/datafile19.dbf'; 24> set newname for datafile 20 to '/app01/oradata/gzyx/datafile20.dbf'; 25> set newname for datafile 21 to '/app01/oradata/gzyx/datafile21.dbf'; 26> set newname for datafile 22 to '/app01/oradata/gzyx/datafile22.dbf'; 27> set newname for datafile 23 to '/app01/oradata/gzyx/datafile23.dbf'; 28> set newname for datafile 24 to '/app01/oradata/gzyx/datafile24.dbf'; 29> set newname for datafile 25 to '/app01/oradata/gzyx/datafile25.dbf'; 30> set newname for datafile 26 to '/app01/oradata/gzyx/datafile26.dbf'; 31> set newname for datafile 27 to '/app01/oradata/gzyx/datafile27.dbf'; 32> set newname for datafile 28 to '/app01/oradata/gzyx/datafile28.dbf'; 33> set newname for datafile 29 to '/app01/oradata/gzyx/datafile29.dbf'; 34> set newname for datafile 30 to '/app01/oradata/gzyx/datafile30.dbf'; 35> set newname for datafile 31 to '/app01/oradata/gzyx/datafile31.dbf'; 36> set newname for datafile 32 to '/app01/oradata/gzyx/datafile32.dbf'; 37> set newname for datafile 33 to '/app01/oradata/gzyx/datafile33.dbf'; 38> set newname for datafile 34 to '/app01/oradata/gzyx/datafile34.dbf'; 39> set newname for datafile 35 to '/app01/oradata/gzyx/datafile35.dbf'; 40> set newname for datafile 36 to '/app01/oradata/gzyx/datafile36.dbf'; 41> set newname for datafile 37 to '/app01/oradata/gzyx/datafile37.dbf'; 42> set newname for datafile 38 to '/app01/oradata/gzyx/datafile38.dbf'; 43> set newname for datafile 39 to '/app01/oradata/gzyx/datafile39.dbf'; 44> set newname for datafile 40 to '/app01/oradata/gzyx/datafile40.dbf'; 45> set newname for datafile 41 to '/app01/oradata/gzyx/datafile41.dbf'; 46> set newname for datafile 42 to '/app01/oradata/gzyx/datafile42.dbf'; 47> set newname for datafile 43 to '/app01/oradata/gzyx/datafile43.dbf'; 48> set newname for datafile 44 to '/app01/oradata/gzyx/datafile44.dbf'; 49> set newname for datafile 45 to '/app01/oradata/gzyx/datafile45.dbf'; 50> set newname for datafile 46 to '/app01/oradata/gzyx/datafile46.dbf'; 51> set newname for datafile 47 to '/app01/oradata/gzyx/datafile47.dbf'; 52> set newname for datafile 48 to '/app01/oradata/gzyx/datafile48.dbf'; 53> set newname for datafile 49 to '/app01/oradata/gzyx/datafile49.dbf'; 54> set newname for datafile 50 to '/app01/oradata/gzyx/datafile50.dbf'; 55> set newname for datafile 51 to '/app01/oradata/gzyx/datafile51.dbf'; 56> set newname for datafile 52 to '/app01/oradata/gzyx/datafile52.dbf'; 57> set newname for datafile 53 to '/app01/oradata/gzyx/datafile53.dbf'; 56> set newname for datafile 54 to '/app01/oradata/gzyx/datafile54.dbf'; 58> set newname for datafile 55 to '/app01/oradata/gzyx/datafile55.dbf'; 59> set newname for datafile 77 to '/app01/oradata/gzyx/datafile77.dbf'; 60> set newname for datafile 78 to '/app01/oradata/gzyx/datafile78.dbf'; 61> restore database; 62> switch datafile all; 63> RELEASE CHANNEL ch00; > RELEASE CHANNEL ch01; 65> } 列出备份的archivelog: RMAN> list backup of archivelog all; 确定下对应thread的归档日志sequence号,用于接下来的归档恢复 恢复thread2的对应归档(通常对应节点二) RMAN> run { 2> ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; 3> SEND 'NB_ORA_SERV=erpbackupsvr2, NB_ORA_CLIENT=scdbdb02'; 4> set archivelog destination to '/datatmp/tmpdata/arc'; 5> restore archivelog from sequence 20202 thread 2; 6> RELEASE CHANNEL ch00; 7> } 应用thread1指定的sequence归档,并恢复数据库(通常对应节点二) RMAN> run { 2> ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; 3> SEND 'NB_ORA_SERV=erpbackupsvr2, NB_ORA_CLIENT=scdbdb01'; 4> set until sequence 18527 thread 1; 5> recover database; 6> RELEASE CHANNEL ch00; 7> } 重建redo日志 SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- /dev/vgdata01/rlog1a_512m /dev/vgdata01/rlog1b_512m /dev/vgdata01/rlog2a_512m /dev/vgdata01/rlog2b_512m /dev/vgdata01/rlog3a_512m /dev/vgdata01/rlog3b_512m /dev/vgdata01/rlog4a_512m /dev/vgdata01/rlog4b_512m /dev/vgdata01/rvg01_4g_34 /dev/vgdata01/rvg01_4g_35 /dev/vgdata01/rvg01_4g_36 MEMBER -------------------------------------------------------------------------------- /dev/vgdata01/rvg01_4g_37 12 rows selected. SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog1a_512m' to '/app01/oradata/gzyx/redo01.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog1b_512m' to '/app01/oradata/gzyx/redo02.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog2a_512m' to '/app01/oradata/gzyx/redo03.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog2b_512m' to '/app01/oradata/gzyx/redo04.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog3a_512m' to '/app01/oradata/gzyx/redo05.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog3b_512m' to '/app01/oradata/gzyx/redo06.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog4a_512m' to '/app01/oradata/gzyx/redo07.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rlog4b_512m' to '/app01/oradata/gzyx/redo08.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rvg01_4g_34' to '/app01/oradata/gzyx/redo09.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rvg01_4g_35' to '/app01/oradata/gzyx/redo10.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rvg01_4g_36' to '/app01/oradata/gzyx/redo11.log'; SQL> ALTER DATABASE RENAME FILE '/dev/vgdata01/rvg01_4g_37' to '/app01/oradata/gzyx/redo12.log'; 打开数据库重设日志 SQL> alter database open resetlogs; Database altered. SQL> select open_mode from v$database; OPEN_MODE ---------- READ WRITE 至此数据库恢复完毕。
