RMAN備份策略與異機恢復一例(續篇)

本文是《RMAN備份策略與異機恢復一例》的續篇,繼續實驗驗證,最終實現兩個需求:html

1.異機恢復臨時測試的小庫

以前異機恢復的需求已經演練成功,如今須要保持以前恢復的庫orcl不動,全新恢復一個用於臨時測試指定時間點的小庫,實例名稱規劃爲testdb。
注意:風險點在於必定要注意全部步驟操做仔細,不能影響到現有環境orcl。
知識點:sql

  • a.如何恢復指定時間點的數據庫
  • b.如何重定向數據庫各文件的路徑
  • c.如何驗證數據是不是本身須要的

查詢數據庫全備有兩個日期的,一個是2018-06-19的全備,一個是2018-06-21的全備。數據庫

RMAN> list backup of database summary;


List of Backups
===============
Key     TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ---
45      B  F  A DISK        21-JUN-18       1       1       YES        TAG20180621T073703
46      B  F  A DISK        19-JUN-18       1       1       YES        TAG20180619T170003
54      B  F  A DISK        21-JUN-18       1       1       YES        TAG20180621T073703
58      B  F  A DISK        21-JUN-18       1       1       YES        TAG20180621T073703
60      B  F  A DISK        21-JUN-18       1       1       YES        TAG20180621T073703

若直接restore database,默認會從最新的全備轉儲恢復,那如何能夠用到以前的全備?windows

RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";

sql statement: alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''
RMAN> restore database until time '2018-06-20 18:00:00' validate;

Starting restore at 21-JUN-18
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4
using channel ORA_DISK_5
using channel ORA_DISK_6

channel ORA_DISK_1: starting validation of datafile backup set
channel ORA_DISK_1: reading from backup piece /tmp/FULLBAK_ORCL_20180619_18_1.DBFILE
channel ORA_DISK_1: piece handle=/tmp/FULLBAK_ORCL_20180619_18_1.DBFILE tag=TAG20180619T170003
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: validation complete, elapsed time: 00:00:45
Finished restore at 21-JUN-18

RMAN>

能夠看到只要指定了合適的until time參數,就自動會從以前合適的備份集中轉儲(這裏實驗就是20180619了)。session

如今來恢復小庫到2018-06-20 18:00:00這個時間點,實例名爲testdb:oracle

[oracle@jystdrac1 ~]$ export ORACLE_SID=testdb
[oracle@jystdrac1 ~]$ echo $ORACLE_SID
testdb
[oracle@jystdrac1 ~]$ mkdir -p /u01/oradata/testdb

參數文件,適當減小內存參數,增長db_unique_name參數:app

[oracle@jystdrac1 tmp]$ strings ORCL.46.1.20180621.SPFILE

[oracle@jystdrac1 testdb]$ vi pfile.ora
*.audit_file_dest='/u01/app/oracle/admin/testdb/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/oradata/testdb/control01.ctl','/u01/oradata/testdb/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_unique_name='testdb'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testdbXDB)'
*.log_archive_dest_1='LOCATION=/u01/arch'
*.memory_target=334173952
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

[oracle@jystdrac1 testdb]$ mkdir -p /u01/app/oracle/admin/testdb/adump

啓動到nomount:dom

SQL> startup nomount pfile='/u01/oradata/testdb/pfile.ora';

恢復控制文件:測試

[oracle@jystdrac1 tmp]$ rman target /
RMAN> restore controlfile from '/tmp/ORCL.45.1.20180621.CTL';
RMAN> alter database mount;

select name from v$datafile union all
select name from v$tempfile union all
select member from v$logfile;

NAME
------------------------------------------------------
/u01/oradata/orcl/system01.dbf
/u01/oradata/orcl/sysaux01.dbf
/u01/oradata/orcl/undotbs01.dbf
/u01/oradata/orcl/users01.dbf
/u01/oradata/orcl/temp01.dbf
/u01/oradata/orcl/redo03.log
/u01/oradata/orcl/redo02.log
/u01/oradata/orcl/redo01.log

8 rows selected.

