### 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=bpo
export ORACLE_HOME=/db/bpo/app/product/11g
export ORACLE_BASE=/db/bpo/app/product
export 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 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
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`
export oracle_user=osbpo
###
cd $new_data_path
mkdir archivelog
cd $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 on
spool /tmp/datafile_$ORACLE_SID.sql
set linesize 999 linesize 999 head off feedback off
select 'set newname for datafile '||FILE#||' to '||''''||name||''';' from v$datafile;
spool off
db
##########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
###### begin to restore controlfile
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;
startup nomount;
eof0
su $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;
}
eof1
su 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.sql
echo "allocate channel c1 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
cat /tmp/datafile_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "set until time \"to_date('$restore_date','mm/dd/yyyy yy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
chmod 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.sql
eof6
####open resetlogs ,if meet ora-00392 ,it means it is for to-time reovery,need clear the log .
su oracle1 -c "sqlplus / as sysdba "<<eof7
alter database open resetlogs;
eof7
### scripts 2
export ORALCE_SID=vats
export ORACLE_HOME=/db/app/product/database/11g
export source_db_home=/oracle/product/database/11.2.0 s
export target_db_home=/db/app/product/database/11g s
export source_db_file_loc=/db/oradata/vats
export target_db_file_loc=/db/oradata/vats
export source_archive_log=/db/oradata/vats/archivelog
export target_archive_log=/db/oradata/vats/archivelog
export source_ip=25.10.0.197
export target_ip=10.241.96.37
export target_passwd="123456"
export oracle_user=oracle
export 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 "
# spawn
sftp 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_loc
expect -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"
exit
su $oracle_user -c "sqlplus / as sysdba "<<eof2
select 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_H
EXPIRE_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"
#interact
OME/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 "<<eof3
select 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 old
select '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_date
echo "Please input your biplist query end_time eg 03/19/2019 00:00:00 :"
read end_time
echo "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_date
echo "restore_date=$restore_date,continue to create ? (y/n):"
read continue
if [ "$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=cems
export ORACLE_HOME=/oracle/product/database/11.2.0
#export ORACLE_BASE= /oracle1/app/product/11.2.0/
export PATH=$PATH:$ORACLE_HOME/bin
export 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= 89095998
su $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;
}
eof1
su $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 "<<eof2
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/logpatch_$ORACLE_SID.sql
select replace(member,'/redo01.log','') from v\$logfile where GROUP# = 1;
spool off
eof2
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 on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/datafile_$ORACLE_SID.sql
select 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;
spool off
db
sed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
echo "##clean FRA AREA#####"
su $oracle_user -c "rman target / "<<eof2
crosscheck 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 on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/scn_$ORACLE_SID.sql
select max(INCARNATION#) from v\$database_incarnation where RESETLOGS_TIME < to_date('$restore_date','mm/dd/yyyy hh24:mi:ss');
spool off
db
sed '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.sql
echo "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.sql
echo "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
cat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
chmod 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 on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/logfile_$ORACLE_SID.sql
select '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 off
eof5
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.sql
alter 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 on
spool /tmp/tempfile_$ORACLE_SID.sql
select '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 off
db4
sed '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 on
spool /tmp/tempfile_$ORACLE_SID.sql
select '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') t
where f.ts#= t.ts#;
spool off
db5
sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_drop_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db6
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/tempfile_$ORACLE_SID.sql
@/tmp/tempfile_add_$ORACLE_SID.sql
@/tmp/tempfile_drop_$ORACLE_SID.sql
spool off
db6
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 dba
groupmod -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=bcds
export ORACLE_HOME=/oracle1/app/product/11.2.0/dbhome_1
export ORACLE_BASE= /oracle1/app/product/11.2.0/
export PATH=$PATH:$ORACLE_HOME/bin
export oracle_user=oracle1
###export OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs
###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
su $oracle_user -c "sqlplus / as sysdba "<<eof0
shutdown immediate;
startup nomount;
eof0
su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
set dbid= 89095998
run {
allocate channel c1 type 'sbt_tape';
send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';
restore controlfile from '$controlfile';
release channel c1;
}
eof1
su $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 file
su $oracle_user -c "sqlplus / as sysdba "<<db
set escape on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/datafile_$ORACLE_SID.sql
select 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;
spool off
db
sed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
####produce restore and recover command
echo "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.sql
echo "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
cat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
chmod 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 on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/logfile_$ORACLE_SID.sql
select '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 off
eof5
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.sql
alter 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 dba
groupmod -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=bcds
export ORACLE_HOME=/oracle1/app/product/11.2.0/dbhome_1
export ORACLE_BASE= /oracle1/app/product/11.2.0/
export PATH=$PATH:$ORACLE_HOME/bin
export oracle_user=oracle1
###export OLD_ORACLE_HOME=/db/bpo/oracleapp/database/11.2.0/db_1/dbs
###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
##########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;
eof0
su $oracle_user -c "rman target / catalog rman11g/rman11g@cat11g" <<eof1
set dbid= 89095998
run {
allocate channel c1 type 'sbt_tape';
send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';
restore controlfile from '$controlfile';
release channel c1;
}
eof1
su $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 file
su $oracle_user -c "sqlplus / as sysdba "<<db
set escape on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/datafile_$ORACLE_SID.sql
select 'set newname for datafile '||FILE#||' to '||''''||replace(name,'$old_data_path','$new_data_path')||''''||';' from v\$datafile;
spool off
db
sed '1d;$d' /tmp/datafile_$ORACLE_SID.sql > /tmp/datafile_path_$ORACLE_SID.sql
####produce restore and recover command
echo "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.sql
echo "allocate channel c2 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c3 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "allocate channel c4 type 'sbt_tape';" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "send 'NB_ORA_SERV=pnbumaster,NB_ORA_CLIENT=$CLIENT_NAME';">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
cat /tmp/datafile_path_$ORACLE_SID.sql >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "set until time \"to_date('$restore_date','mm/dd/yyyy hh24:mi:ss')\";">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "restore database;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "switch datafile all;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "recover database;">> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c1;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c2;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c3;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "release channel c4;" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
echo "}" >> /tmp/restore_`date '+%y%m%d'`_$ORACLE_SID.sql
chmod 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 on
set linesize 999 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/logfile_$ORACLE_SID.sql
select '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 off
eof5
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.sql
alter 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 on
spool /tmp/tempfile_$ORACLE_SID.sql
select '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 off
db4
sed '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 on
spool /tmp/tempfile_$ORACLE_SID.sql
select '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') t
where f.ts#= t.ts#;
spool off
db5
sed '1d;2d;$d' /tmp/tempfile_$ORACLE_SID.sql > /tmp/tempfile_drop_$ORACLE_SID.sql
su $oracle_user -c "sqlplus / as sysdba "<<db6
set linesize 32760 pagesize 0 head off feedback off echo off verify off trimspool on
spool /tmp/tempfile_$ORACLE_SID.sql
@/tmp/tempfile_add_$ORACLE_SID.sql
@/tmp/tempfile_drop_$ORACLE_SID.sql
spool off
db6
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"
fi
get_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; }