一、Oracle數據庫開啟歸檔日志
Oracle恢復演練,由於備份需要,需要開啟歸檔日志。
1.1歸檔日志
歸檔日志(Archive Log)是非活動的重做日志備份.通過使用歸檔日志,可以保留所有重做歷史記錄,當數據庫處於ARCHIVELOG模式並進行日志切換式,后台進程ARCH會將重做日志的內容保存到歸檔日志中.當數據庫出現介質失敗時,使用數據文件備份,歸檔日志和重做日志可以完全恢復數據庫。
1.2ARCHIVELOG模式
當ORACLE數據庫運行在ARCHIVELOG模式時,所有的事務重做日志都將保存.這意味着對數據庫進行的所有事務都留有一個備份,盡管重做日志以循環方式工作,但在一個重做日志被覆蓋前均將為其建立一個副本.在重做日志文件復制完成之前,ORACLE數據庫將停止一切新的操作,在舊的事務記錄完成之前ORACLE不對其進行覆蓋.有了所有事務的副本,數據庫就可以從所有類型的失敗中恢復,包括用戶錯誤或磁盤崩潰.這是一種最安全的數據庫工作方式。
1.3啟動歸檔日志
1.登錄sysdba賬戶,本例子中的Oracle是綁定的服務器,直接在對應服務器上用下面的命令登錄:
sqlplus / as sysdba
2.查看歸檔信息
SQL> archive log list
//輸出結果
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 241
Current log sequence 255
No Archive Mode表示當前數據庫未開啟歸檔模式
3. 設置歸檔目錄,該修改重啟后生效
oracle默認使用閃回恢復區DB_RECOVERY_FILE_DEST作為歸檔路徑,但是閃回恢復區在安裝過程中有限制其大小,如果閃回恢復區滿了,歸檔日志會因為無法寫入而導致數據庫阻塞。解決辦法是可以通過增加閃回區大小或者修改歸檔日志的路徑。修改log_archive_dest_1參數即可修改歸檔日志路徑(pfile/spfile中參數db_recovery_file_dest指定的目錄將無效),從Oracle 10g開始,可以生成多份一樣的日志,保存多個位置,加強安全性,多個位置通過設置不同的log_archive_dest_{n}參數實現,archive log list輸出中的Archive destination路徑只顯示最新修改的路徑。
SQL> show parameter log_archive_dest_1
//輸出結果
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string
SQL> alter system set log_archive_dest_1='location=/oradata/archivelog' scope=spfile;
//輸出結果
System altered.
4. 修改歸檔日志格式,該修改重啟后生效
SQL> alter system set log_archive_format='ARC%S_%R.%T_%D.dbf' scope=spfile;
//輸出結果
System altered.
5. 開啟歸檔日志
需要在mount狀態下開始數據庫歸檔,重啟至mount
SQL> shutdown immediate
//輸出結果
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 989857904 bytes
Database Buffers 603979776 bytes
Redo Buffers 7360512 bytes
Database mounted.
開啟數據庫歸檔:
SQL> alter database archivelog;
//輸出結果
Database altered.
查看歸檔結果:
SQL> archive log list
//輸出結果
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive_log
Oldest online log sequence 244
Next log sequence to archive 246
Current log sequence 246
開啟強制歸檔:
ALTER DATABASE FORCE LOGGING;
打開數據庫:
SQL> alter database open;
Database altered.
6.確認數據庫為歸檔模式
SQL> select log_mode from v$database;
//輸出結果
LOG_MODE
------------
ARCHIVELOG
SQL> select archiver from v$instance;
ARCHIVE
-------
STARTED
7.強制日志切換,確認是否開啟歸檔成功
先查看當前歸檔日志視圖和歸檔日志路徑:
SQL> select name from v$archived_log;
//輸出結果
no rows selected
[oracle@zml-rhel6 archive_log]$ ll
//輸出結果
total 0
如結果所示,沒有歸檔日志,下面執行強制日志切換:
SQL> alter system switch logfile;
//輸出結果
System altered.
再次查看視圖
SQL> select name from v$archived_log;
//輸出結果
NAME
--------------------------------------------------------------------------------
/oradata/archivelog/ARC0000002429_0993570162.0001_e7cda172.dbf
有歸檔日志產生,驗證歸檔日志開啟成功
1.4歸檔日志的清理
歸檔日志非常占用物理空間,應定時清理,歸檔日志的清理分為兩部分:
1.物理刪除歸檔日志
該方式是利用linux的腳本和crontab定時任務來查找n天前的日志進行刪除,首先編寫日志刪除腳本:
[oracle@i-F44CBDC1 shell]$ vim deleteArchiveLog.sh
//輸入如下指令,意為刪除5天前的所有文件
find /oradata/archivelog -mtime +5 -name "*.*" -exec rm -Rf {} \;
保存腳本后,根據實際情況賦予權限或組別,然后操作crontab,本例子均在oracle用戶下創建定時任務:
[root@i-F44CBDC1 ~]# crontab -e
//輸入如下指令,意為每天0點35分執行刪除歸檔日志腳本,並將腳本的執行記錄輸出到log文件中
35 0 * * * sh /usr/local/shell/deleteArchiveLog.sh >>/var/local/deletearchivelog.log
保存后,定時任務會到時間執行腳本。
2. 雖然物理刪除了歸檔日志文件,但是控制文件中依然會有這些日志的記錄,下面需要在控制文件中清理這些歸檔日志,利用RMAN進行清理。
//rman登錄
rman target/
查看過期日志:
RMAN> list expired archivelog all;
//輸出結果
specification does not match any archived log in the repository
信息中顯示沒有過期日志,這是因為需要先檢查歸檔日志的有效性,再進行刪除:
RMAN> crosscheck archivelog all;
//輸出結果
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=70 device type=DISK
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002448_0993570162.0001_e7cda172.dbf RECID=415 STAMP=1026952512
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002449_0993570162.0001_e7cda172.dbf RECID=416 STAMP=1026952520
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002450_0993570162.0001_e7cda172.dbf RECID=417 STAMP=1026952542
validation succeeded for archived log
再次查看過期的歸檔日志,rm刪除的文件便被標記為了過期日志:
RMAN> list expired archivelog all;
//輸出結果
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
1 606 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
1 607 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
1 608 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf
刪除過期的歸檔日志:
RMAN> delete expired archivelog all;
//輸出結果
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=446 device type=DISK
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
1 606 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
1 607 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
1 608 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf
//詢問是否要刪除上述文件,輸入YES
Do you really want to delete the above objects (enter YES or NO)? yes
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf RECID=1 STAMP=977949943
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf RECID=2 STAMP=977954446
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf RECID=3 STAMP=977954551
Deleted 3 EXPIRED objects
再次查詢過期的歸檔日志:
RMAN> list expired archivelog all;
//輸出結果
specification does not match any archived log in the repository
我們可以將上述流程封裝為shell腳本,用定時任務執行,首先創建腳本:
[oracle@i-F44CBDC1 shell]$ vim clearArchiveLog.sh
//輸入如下內容
PATH=$PATH:$HOME/bin
export PATH
export NLS_LANG=AMERICAN_AMERICA.zhs16gbk
export ORACLE_SID=zjfwjyptdb
export ORACLE_BASE=/oracle/app
export ORACLE_HOME=/oracle/app/database/ora11g
export SQLPATH=/home/oracle/scripts
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:
export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/ccs/bin:/etc:/bin:/usr/openwin/bin:\
/usr/local/bin:/usr/X11R6/bin:/oracle/crs/bin:$PATH
umask 022
$ORACLE_HOME/bin/rman target / log=/home/oracle/del_arch$(date +%Y-%m-%d).log <<EOF
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate - 5';
exit;
EOF
保存腳本,然后創建定時任務:
[oracle@i-F44CBDC1 shell]$ crontab -e
//輸入如下內容,意為0點40執行clearArchiveLog.sh,並將執行信息輸出到archivelogrmanlog.log文件中
40 0 * * * sh /usr/local/shell/clearArchiveLog.sh >>/var/local/archivelogrmanlog.log
保存退出,這樣就可以定時清理控制文件中的歸檔日志記錄了。
參考文章:https://www.cnblogs.com/ZeroTiny/p/9135247.html
二、rman查看備份情況操作命令
查看備份集:
RMAN> list backupset;
List of Backup Sets
===================
查看SCHEMA統計信息:
RMAN> report schema;
Report of database schema for database with db_unique_name ORCL
List of Permanent Datafiles
===========================
查看表空間的備份情況:
RMAN> list backup of tablespace users;
List of Backup Sets
===================
查看數據文件的備份情況:
RMAN> list backup of datafile 1;
List of Backup Sets
===================
查看控制文件的備份情況:
RMAN> list backup of controlfile;
List of Backup Sets
===================
查看設備類型為“Disk”的備份:(## 查看磁帶上的備份可以使用“list device type sbt backup;”命令)
RMAN> list device type disk backup;
List of Backup Sets
===================
查看歸檔日志及其備份情況:
注:## 查看歸檔日志的命令為:list archivelog all; ## 查看未備份的備份集;
## 查看歸檔日志備份集的命令為:list backup of archivelog all; ## 查看已備份的備份集;
RMAN> list archivelog all;
List of Archived Log Copies for database with db_unique_name ORCL
=====================================================================
查看系統中不存在(或者說是不在指定路徑下)的備份:
RMAN> list expired backup;
specification does not match any backup in the repository
注:
1.以上命令## 查看的是不存在的備份,如備份集用操作系統命令刪除之后,crosscheck之后該備份集就為expired(X)狀態。
2.跟obsolete概念區分,該參數是針對不滿足retention policy條件(可以按照存放份數,也可以按照存放日期)的備份。
查看過期的備份:
RMAN> report obsolete;
查看幾天前的schema狀態
RMAN> report schema at time 'SYSDATE-1';
查看需要備份的文件:
RMAN> report need backup;
查看違反規則的備份:
RMAN> report obsolete;
RMAN retention policy will be applied to the command
RMAN retention policy is set to redundancy 1
no obsolete backups found
參考:http://blog.chinaunix.net/uid-20802110-id-3849567.html