set linesize 140 pagesize 100
select 'alter database rename file '''||name||''' to '''||name||''';' from v$tempfile union all
select 'alter database rename file '''||member||''' to '''||member||''';' from v$logfile;

替換規則:`to '/u01/oradata/orcl` => to `'/u01/oradata/testdb`

alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';

--注意若是這裏嘗試rename數據文件,因爲指定的數據文件還不存在,是會報錯的,相似這樣的錯誤:
SQL> alter database rename file '/u01/oradata/orcl/sysaux01.dbf' to '/u01/oradata/testdb/sysaux01.dbf'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01141: error renaming data file 2 - new file '/u01/oradata/testdb/sysaux01.dbf' not found
ORA-01110: data file 2: '/u01/oradata/orcl/sysaux01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

檢查備份和歸檔:spa

crosscheck backup;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired archivelog all;

catalog start with '/tmp/';
crosscheck backup;

重定向數據文件-方法1:

run {
set newname for datafile '/u01/oradata/orcl/system01.dbf' to '/u01/oradata/testdb/system01.dbf';
set newname for datafile '/u01/oradata/orcl/sysaux01.dbf' to '/u01/oradata/testdb/sysaux01.dbf';
set newname for datafile '/u01/oradata/orcl/undotbs01.dbf' to '/u01/oradata/testdb/undotbs01.dbf';
set newname for datafile '/u01/oradata/orcl/users01.dbf' to '/u01/oradata/testdb/users01.dbf';

sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
set until time '2018-06-20 18:00:00';
restore database;
switch datafile all;
}

RMAN> recover database until time '2018-06-20 18:00:00';

重定向數據文件-方法2:

--這裏語法要求必定要指定%f或者%U,一般選擇%U更易識別一些,這裏測試使用%f只有文件號,不夠友好。
run {
set newname for database to '/u01/oradata/testdb/%f';

sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
set until time '2018-06-20 18:00:00';
restore database;
switch datafile all;
}

RMAN> recover database until time '2018-06-20 18:00:00';

此時必定要從新確認下臨時文件和redo日誌文件的位置,若是沒有更改正確,務必改正,不然會形成災難性後果!!!

SQL> select name from v$datafile union all
  2  select name from v$tempfile union all
  3  select member from v$logfile;

NAME
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/oradata/testdb/1
/u01/oradata/testdb/2
/u01/oradata/testdb/3
/u01/oradata/testdb/4
/u01/oradata/orcl/temp01.dbf
/u01/oradata/orcl/redo03.log
/u01/oradata/orcl/redo02.log
/u01/oradata/orcl/redo01.log

8 rows selected.

--若是不對,須要rename修改,而後再次查詢確認:
alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';

彙總一下本節開頭提出的問題:
a.如何恢復指定時間點的數據庫

RMAN> 
    sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
    restore database until time '2018-06-20 18:00:00';
    recover database until time '2018-06-20 18:00:00';

b.如何重定向數據庫各文件的路徑

--方法1:
    RMAN>
    run {
    set newname for datafile '/u01/oradata/orcl/system01.dbf' to '/u01/oradata/testdb/system01.dbf';
    restore...
    switch datafile all;
    }
    --方法2:
    RMAN>
    run {
    set newname for database to '/u01/oradata/testdb/';
    restore...
    switch database to copy;
    }
    --注意:已經反覆強調過屢次,在open resetlogs前都須要檢查文件位置是否正確,尤爲是redo文件的位置!這裏須要將redo和temp文件都重定向到新的目錄下:
    alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
    alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
    alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
    alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';

c.如何驗證數據是不是本身須要的

SQL> alter database open read only;
    Check Your DATA...
    SQL> shutdown abort;
    SQL> startup mount;
    SQL> alter database open resetlogs;

2.傳輸歸檔時,實現增量傳輸

以前傳輸歸檔時,當天內的文件是scp直接傳輸的,如今須要實現增量傳輸。

知識點:

  • a.如何在Linux實現增量傳輸文件的功能

以前windows是經過 xcopy /y /d來實現這個需求的:

/y
禁止提示確認要覆蓋已存在的目標文件。
/d [:MM-DD-YYYY]
只複製那些在指定日期或指定日期以後更改過的源文件。若是不包括「MM-DD-YYYY」值,「xcopy」會複製比現有「Destination」文件新的全部「Source」文件。該命令行選項使您能夠更新更改過的文件。

實際測試將以前的scp複製部分替換成rsync --ignore-existing,以前的scp部分註釋掉,添加rsync部分:

--全備腳本:
#echo "Begin scp at : `date`" >>${1}/backup_full.log
#scp ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/tmp/
#echo "End scp at : `date`" >>${1}/backup_full.log

echo "Begin rsync at : `date`" >>${1}/backup_full.log
rsync --ignore-existing ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/u01/orabak/
echo "End rsync at : `date`" >>${1}/backup_full.log

--歸檔備份腳本:
#echo "Begin scp at : `date`" >>${1}/backup_arch.log
#scp ${1}/*`date +%Y%m%d`*.{CTL,SPFILE,ARC} oracle@192.168.1.61:/tmp/
#echo "End scp at : `date`" >>${1}/backup_arch.log

echo "Begin rsync at : `date`" >>${1}/backup_arch.log
rsync --ignore-existing ${1}/*`date +%Y%m%d`*.{CTL,SPFILE,ARC} oracle@192.168.1.61:/u01/orabak/
echo "End rsync at : `date`" >>${1}/backup_arch.log

測試,定時任務調整爲每一個小時在整點時備份歸檔:

[ora11204@OEL-ASM orabak]$ crontab -l
0 1 * * * /u01/orabak/scripts/backup.sh /u01/orabak
0 * * * * /u01/orabak/scripts/backuparch.sh /u01/orabak

去異機192.168.1.61去觀察已經傳輸過來的文件修改時間,確認每小時確實只複製傳輸那些新文件:

-rw-r----- 1 oracle oinstall 9.5M Jun 21 13:00 ORCL.79.1.20180621.CTL
-rw-r----- 1 oracle oinstall  96K Jun 21 13:00 ORCL.80.1.20180621.SPFILE
-rw-r----- 1 oracle oinstall 2.5K Jun 21 13:00 ORCL.82.1.20180621.ARC
-rw-r----- 1 oracle oinstall  15K Jun 21 13:00 ORCL.81.1.20180621.ARC
-rw-r----- 1 oracle oinstall 9.5M Jun 21 14:00 ORCL.83.1.20180621.CTL
-rw-r----- 1 oracle oinstall  96K Jun 21 14:00 ORCL.84.1.20180621.SPFILE
-rw-r----- 1 oracle oinstall 2.5K Jun 21 14:00 ORCL.86.1.20180621.ARC
-rw-r----- 1 oracle oinstall 1.2M Jun 21 14:00 ORCL.85.1.20180621.ARC
-rw-r----- 1 oracle oinstall 9.5M Jun 21 15:00 ORCL.87.1.20180621.CTL
-rw-r----- 1 oracle oinstall  96K Jun 21 15:00 ORCL.88.1.20180621.SPFILE
-rw-r----- 1 oracle oinstall 2.5K Jun 21 15:00 ORCL.90.1.20180621.ARC
-rw-r----- 1 oracle oinstall 1.2M Jun 21 15:00 ORCL.89.1.20180621.ARC
-rw-r----- 1 oracle oinstall 9.5M Jun 21 16:00 ORCL.91.1.20180621.CTL
-rw-r----- 1 oracle oinstall  96K Jun 21 16:00 ORCL.92.1.20180621.SPFILE
-rw-r----- 1 oracle oinstall 2.5K Jun 21 16:00 ORCL.94.1.20180621.ARC
-rw-r----- 1 oracle oinstall 1.2M Jun 21 16:00 ORCL.93.1.20180621.ARC

最終考慮到一些特殊狀況,好比有些文件同步一半忽然斷電,因此更偏向於使用rsync -t -v同步知足需求,這樣也更加匹配以前windows的xcopy /y /d方式。 至此,經過rsync命令實現了增量傳輸文件的需求。

相關文章
相關標籤/搜索