Oracle Data Guard Feature 12cR2系列(二)

沃趣科技發表於2018-07-19

上一篇文章介紹了Data Guard 12cR2中3個特性,本篇文章將繼續介紹部分新特性。


| Using DBCA to Create a Data Guard Standby

在12c之前建立物理備庫的方法有:

1.使用RMAN備份恢復方法;

2.在11g時可以選擇duplicate方式建立物理備庫;通過這種方式直接線上從主庫搭建起物理備庫。

到12cR2後,Oracle又提供更簡單的方式來建立物理備庫,就是本篇文章介紹的方式:即使用DBCA方式直接建立物理備庫。這個功能再次簡化了建立備庫的複雜度。

通過DBCA提供的引數createDuplicateDB,我們可以很容易的搭建一個物理備庫。其具體語法如下:

dbca -createDuplicateDB 
-gdbName global_database_name 
-primaryDBConnectionString easy_connect_string_to_primary
-sid database_system_identifier
[-createAsStandby 
    [-dbUniqueName db_unique_name_for_standby]]
[-customScripts scripts_list]
[-datafileDestination data_files_directory]
[-initParams initialization_parameters
    [-initParamsEscapeChar initialization_parameters_escape_character]]
[-useWalletForDBCredentials {true | false}
     -dbCredentialsWalletPassword wallet_account_password
     -dbCredentialsWalletLocation wallet_files_directory]

雖然通過DBCA能非常簡單的建立一個物理備庫,但是要使用這個功能,必須滿足以下條件:

  1. 主庫必須是單機環境,非RAC資料庫;

  2. 主庫必須是非CDB環境;

在12c裡非常重要的新特性之一就是多租戶環境,但是該特性不支援CDB環境的資料庫,同時主庫也不能是RAC環境。如果不滿足以上條件,在使用DBCA建立備庫的時候,會提示如下錯誤:

主庫是CDB環境,錯誤如下:
[FATAL] [DBT-16057] Specified primary database is a container database (CDB).
CAUSE: Duplicate database operation is supported only for non container databases.
主庫是RAC資料庫,錯誤如下:
[FATAL] [DBT-16056] Specified primary database is not a Single Instance (SI) database.
CAUSE: Duplicate database operation is supported only for SI databases.

也就說通過DBCA搭建出來的備庫也是一個單機非CDB的備庫,如果你想要搭建一個為RAC的備庫,則需要手動轉換或者使用Oracle Enterprise Manager Cloud Control來將備庫轉換為RAC資料庫。

接下來將演示如何使用DBCA來建立一個物理備庫。假定主備環境如下:

同時假設主備庫已經具備如下環境:

1.主庫是單機並且使用ASM;

2.主庫已經開啟了歸檔模式;

3.密碼檔案和SPFILE都儲存在ASM中;

4.備庫同樣使用ASM儲存資料,且備庫端環境已經具備;

建立步驟如下:

1.在主庫開啟Force Logging

[oracle@dbpri]$ sqlplus / as sysdba
SQL> alter database force logging;
Database altered.
SQL>

2.主庫建立Standby Redo logs

檢視Redo log的大小:

[oracle@dbpri]$ sqlplus / as sysdba
SQL> select thread#,group#,bytes/1024/1024 SIZE _MB, status from v$log;
THREAD#  GROUP# SIZE_MB   STATUS
---------- ---------- -------------- ----------------
1            1             100             CURRENT
1            2             100             INACTIVE
1            3             100             INACTIVE
1            4             100             INACTIVE
1            5             100             INACTIVE
1            6             100             INACTIVE

建立Standby redo logs:

[oracle@dbpri]$ sqlplus / as sysdba
SQL> alter database add standby logfile thread 1 group 7 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 8 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 9 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 10 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 11 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 12 ('+DATADG')  size 100M;
Database altered.
SQL> alter database add standby logfile thread 1 group 13 ('+DATADG')  size 100M;
Database altered.
SQL>

當在主庫建立好 Standby redo logs 後,備庫也會自動建立。

3.建立網路服務名

主庫tnsnames.ora

ordbpri =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL= TCP)(HOST=dbpri)(PORT=1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ordbpri)
)
)
ordbstd =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL = TCP)(HOST=dbstd) (PORT=1521)))(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ordbstd)
)
)
ordbpri_local_listener =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL = TCP)(HOST=dbpri)(PORT=1521) )
) 
)

備庫tnsnames.ora  

