Oracle 數據庫歸檔模式和非歸檔模式的區別以及設置

Oracle 在線重做日誌(online redo log)記錄了數據庫的各種增刪改操作。數據庫至少擁有 2 個在線重做日誌組,並且循環使用;日誌組 1 寫滿後切換到日誌組 2,日誌組 2 寫滿後再切換到日誌組 1,不停地重複這個過程。

切換日誌組會覆蓋原來日誌文件中的內容,如果不對已經寫滿的日誌文件進行歸檔,重做日誌記錄就會丟失;如果選擇歸檔日誌模式,發生日誌切換會對寫滿的日誌會進行歸檔存儲,意味着歷史重做日誌記錄都會被保存。這兩種配置的主要優缺點如下:

  • 非歸檔模式只能進行冷備,只能還原到備份點,之後的數據無法恢復;一般在開發或者測試環境使用
  • 歸檔模式可以執行熱備,同時支持增量備份,可以執行時間點恢復;歸檔日誌文件需要佔用額外的磁盤空間

⚠️對於生產數據庫,必須要工作在歸檔模式。

接下來我們介紹如何爲 Oracle 單實例和 RAC 集羣環境設置數據庫的歸檔模式和非歸檔模式。

查看歸檔模式

首先,可以使用 ARCHIVE LOG LIST 命令查看數據庫當前歸檔模式:

SQL> ARCHIVE LOG LIST;
Database log mode	       No Archive Mode
Automatic archival	       Disabled
Archive destination	       /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch
Oldest online log sequence     285
Current log sequence	       287

No Archive Mode 意味着非歸檔模式。

另外,也可以通過 v$database 系統視圖查看當前的歸檔模式:

SQL> select name,log_mode from v$database;

NAME	  LOG_MODE
--------- ------------
ORCL	  NOARCHIVELOG

單實例

Oracle 9i 之前

在 Oracle 9i 單節點實例中,可以使用以下方法將數據庫設置爲歸檔日誌模式:

ALTER SYSTEM SET log_archive_start=TRUE SCOPE=spfile;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SID/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s.arc' SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ARCHIVE LOG START;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

記得替換歸檔目錄中的 SID,也可以設置自己的歸檔目錄和日誌文件名的格式。

⚠️切換爲歸檔日誌模式之後一定要執行一次完全備份,因爲非歸檔日誌模式下產生的備份日誌對於歸檔模式不可用。

另一方面,我們可以使用以下方法將數據庫設置爲非歸檔模式:

ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ARCHIVE LOG STOP;
ALTER DATABASE NONARCHIVELOG;
ALTER DATABASE OPEN;

Oracle 10g 以後

從 Oracle 10g 開始,LOG_ARCHIVE_START 參數以及 ARCHIVE LOG START 命令已經被廢棄(歸檔模式默認啓用自動歸檔),因此設置更爲簡單。以下操作將數據庫設置爲歸檔模式:

ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SID/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

記得替換歸檔目錄中的 SID,也可以設置自己的歸檔目錄和日誌文件名的格式。

⚠️切換爲歸檔日誌模式之後一定要執行一次完全備份,因爲非歸檔日誌模式下產生的備份日誌對於歸檔模式不可用。

同樣,我們可以使用以下方法將數據庫設置爲非歸檔模式:

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE NONARCHIVELOG;
ALTER DATABASE OPEN;

RAC 集羣

Oracle RAC 集羣環境中的歸檔模式和非歸檔模式的設置略有不同。ALTER DATABASE ARCHIVELOG 命令只能在數據庫以獨佔模式 MOUNT 時執行,這就意味着必須停止整個集羣數據庫,然後執行操作。

Oracle 9i 之前

首先,設置相關的歸檔參數:

ALTER SYSTEM SET log_archive_start=TRUE SCOPE=spfile;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s.arc' SCOPE=spfile;

由於需要以獨佔模式裝載數據庫,還必須設置以下參數:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;

然後使用 srvctl 停止整個集羣數據庫:

$ srvctl stop database -d db_name

集羣停止之後,我們可以連接到其中一個節點執行以下命令:

STARTUP MOUNT;
ARCHIVE LOG START;
ALTER DATABASE ARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;

注意,參數 CLUSTER_DATABASE 被重新設置爲 TRUE。由於數據文件和 SPFILE 被所有實例共享,以上操作只需要從一個節點執行。

然後,再次從命令行啓動集羣數據庫:

$ srvctl start database -d db_name

以上設置將多個實例的歸檔日誌放在了同一個目錄中。歸檔格式中包含了線程(%t),可以防止實例之間的歸檔日誌文件名衝突。如果需要爲不同實例指定單獨的歸檔目錄,可以在 LOG_ARCHIVE_DEST_1 參數前加上實例 SID 前綴:

ALTER SYSTEM SET SID1.log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET SID2.log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;

同樣,我們可以使用以下方法將集羣數據庫設置爲非歸檔模式,只需要在一個節點進行操作:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;
$ srvctl stop database -d db_name
STARTUP MOUNT;
ARCHIVE LOG STOP;
ALTER DATABASE NONARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;
$ srvctl start database -d db_name

Oracle 10g 以後

從 Oracle 10g 開始,LOG_ARCHIVE_START 參數以及 ARCHIVE LOG START 命令已經被廢棄(歸檔模式默認啓用自動歸檔),因此設置更爲簡單。首先,設置相關的歸檔參數:

ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=spfile;

如果是 Oracle 10gR1,由於需要以獨佔模式裝載數據庫,還必須設置以下參數:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;

Oracle 10gR2 以後的版本不再需要設置 cluster_database 參數。

然後從命令行停止整個集羣數據庫:

$ srvctl stop database -d db_name

集羣停止之後,我們可以連接到其中一個節點執行以下命令:

STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;

再次從命令行啓動集羣數據庫:

$ srvctl start database -d db_name

同樣,我們可以使用以下方法將集羣數據庫設置爲非歸檔模式,只需要在一個節點進行操作:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;

Oracle 10gR2 以後的版本不再需要設置 cluster_database 參數。

$ srvctl stop database -d db_name
STARTUP MOUNT;
ALTER DATABASE NONARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;
$ srvctl start database -d db_name

定期更新數據庫領域相關文章,歡迎點贊👍、評論📝、收藏❤️!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章