### scripts 1
--the scirpt is used for restore db from vcs to a point to time recovery--and the target datafile and logfile is different from source###### config env
export start_date="10/31/2017 06:00:00"export end_date="11/01/2017 00:00:00"export restore_date="10/31/2017 23:00:00"export CLIENT_NAME="bpo1.db.os"export ORACLE_SID=bpoexport ORACLE_HOME=/db/bpo/app/product/11gexport ORACLE_BASE=/db/bpo/app/productexport OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs
export old_log_path="/db/vats/oradata/vats/"
export new_log_path="/db/bpo/data/"export old_data_path="+DATA_DG/bpo/datafile"
export new_data_path="/db/bpo/data"##no need change config
export PATH=$PATH:$ORACLE_HOME/bin
--for linuxexport controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep -a "cntrl" |awk '{print $8}'| head -1`--for aixexport controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep "cntrl" |awk '{print $8}'| head -1`export oracle_user=osbpo
###
cd $new_data_pathmkdir archivelogcd $ORACLE_BASE
mkdir diag diag/rdbms diag/tnslsnr##for target is already ok ,it meand target db is already started,revert datafile * to new location in target in /tmp/datafile_$ORACLE_SID.sql ,
su $oracle_user -c "sqlplus / as sysdba "<<db
set escape onspool /tmp/datafile_$ORACLE_SID.sqlset linesize 999 linesize 999 head off feedback offselect 'set newname for datafile '||FILE#||' to '||''''||name||''';' from v$datafile;spool offdb##########for target is not ok, it means target db is not started,revert datafile * to new location in source and copy to target
su $oracle_user -c "sqlplus / as sysdba "<<dbset escape onspool /tmp/datafile_$ORACLE_SID.sqlset linesize 999 linesize 999 head off feedback offselect 'set newname for datafile '||''||FILE#||''||' to '||chr(39)||replace(name,'$old_data_path','$new_data_path')||'''||'.dbf;' from v\$datafile;spool offdb##su $oracle_user -c "sqlplus / as sysdba "<<db1##@/tmp/datafile_$ORACLE_SID.sql##db1
###### begin to restore controlfile
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;startup nomount;eof0su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
run { allocate channel c1 type 'sbt_tape';send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';restore controlfile from '$controlfile';release channel c1;}eof1su oracle1 -c "sqlplus / as sysdba "<<eof2
select status from v\$instance;alter database mount;eof2 ####produce restore and recover command echo "run { " > /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c1 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlcat /tmp/datafile_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "set until time \"to_date('$restore_date','mm/dd/yyyy yy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlchmod 777 /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
su oracle1 -c "rman target / catalog rman11g/rman11g@cat11g cmdfile=/tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql" ##### ,for source log file is in filesytem ,mount db and change logfile to new location in target ,no need , 在rman 调用了switch datafile all, 后 open resetlogs 会自动 clear log and create logfile in new location.##su oracle1 -c "sqlplus / as sysdba "<<eof5
#set linesize 999 linesize 999 head off feedback off
#spool /tmp/logfile_$ORACLE_SID.sql#select 'alter database rename file '||''''||member||''''||' to '||chr(39)||replace(member,'$old_log_path1','$new_log_path')||''';' from v\$logfile;#spool off#eof5#####for source log file is in asm, mount db and change logfile to new location in target -no need , 在rman 调用了switch datafile all, 后 open resetlogs 会自动 clear log and create logfile in new location.##su oracle1 -c "sqlplus / as sysdba "<<eof5
##set linesize 999 linesize 999 head off feedback off
##spool /tmp/logfile_$ORACLE_SID.sql#select 'alter database rename file '||''''||member||''''||' to '||chr(39)||'$new_log_patch'||substr(member,instr(member,'/',-1,1) +1) from v\$logfile;#spool off#eof5
su oracle1 -c "sqlplus / as sysdba "<<eof6
@/tmp/logfile_$ORACLE_SID.sqleof6####open resetlogs ,if meet ora-00392 ,it means it is for to-time reovery,need clear the log .
su oracle1 -c "sqlplus / as sysdba "<<eof7alter database open resetlogs;eof7
### scripts 2
export ORALCE_SID=vatsexport ORACLE_HOME=/db/app/product/database/11gexport source_db_home=/oracle/product/database/11.2.0 s
export target_db_home=/db/app/product/database/11g sexport source_db_file_loc=/db/oradata/vats
export target_db_file_loc=/db/oradata/vatsexport source_archive_log=/db/oradata/vats/archivelog
export target_archive_log=/db/oradata/vats/archivelogexport source_ip=25.10.0.197
export target_ip=10.241.96.37export target_passwd="123456"
export oracle_user=oracleexport PORT=15025 ### it will prompt passwd##scp root@$source_ip:$source_db_home/*$ORALCE_SID* $target_db_home
### it will prompt passwd
###scp root@$source_ip:$source_db_file_loc/*.* $target_db_file_loc#### use expect to send the datafile use scp
#expect -c "# spawn scp root@$source_ip:$source_db_file_loc/*.* $target_db_file_loc# expect { # \"*assword\" {set timeout 300; send \"$target_passwd\r\"; exp_continue;}# \"yes/no\" {send \"yes\r\";}# }#expect eof"###use expect to send the datafile use sftp becuase sftp 可以容忍更多的网络延时
#expect -c "# spawnsftp root@$source_ip:$source_db_file_loc/suntx02.dbf $target_db_file_loc
# expect { # \"*assword\" {set timeout 300; send \"$target_passwd\r\"; exp_continue;}# \"yes/no\" {send \"yes\r\";}# }#expect eof"####如果 send \"quit\r\"; 加入最后,那么sftp 会在遇到网络中断,异常退出 ,expect is for linux
cd $target_db_file_locexpect -c " spawn sftp root@$source_ip:$source_db_file_loc expect { \"*assword\" {set timeout -1; send \"$target_passwd\r\"; exp_continue;} \"sftp\" {send \"get *.dbf\r\";}
}expect eof"exitsu $oracle_user -c "sqlplus / as sysdba "<<eof2select status from v\$instance;alter database mount;alter database open read only;shutdown immediate;startup;archive log list;alter system set local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$target_ip)(PORT=$PORT)))' scope=both;shutdown immediate;startup;eof2 su $oracle_user -c "echo "SQLNET.EXPIRE_TIME=10" >> $ORACLE_HOME/network/admin/sqlnet.ora"
su $oracle_user -c "echo "$ORACLE_SID =" >> $ORACLE_HOME/network/admin/listener.ora"
su $oracle_user -c "echo "(DESCRIPTION_LIST =" >> $ORACLE_HOME/network/admin/listener.ora"su $oracle_user -c "echo "(DESCRIPTION =">> $ORACLE_HOME/network/admin/listener.ora"su $oracle_user -c "echo "(ADDRESS_LIST =">> $ORACLE_HOME/network/admin/listener.ora"su $oracle_user -c "echo "(ADDRESS = (PROTOCOL = TCP)(HOST = $target_ip)(PORT = $PORT))" >> $ORACLE_HOME/network/admin/listener.ora "su $oracle_user -c "echo ")" >> $ORACLE_HEXPIRE_TIME=10" >> cd $ORACLE_HOME/network/admin/sqlnet.ora "
--
--scp root#!/usr/bin/expect
#spawn scp root@$source_ip:$source_db_home/*$db_name* $target_db_home#set timeout 20#expect "$target_passwd"#exec sleep 2#send "password\r"#interactOME/network/admin/listener.ora "
su $oracle_user -c "echo ")" >> $ORACLE_HOME/network/admin/listener.ora "su $oracle_user -c "echo ")" >> $ORACLE_HOME/network/admin/listener.ora " su $oracle_user -c "lsnrctl start $ORACLE_SID"su $oracle_user -c "lsnrctl status $ORACLE_SID" su $oracle_user -c "sqlplus / as sysdba "<<eof3select status from v\$instance;alter system register;eof3 su $oracle_user -c "lsnrctl status $ORACLE_SID"###su $oracle_user -c "echo "SQLNET.
########for tempfile re-creation
###scripts to produce tempfile production:
select 'ALTER TABLESPACE '||t.name||' add tempfile '||''''||f.name||''''||f.bytes/1024/1024||'M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;' from v
$tempfile f ,(select ts#,name from v$tablespace t where included_in_database_backup='NO') t where f.ts#= t.ts# #####################ALTER TABLESPACE TEMP ADD TEMPFILE '/db/oracle/oradata/pisa/temp01.dbf'
SIZE 4929M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;ALTER TABLESPACE PISA_TEMP ADD TEMPFILE '/db/oracle/oradata/pisa/PISA_TEMP.dbf' SIZE 32767M REUSE AUTOEXTEND ON NEXT 20971520 MAXSIZE 32767M;ALTER TABLESPACE PISA_TEMP ADD TEMPFILE '/db/oracle/oradata/pisa/PISA_TEMP01.dbf' SIZE 32767M REUSE AUTOEXTEND ON NEXT 20971520 MAXSIZE 32767M;ALTER TABLESPACE ETL_TEMP ADD TEMPFILE '/db/oracle/oradata/pisa/ETL_TEMP.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 10485760 MAXSIZE 5000M;ALTER TABLESPACE TS_EAST_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/east_data_tmp01.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_EAST_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/east_data_tmp02.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_SAFE_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/safe_data_tmp01.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_SAFE_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/safe_data_tmp02.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_IGRSVISE_TMP drop TEMPFILE '/db/oracle/oradata/pisa/igrsvise_data_tmp01.dbf' SIZE 32767M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_IGRSVISE_TMP drop TEMPFILE '/db/oracle/oradata/pisa/igrsvise_data_tmp02.dbf' SIZE 32767M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_IGRSFIN_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/igrsfin_data_tmp01.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_IGRSFIN_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/igrsfin_data_tmp02.dbf' SIZE 2000M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;
---
ALTER TABLESPACE TS_IGRSVISE_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/igrsvise_data_tmp01.dbf'
SIZE 32767M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;ALTER TABLESPACE TS_IGRSVISE_TMP ADD TEMPFILE '/db/oracle/oradata/pisa/igrsvise_data_tmp02.dbf' SIZE 32767M REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M; ##select name from v$tempfile;###alter database tempfile '/db/oracle/oradata/pisa/temp01.dbf' drop
-----step 2 drop oldselect 'alter database tempfile '||''''||name||''' drop;' from v$tempfile;
###sample 0:
### scripts 1 ##since oracle 11g is version equl cat1log 11g ,so we use man restore connect catalog db##the scirpt is used for restore db from vcs to a point to time recovery##and the target datafile and logfile is different from source,the script is running in root user##below is running the linux nbu machine ##clearn old .dbf file in other direcotry /os/oradata###if other db is 12c ,the key word CLIENT_NAME/new_log_path/new_data_path need change following the new db ##add pause to debug to /usr/bin for debug question
hostname=`df -h`
echo "cems total size is 100g, make sure /os/oradata/ have more space than 100g,if not clearn old .dbf file in /os/oradata/“echo "Please input your biplist query start_date eg 03/17/2019 06:00:00 :"read start_dateecho "Please input your biplist query end_time eg 03/19/2019 00:00:00 :"
read end_timeecho "Please input your rman restore_date until time eg 03/18/2019 23:00:00 ,and it is between start_time and end_time:"
read restore_dateecho "restore_date=$restore_date,continue to create ? (y/n):"
read continueif [ "$continue" == "y" ]then
###### section 1 config env
###config restore date, backup_start_date,end_start_date, nbu_client_name,ORACLE_SID,target ORACLE_HOME,target ORACLE_BASE,and PATH and oracle_user,time is "mm-dd-yyyy hh24:mi;ss"##START_DATA is checking backup begin data, end_data is checking backup end time##nbu client is client name, ORACLE_SID is db SID#export start_date="03/16/2019 06:00:00"#export end_date="03/19/2019 00:00:00"#export restore_date="03/16/2019 23:00:00"export CLIENT_NAME="cems.db.os"export ORACLE_SID=cemsexport ORACLE_HOME=/oracle/product/database/11.2.0#export ORACLE_BASE= /oracle1/app/product/11.2.0/export PATH=$PATH:$ORACLE_HOME/binexport oracle_user=oracle export new_log_path="/os/oradata/cems"export new_data_path="/os/oradata/cems" ###export OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs###create direcotry for db
#mkdir -p /os/oradata/cems/archivelog
#mkdir -p /oracle/admin/cems/adump#mkdir -p /oracle/diag/rdbms/cems/diag/rdbms#mkdir -p /oracle/diag/rdbms/cems/diag/tnslsnr#chmod -R 777 /oracle/admin/cems/adump
#chmod -R 777 /os/oradata/cems/archivelog#chmod -R 777 /oracle/diag/rdbms/cems/diag#chmod -R 777 /os/oradata/cems/###config logfile and datafile change patch , 暂时不需要##export old_log_path="/db/bcds/oradata/bcds/"#export new_log_path="/datalv/bcds/"
##export old_data_path="/db/bcds/oradata/bcds"
##export new_data_path="/datalv/bcds"## config os version is unix or linux
###for linux
export controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep -a "cntrl" |awk '{print $8}'| head -1`##for aix and hp##export controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep "cntrl" |awk '{print $8}'| head -1` echo "##########section 1 is ok###############"### mkdir
#cd $new_data_path#mkdir archivelog#cd $ORACLE_BASE
#mkdir diag diag/rdbms diag/tnslsnr
###### section 2 switch to oracle1 and keep root profile and begin to restore controlfile and mount db,如果碰到ORA-27101: shared memory realm does not exist,可以忽略
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;startup nomount;eof0 ###set dbid= 89095998su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
run { allocate channel c1 type 'sbt_tape';send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';restore controlfile from '$controlfile';release channel c1;}eof1su $oracle_user -c "sqlplus / as sysdba "<<eof2
select status from v\$instance;alter database mount;eof2 echo echo "##########section 2 is ok###############"
### section 3 produce log file and data file change file
su $oracle_user -c "sqlplus / as sysdba "<<eof2set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/logpatch_$ORACLE_SID.sqlselect replace(member,'/redo01.log','') from v\$logfile where GROUP# = 1;spool offeof2 export old_log_path=`grep os /tmp/logpatch_$ORACLE_SID.sql`export old_data_path=`grep os /tmp/logpatch_$ORACLE_SID.sql`
su $oracle_user -c "sqlplus / as sysdba "<<db
set escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/datafile_$ORACLE_SID.sqlselect 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;spool offdbsed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
echo "##clean FRA AREA#####"su $oracle_user -c "rman target / "<<eof2crosscheck backup;delete noprompt force backup;delete noprompt force archivelog;eof2
###add fix about RMAN-20207: INCARNATION
su $oracle_user -c "sqlplus / as sysdba "<<db
set escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/scn_$ORACLE_SID.sqlselect max(INCARNATION#) from v\$database_incarnation where RESETLOGS_TIME < to_date('$restore_date','mm/dd/yyyy hh24:mi:ss');spool offdbsed '1d;$d' /tmp/scn_$ORACLE_SID.sql > /tmp/scn_start_$ORACLE_SID.sql
INCARNATION_NO=`cat /tmp/scn_start_$ORACLE_SID.sql`####produce restore and recover command
echo "reset database to incarnation $INCARNATION_NO;" > /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "run { " >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c1 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlcat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlchmod 777 /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "##########section 3 is ok###############"
### section 4 begin to restore and recover
su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g cmdfile=/tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql" echo "##########section 4 is ok###############"### section 5 begin to rename logfile and resetlogs open
su $oracle_user -c "sqlplus / as sysdba "<<eof5
set escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/logfile_$ORACLE_SID.sqlselect 'alter database rename file '||''''||member||''''||' to '||chr(39)||replace(member,'$old_log_path','$new_log_path')||''';' from v\$logfile;select 'alter database clear logfile group '|| GROUP#||';' from v\$logfile;spool offeof5 sed '/^SQL/d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql##sed '1d;$d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<eof6select status from v\$instance;@/tmp/logfile_path_$ORACLE_SID.sqlalter database open RESETLOGS;eof6
echo echo "##########section 5 is ok finish ###############"
########for tempfile re-creation produce create new tempfile and drop old tempfile ,and execute it.
##export old_data_path=/tmp
su $oracle_user -c "sqlplus / as sysdba "<<db4
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sqlselect 'ALTER TABLESPACE '||t.name||' add tempfile '||''''||replace(f.name,'$old_data_path','$new_data_path') ||''''||' size 10M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;' from v\$tempfile f ,(select ts#,name from v\$tablespace t where included_in_database_backup='NO') t where f.ts#= t.ts#;spool offdb4sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_add_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db5
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sqlselect 'alter tablespace '||t.name||' drop tempfile '||''''||f.name||''''||';' from v\$tempfile f ,(select ts#,name from v\$tablespace t where included_in_database_backup='NO') twhere f.ts#= t.ts#;spool offdb5sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_drop_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db6set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sql@/tmp/tempfile_add_$ORACLE_SID.sql@/tmp/tempfile_drop_$ORACLE_SID.sqlspool offdb6 echo "##########section 6 is ok finish ###############"
###sample 1:
##准备阶段
#switch restore user profile to target database profile in nbu test machine
su - oracle1 cp profile_bcds .profile ####2 检查uid 和所有的gid 跟生产一致usermod -u 1001 oracle1
groupmod -g 1001 dbagroupmod -g 1001 oinstall### scripts 1--the scirpt is used for restore db from vcs to a point to time recovery--and the target datafile and logfile is different from source,the script is running in root user ###### section 1 config env ###config restore date, backup_start_date,end_start_date, nbu_client_name,ORACLE_SID,target ORACLE_HOME,target ORACLE_BASE,and PATH and oracle_user,time is "mm-dd-yyyy hh24:mi;ss"export start_date="06/28/2018 06:00:00"export end_date="06/29/2018 00:00:00"export restore_date="06/28/2018 23:00:00"export CLIENT_NAME="bcdp.db.os"export ORACLE_SID=bcdsexport ORACLE_HOME=/oracle1/app/product/11.2.0/dbhome_1export ORACLE_BASE= /oracle1/app/product/11.2.0/export PATH=$PATH:$ORACLE_HOME/binexport oracle_user=oracle1
###export OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs
###config logfile and datafile change patchexport old_log_path="/db/bcds/oradata/bcds/"export new_log_path="/datalv/bcds/"export old_data_path="/db/bcds/oradata/bcds"
export new_data_path="/datalv/bcds"## config os version is unix or linux
###for linux
##export controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep -a "cntrl" |awk '{print $8}'| head -1`##for aix and hpexport controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep "cntrl" |awk '{print $8}'| head -1` echo "##########section 1 is ok###############"### mkdir
#cd $new_data_path#mkdir archivelog#cd $ORACLE_BASE
#mkdir diag diag/rdbms diag/tnslsnr
###### section 2 switch to oracle1 and keep root profile and begin to restore controlfile and mount db
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;startup nomount;eof0su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
set dbid= 89095998run { allocate channel c1 type 'sbt_tape';send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';restore controlfile from '$controlfile';release channel c1;}eof1su $oracle_user -c "sqlplus / as sysdba "<<eof2
select status from v\$instance;alter database mount;eof2 echo echo "##########section 2 is ok###############" ### section 3 produce log file and data file change file##for target is already ok ,it meand target db is already started,revert datafile * to new location in target in /tmp/datafile_$ORACLE_SID.sql ,
### produce data file change filesu $oracle_user -c "sqlplus / as sysdba "<<dbset escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/datafile_$ORACLE_SID.sqlselect 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;spool offdbsed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
####produce restore and recover commandecho "run { " > /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c1 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlcat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlchmod 777 /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "##########section 3 is ok###############"
### section 4 begin to restore and recover
su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g cmdfile=/tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql" echo "##########section 4 is ok###############"
### section 5 begin to rename logfile and resetlogs open
su $oracle_user -c "sqlplus / as sysdba "<<eof5
set escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/logfile_$ORACLE_SID.sqlselect 'alter database rename file '||''''||member||''''||' to '||chr(39)||replace(member,'$old_log_path','$new_log_path')||''';' from v\$logfile;select 'alter database clear logfile group '|| GROUP#||';' from v\$logfile;spool offeof5 sed '/^SQL/d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql##sed '1d;$d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<eof6
select status from v\$instance;@/tmp/logfile_path_$ORACLE_SID.sqlalter database open RESETLOGS;eof6
echo echo "##########section 5 is ok finish ###############"
##准备阶段
#switch restore user profile to target database profile in nbu test machine
su - oracle1 cp profile_bcds .profile ####2 检查uid 和所有的gid 跟生产一致usermod -u 1001 oracle1
groupmod -g 1001 dbagroupmod -g 1001 oinstall### scripts 1--the scirpt is used for restore db from vcs to a point to time recovery--and the target datafile and logfile is different from source,the script is running in root user ###### section 1 config env ###config restore date, backup_start_date,end_start_date, nbu_client_name,ORACLE_SID,target ORACLE_HOME,target ORACLE_BASE,and PATH and oracle_user,time is "mm-dd-yyyy hh24:mi;ss"export start_date="06/28/2018 06:00:00"export end_date="06/29/2018 00:00:00"export restore_date="06/28/2018 23:00:00"export CLIENT_NAME="bcdp.db.os"export ORACLE_SID=bcdsexport ORACLE_HOME=/oracle1/app/product/11.2.0/dbhome_1export ORACLE_BASE= /oracle1/app/product/11.2.0/export PATH=$PATH:$ORACLE_HOME/binexport oracle_user=oracle1
###export OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs
###config logfile and datafile change patchexport old_log_path="/db/bcds/oradata/bcds/"export new_log_path="/datalv/bcds/"export old_data_path="/db/bcds/oradata/bcds"
export new_data_path="/datalv/bcds"## config os version is unix or linux
###for linux
##export controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep -a "cntrl" |awk '{print $8}'| head -1`##for aix and hpexport controlfile=`/usr/openv/netbackup/bin/bplist -C $CLIENT_NAME -S pnbumaster -l -t 4 -s $start_date -e $end_date -R / | grep "cntrl" |awk '{print $8}'| head -1` echo "##########section 1 is ok###############"### mkdir
#cd $new_data_path#mkdir archivelog#cd $ORACLE_BASE
#mkdir diag diag/rdbms diag/tnslsnr##########for target is not ok, it means target db is not started,revert datafile * to new location in source and copy to target #su $oracle_user -c "sqlplus / as sysdba "<<db#set escape on#spool /tmp/datafile_$ORACLE_SID.sql#set linesize 999 linesize 999 head off feedback off#select 'set newname for datafile '||''||FILE#||''||' to '||chr(39)||replace(name,'$old_data_path','$new_data_path')||'''||'.dbf;' from v\$datafile;#spool off#db
##su $oracle_user -c "sqlplus / as sysdba "<<db1##@/tmp/datafile_$ORACLE_SID.sql##db1
###### section 2 switch to oracle1 and keep root profile and begin to restore controlfile and mount db
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;startup nomount;eof0su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
set dbid= 89095998run { allocate channel c1 type 'sbt_tape';send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';restore controlfile from '$controlfile';release channel c1;}eof1su $oracle_user -c "sqlplus / as sysdba "<<eof2
select status from v\$instance;alter database mount;eof2 echo echo "##########section 2 is ok###############" ### section 3 produce log file and data file change file##for target is already ok ,it meand target db is already started,revert datafile * to new location in target in /tmp/datafile_$ORACLE_SID.sql ,
### produce data file change filesu $oracle_user -c "sqlplus / as sysdba "<<dbset escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/datafile_$ORACLE_SID.sqlselect 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;spool offdbsed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
####produce restore and recover commandecho "run { " > /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c1 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlcat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlecho "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sqlchmod 777 /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "##########section 3 is ok###############"
### section 4 begin to restore and recover
su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g cmdfile=/tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql" echo "##########section 4 is ok###############"
### section 5 begin to rename logfile and resetlogs open
su $oracle_user -c "sqlplus / as sysdba "<<eof5
set escape onset linesize 999 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/logfile_$ORACLE_SID.sqlselect 'alter database rename file '||''''||member||''''||' to '||chr(39)||replace(member,'$old_log_path','$new_log_path')||''';' from v\$logfile;select 'alter database clear logfile group '|| GROUP#||';' from v\$logfile;spool offeof5 sed '/^SQL/d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql##sed '1d;$d' /tmp/logfile_$ORACLE_SID.sql > /tmp/logfile_path_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<eof6
select status from v\$instance;@/tmp/logfile_path_$ORACLE_SID.sqlalter database open RESETLOGS;eof6
echo "##########section 5 is ok finish ###############"
### section 6 begin to rename logfile and resetlogs open
########for tempfile re-creation produce create new tempfile and drop old tempfile ,and execute it.export old_data_path=/tmp
su $oracle_user -c "sqlplus / as sysdba "<<db4
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sqlselect 'ALTER TABLESPACE '||t.name||' add tempfile '||''''||replace(f.name,'$old_data_path','$new_data_path') ||''''||' size '||f.bytes/1024/1024||'M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;' from v\$tempfile f ,(select ts#,name from v\$tablespace t where included_in_database_backup='NO') t where f.ts#= t.ts#;spool offdb4sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_add_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db5
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sqlselect 'alter tablespace '||t.name||' drop tempfile '||''''||f.name||''''||';' from v\$tempfile f ,(select ts#,name from v\$tablespace t where included_in_database_backup='NO') twhere f.ts#= t.ts#;spool offdb5sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_drop_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db6set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool onspool /tmp/tempfile_$ORACLE_SID.sql@/tmp/tempfile_add_$ORACLE_SID.sql@/tmp/tempfile_drop_$ORACLE_SID.sqlspool offdb6 echo "##########section 6 is ok finish ###############"
###new for debug tool pasue
1. 打开文本编辑器,在 /home/cheng/bin 目录中创建一名为pause的文本文件。
2.在pause文件中写入以下内容:
#!/bin/bash
get_char(){ SAVEDSTTY=`stty -g` stty -echo stty raw dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY}if [ -z "$1" ]; then echo '请按任意键继续...'else echo -e "$1"figet_char保存并退出文本编辑器。
3.打开终端,执行以下命令:chmod 0755 /home/cheng/bin/pause
--------------------- 作者:Colin91 来源:CSDN 原文:https://blog.csdn.net/colin91/article/details/9119031 版权声明:本文为博主原创文章,转载请附上博文链接!
#############issue 1 https://blog.csdn.net/lldustc_blog/article/details/78348140
RMAN中通过时间点不完全恢复报ORA-01841的解决办法
环境
- 操作系统 oracle linux 6.5
- 数据库 oracle 11.2.0.4
执行脚本
run {allocate channel c1 type disk;sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; set until time='2017-10-8 00:00:00'; restore database; recover database; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
错误及分析
执行脚本后报错
RMAN-03002: failure of recover command at ……..
RMAN-11003: failure during parse/execution of SQL ……. ORA-01841: (full) year must be between -4713 and +9999, and not be 0此处为貌似是我们的语句写错了,其实是oracle的bug
貌似有两个问题-
需设置NLS_LANG环境变量
在执行rman命令前先执行export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
-
此处不能将restore database和recover database放在一个run块里,需在单独的run块中完成
run {allocate channel c1 type disk;sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; set until time='2017-10-8 00:00:00'; restore database; }
- 1
- 2
- 3
- 4
- 5
- 6
run {allocate channel c1 type disk;sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; set until time='2017-10-8 00:00:00'; recover database; }