ordbpri =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL= TCP)(HOST=dbpri)(PORT=1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ordbpri)
)
)
ordbstd =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL = TCP)(HOST=dbstd) (PORT=1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ordbstd)
)
)
ordbstd_local_listener =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL = TCP)(HOST=dbstd)(PORT=1521) )
) 
)

4.在備庫執行DBCA

[oracle@dbstd ~]$ dbca -silent -createDuplicateDB -gdbName ordbpri -sid ordbstd -sysPassword  oracle -primaryDBConnectionString dbpri:1521/ordbpri -createAsStandby -dbUniqueName ordbstd –initParams db_create_file_dest=+DATADG, db_create_online_log_dest_1=+DATADG,local_listener=”ordbstd_local_listener”
輸出如下:
Enter SYS user password:
Listener config step
33% complete
Auxiliary instance creation
66% complete
RMAN duplicate
100% complete
Look at the log file " /u01/app/oracle/product/12.2.0/dbhome_1/cfgtoollogs/dbca/ordbpri/ordbpri.log" for further details.

注:也可以使用自定義指令碼,當備庫完成建立後,執行定製指令碼。

5.在備庫完成環境配置

SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=+DATADG  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ordbstd'
scope=spfile;
SQL> alter system set db_file_name_convert='+DATADG/ordbpri','+DATADG/ordbstd' scope=spfile;
SQL> alter system set log_file_name_convert='+DATADG/ordbpri','+DATADG/ordbstd' scope=spfile;
SQL> alter system set standby_file_management=auto scope=spfile;
SQL> alter system set remote_listener=' dbstd:1521' scope=spfile;
SQL> shutdown immediate
SQL> startup
SQL> alter system register;

注:在12c,可以嘗試使用DG Broker來進行Data Guard的管理和維護。

6.備庫建立密碼檔案和SPFILE到ASM

[grid@dbstd ~]$ export ORACLE_SID=+ASM1
[grid@dbstd ~]$ export ORACLE_HOME=/u01/app/12.2.0.1/grid
[grid@dbstd ~]$ export PATH=$ORACLE_HOME/bin:$PATH
[grid@dbstd]$asmcmd –p
ASMCMD [+] > mkdir DATADG /ORDBSTD/PASSWORD
ASMCMD[+]>pwcopy /u01/app/oracle/product/12.2.0.1/dbhome_1/dbs/orapwordbstd +DATADG/ORDBSTD/PASSWORD/pwordbstd
[oracle@dbstd]$ rm /u01/app/oracle/product/12.2.0.1/dbhome_1/dbs/orapwordbstd
[oracle@dbstd ~]$ export ORACLE_HOME=/u01/app/12.2.0.1/dbhome_1
[oracle@dbstd ~]$ export ORACLE_SID=ordbstd
[oracle@dbstd ~]$ export PATH=$ORACLE_HOME/bin:$PATH
[oracle@dbstd]$ sqlplus / as sysdba
SQL> create pfile='/tmp/pfilestd.ora' from spfile;
SQL> create spfile='+DATADG/ORDBSTD/spfileordbstd.ora' from 
pfile='/tmp/pfilestd.ora';
[oracle@dbstd]$ rm /u01/app/oracle/product/12.2.0.1/dbhome_1/dbs/spfileordbstd.ora

7.備庫建立PFILE並且關閉備庫。

[oracle@dbstd]$echo “spfile='+DATADG/ORDBSTD/spfileordbstd.ora'” > /u01/app/oracle/product/12.2.0.1/dbhome_1/dbs/initordbstd.ora
[oracle@dbstd] sqlplus / as sysdba
SQL> shutdown immediate
SQL>exit

8.將備庫註冊到Oracle Restart及啟動備庫。

[oracle@dbstd]$ srvctl add database -db ordbstd -oraclehome /u01/app/oracle/product/12.2.0.1/dbhome_1 -dbtype Single -instance ordbstd -node dbstd -dbname ordbpri -diskgroup DATADG -role physical_standby -spfile '+DATADG/ORDBSTD/spfileordbstd.ora' -pwfile '+DATADG/ORDBSTD/PASSWORD/pwordbstd'
[oracle@dbstd]$ srvctl start database -db ordbstd

至此,完成了DBCA從單例項主庫到建立單例項備庫。


| 作者簡介

楊波,沃趣科技資料庫技術專家
主要參與公司產品實施、測試、維護以及優化。















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2158158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章