盡管網上有很多Oracle Dataguard的配置教程,但不難發現,很多采用的是rman duplicate這種方法,盡管此種方法較為簡便。但在某種程度上,卻也誤導了初學者,雖說也能配置成功,但只知其然不知其所以然,Dataguard的本質沒有吃透,也不利於其維護和調優。
本配置文檔基於Oracle官方文檔,目的在於加深大家對於Dataguard的了解。
本配置的結果是最大性能模式下的異步傳輸 ,因此在參數文件中,只涉及基本的主備參數,沒有考慮switchover和最大性能模式下的real time apply。在監聽的配置中,也沒有考慮Data Guard Broker的應用情況
配置環境:
主庫: 備庫:
操作系統版本: Oracle Linux 6.3 Oracle Linux 6.3
數據庫版本: Oracle 11.2.0.1.0 Oracle 11.2.0.1.0
主機名: node1.being.com node2.being.com
IP: 192.168.1.11 192.168.1.12
db_name orcl victor
db_unique_name orcl orcl
instance_name orcl victor
service_names orcl victor
注意:1. Dataguard中只需要db_unique_name保持一致即可
2. 主庫中除了安裝Oracle軟件以外,還需要dbca建庫。而備庫中,只需要安裝Oracle軟件即可,即在./runInstaller安裝過程中,第三步選擇install software only
即可
3. 主備庫的ORACLE_BASE=/u01/app/oracle,ORACLE_HOME=$ORACLE_BASE/product/11.2.0.1/db_1
一、配置監聽
1> 主庫上
[oracle@node1 ~]$ cd $ORACLE_HOME/network/admin/
[oracle@node1 admin]$ cat tnsnames.ora
TO_VICTOR = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.12)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = victor) ) )
其中to_victor為網絡服務名,在后面配置log_archive_dest_2和fal_server中會用到
2> 備庫上
[oracle@node2 ~]$ cd $ORACLE_HOME/network/admin/
[oracle@node2 admin]$ cat tnsnames.ora
TO_ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
注意:該配置只是基於基本的Dataguard配置,沒有考慮Dataguard broker的配置
二、主庫環境准備 -->> 在node1上操作
1> 將數據庫設置為歸檔模式
SQL> archive log list -->>若Database log mode為No Archive Mode,則表示該數據庫運行在非歸檔模式下。進行以下操作
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
2> 將數據庫設置為Force Logging模式
SQL> select force_logging from v$database; -->>若為NO,則進行以下操作
SQL> alter database force logging;
3> 修改主庫參數文件
SQL> alter system set log_archive_config='dg_config=(orcl,victor)';
-->> 代表該Dataguard是兩個節點,一主一從,若要配置多個節點,則需要在此處添加。
SQL> alter system set log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(online_logfiles,primary_role) db_unique_name=orcl';
-->> location代表本地歸檔。在這里我們使用閃回區作為在線日志文件的歸檔目錄,在實際生產環境中,如果歸檔日志是歸檔在本地文件系統上,不建議使用閃回區,因為閃回區和數據庫軟件是在同一個目錄下,如果歸檔日志過多,閃回區空間增長過快,容易造成磁盤空間不足,這樣容易使數據庫掛掉。valid_for代表該歸檔目錄只有在該庫為主庫,歸檔在線日志文件時才有效。
SQL> alter system set log_archive_dest_2='service=to_victor async valid_for=(online_logfiles,primary_role) db_unique_name=victor';
-->> service后面接的是網絡服務名
SQL> alter system set log_archive_dest_state_1='enable';
SQL> alter system set log_archive_dest_state_2='enable';
SQL> alter system set remote_login_passwordfile=exclusive scope=spfile; -->> 設置密碼文件的權限,該設置需重啟數據庫才能生效
SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile; -->> 設置歸檔日志的格式,該設置需重啟數據庫才能生效
-->> 最后兩項可不用顯性設定
三、 為備庫創建各種文件 -->> 在node1上操作
1> 密碼文件
[oracle@node1 ~]$ cd $ORACLE_HOME/dbs/
[oracle@node1 dbs]$ orapwd file=orapworcl entries=5 force=y password=oracle
2> 參數文件
SQL> create pfile='/home/oracle/orcl.ora' from spfile;
3> 備份數據庫
對數據庫做備份有多種辦法,包括冷備、在線熱備、RMAN備份,在這里我們使用RMAN備份
[oracle@node1 ~]$ mkdir /home/oracle/rman
[oracle@node1 ~]$ rman target /
RMAN> backup database format '/home/oracle/rman/full_%U';
4> 備份控制文件
SQL> alter system switch logfile;
SQL> alter database create standby controlfile as '/home/oracle/victor.ctl';
四、將上述四類文件copy到備庫
[oracle@node1 ~]$ scp $ORACLE_HOME/dbs/orapworcl oracle@192.168.1.12:/u01/app/oracle/product/11.2.0.1/db_1/dbs/orapwvictor
[oracle@node1 ~]$ scp /home/oracle/orcl.ora oracle@192.168.1.12:/home/oracle/victor.ora
[oracle@node1 ~]$ scp -r /home/oracle/rman/ oracle@192.168.1.12:/home/oracle/rman
[oracle@node1 ~]$ scp /home/oracle/victor.ctl oracle@192.168.1.12:/home/oracle
五、 創建備庫
1> 修改參數文件
[oracle@node2 ~]$ vim victor.ora
*.audit_file_dest='/u01/app/oracle/admin/victor/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/u01/app/oracle/oradata/victor/control01.ctl' *.db_block_size=8192 *.db_domain='' *.db_name='orcl' db_unique_name=victor *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(protocol=TCP)' *.log_archive_config='dg_config=(orcl,victor)' *.log_archive_dest_1='location=/u01/archivelog valid_for=(standby_logfiles,standby_role) db_unique_name=victor' *.log_archive_dest_state_1='enable' *.memory_target=471859200 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.shared_servers=1 *.undo_tablespace='UNDOTBS1' fal_server=to_orcl db_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/victor/' log_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/victor/’
standby_file_management=auto
2> 創建參數文件中相應的目錄
[oracle@node2 ~]$ mkdir -p /u01/app/oracle/admin/victor/adump
[oracle@node2 ~]$ mkdir /u01/archivelog
[oracle@node2 ~]$ mkdir -p /u01/app/oracle/oradata/victor
[oracle@node2 ~]$ cp /home/oracle/victor.ctl /u01/app/oracle/oradata/victor/control01.ctl
3> 創建備庫
[oracle@node2 ~]$ sqlplus / as sysdba
SQL> create spfile from pfile='/home/oracle/victor.ora';
SQL> startup mount
[oracle@node2 ~]$ rman target /
RMAN> restore database;
RMAN> alter database open;
SQL> alter database recover managed standby database disconnect from session;
六、測試
1> 在備庫上查詢歸檔日志的序列號
SQL> select sequence# from v$archived_log;
2> 在主庫上切換一次日志
SQL> alter system switch logfile;
3> 在備庫上查詢歸檔日志的序列號,看是否有增加
SQL> select sequence# from v$archived_log;
4> 在備庫上查詢歸檔日志是否被應用
SQL> select sequence#,applied from v$archived_log;
當然,也可以用具體案例進行測試,譬如在主庫中新建一張表,對表進行增、刪、改,然后切換日志,看備庫能否應用。