五一假期期間,閒來無事,測試了下oracle 11g異構下的dataguard,主庫採用rhel5.4 64位系統,備庫採用winxp sp1 32位系統,數據庫軟件採用當前最新的11.2.0.3版本!事先聲明,本文只用於測試環境,各位看官若用在生產環境,請三思,且慎重!
環境介紹:
主庫
IP地址:192.168.1.63/24
操作系統版本:rhel5.4 64bit
數據庫版本:11.2.0.3 64bit
數據庫sid名:dg
數據庫名:dg
數據庫db_unique_name:dg3
備庫1 物理備庫
IP地址:192.168.1.103/24
操作系統版本:winxp sp1 32位(有條件的話應該用win2003 server版)
數據庫版本:11.2.0.3 32bit
數據庫sid名:dg
數據庫名:dg
數據庫db_unique_name:dg4
在開始之前,還是先上MOS上找找相關的資料,看看能不能做!
主庫id爲13的情況下,備庫id可以選擇爲7,但是必須要11g以後,且要搞定bug13104881
貌似這個bug在11.2.0.3中沒有被修復,但是認真看下,這個bug隻影響主庫爲windows,備庫爲linux的情況,也就是說,本例是個灰色地帶了,那就用實踐證明下吧!
一:配置主,備庫的listener.ora和tnsnames.ora文件如下
- [oracle@dg3 ~]$ cat $TNS_ADMIN/listener.ora
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- (GLOBAL_DBNAME = dg.yang.com)
- (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db1)
- (SID_NAME = dg)
- )
- )
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = dg3.yang.com)(PORT = 1521))
- )
- )
- )
- [oracle@dg3 ~]$ cat $TNS_ADMIN/tnsnames.ora
- DG3 =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.63)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = dg2.yang.com)
- )
- )
- DG4 =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = dg4.yang.com)
- )
- )
- C:\app\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- (SID_NAME = dg)
- (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
- (GLOBAL_DBNAME=dg.yang.com)
- )
- )
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.103)(PORT = 1521))
- )
- )
- ADR_BASE_LISTENER = C:\app\oracle
- C:\app\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
- DG3 =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.63)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = dg.yang.com)
- )
- )
- DG4 =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = dg.yang.com)
- )
- )
- C:\>lsnrctl services
- LSNRCTL for 32-bit Windows: Version 11.2.0.3.0 - Production on 30-4月 -2012 16:0
- 5:13
- Copyright (c) 1991, 2011, Oracle. All rights reserved.
- 正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.103)(PORT=1521)))
- 服務摘要..
- 服務 "dg.yang.com" 包含 1 個實例。
- 實例 "dg", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
- 處理程序:
- "DEDICATED" 已建立:0 已被拒絕:0
- LOCAL SERVER
- 命令執行成功
二:在主庫上修改dg相關的參數,異構DG下,文件系統的路徑一定不一致,所以需要注意db_file_name_convert和log_file_name_convert兩個初始化參數的設置
- [oracle@dg3 ~]$ sqlplus /nolog
- SQL*Plus: Release 11.2.0.3.0 Production on Mon Apr 30 16:09:15 2012
- Copyright (c) 1982, 2011, Oracle. All rights reserved.
- SQL> conn /as sysdba
- Connected.
- SQL> alter database force logging;
- Database altered.
- SQL> alter system set db_unique_name='dg3' scope=spfile;
- System altered.
- SQL> alter system set log_archive_config='DG_CONFIG=(dg3,dg4)';
- System altered.
- SQL> alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog valid_for=(all_logfiles,primary_role) db_unique_name=dg3' scope=spfile;
- System altered.
- SQL> alter system set log_archive_dest_2='SERVICE=dg4 lgwr sync valid_for=(online_logfile,primary_role)
- db_unique_name=dg4';
- System altered.
- SQL> alter system set log_archive_dest_3='LOCATION=/u01/app/oracle/standbylog valid_for=(standby_logfile,standby_role) db_unique_name=dg3' scope=spfile;
- System altered.
- SQL> alter system set fal_server='dg4';
- System altered.
- SQL> alter system set fal_client='dg3';
- System altered.
- SQL> alter system set standby_file_management='auto';
- System altered.
- SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/dg','c:\app\oracle\oradata\dg' scope=spfile;
- System altered.
- SQL> alter system set log_file_name_convert=''/u01/app/oracle/oradata/dg','c:\app\oracle\oradata\dg' scope=spfile;
- System altered.
- SQL> alter system set log_archive_dest_state_3='defer';
- System altered.
三:重啓主庫後,添加standby日誌組,並根據spfile文件生成pfile文件
- SQL> shutdown immediate
- Database closed.
- Database dismounted.
- ORACLE instance shut down.
- SQL> startup
- ORACLE instance started.
- Total System Global Area 417546240 bytes
- Fixed Size 2228944 bytes
- Variable Size 327159088 bytes
- Database Buffers 79691776 bytes
- Redo Buffers 8466432 bytes
- Database mounted.
- Database opened.
- SQL> alter database add standby logfile group 4 '/u01/app/oracle/oradata/dg/standby04.dbf' size 50M;
- Database altered.
- SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/dg/standby05.dbf' size 50M;
- Database altered.
- SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/dg/standby06.dbf' size 50M;
- Database altered.
- SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/dg/standby07.dbf' size 50M;
- Database altered.
- SQL> create pfile='/home/oracle/initdg.ora' from spfile;
- File created.
四:修改pfile文件如下,注意紅色字體部分,修改完成後將文件傳輸到備庫,winscp,samba,ftp啦,這裏大家就各顯神通吧!
[oracle@dg3 ~]$ cat initdg.ora |
五:配置備庫,windows平臺的oracle和linux很不一樣,linux平臺下備庫只需要安裝數據庫軟件即可,而在windows平臺下,需要先建庫,否則使用conn /as sysdba方式登錄數據庫會提示下圖中的錯誤,主要是因爲相關的windows服務不存在!不知道這裏是不是可以採取其他的方法解決,在本例中,先使用dbca創建一個數據庫,實例名和數據庫均爲dg,然後關閉數據庫實例後,刪除對應的數據文件!
六:啓動備庫到nomount狀態,在主庫端檢測數據庫的是否可以正常連接
- C:\>sqlplus /nolog
- SQL*Plus: Release 11.2.0.3.0 Production on 星期一 4月 30 16:37:06
- Copyright (c) 1982, 2011, Oracle. All rights reserved.
- SQL> conn /as sysdba
- 已連接到空閒例程。
- SQL> create spfile from pfile='c:\initdg.ora';
- 文件已創建。
- SQL> startup nomount
- ORACLE 例程已經啓動。
- Total System Global Area 418484224 bytes
- Fixed Size 1385052 bytes
- Variable Size 327159204 bytes
- Database Buffers 83886080 bytes
- Redo Buffers 6053888 bytes
- [oracle@dg3 admin]$ sqlplus sys/123456@dg3 as sysdba
- SQL*Plus: Release 11.2.0.3.0 Production on Mon Apr 30 16:47:26 2012
- Copyright (c) 1982, 2011, Oracle. All rights reserved.
- Connected to:
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL> select * from v$version;
- BANNER
- --------------------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- PL/SQL Release 11.2.0.3.0 - Production
- CORE 11.2.0.3.0 Production
- TNS for Linux: Version 11.2.0.3.0 - Production
- NLSRTL Version 11.2.0.3.0 - Production
- SQL> exit
- Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- [oracle@dg3 admin]$ sqlplus sys/123456@dg4 as sysdba
- SQL*Plus: Release 11.2.0.3.0 Production on Mon Apr 30 16:47:32 2012
- Copyright (c) 1982, 2011, Oracle. All rights reserved.
- Connected to:
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL> select * from v$version;
- BANNER
- --------------------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
- PL/SQL Release 11.2.0.3.0 - Production
- CORE 11.2.0.3.0 Production
- TNS for 32-bit Windows: Version 11.2.0.3.0 - Production
- NLSRTL Version 11.2.0.3.0 - Production
- SQL> exit
- Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
七:在主庫上使用rman進行duplicate操作
[oracle@dg3 ~]$ rman target sys/123456@dg3 auxiliary sys/123456@dg4 connected to target database: DG (DBID=1695308537) RMAN> duplicate target database for standby from active database; Starting Duplicate Db at 2012-04-30-17:16:48 contents of Memory Script: Starting backup at 2012-04-30-17:16:49 contents of Memory Script: Starting backup at 2012-04-30-17:16:51 STAMP=781982213 Starting restore at 2012-04-30-17:16:58 channel ORA_AUX_DISK_1: copied control file copy contents of Memory Script: sql statement: alter database mount standby database contents of Memory Script: executing command: SET NEWNAME renamed tempfile 1 to C:\APP\ORACLE\ORADATA\DG\TEMP01.DBF in control file executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting backup at 2012-04-30-17:17:12 sql statement: alter system archive log current contents of Memory Script: datafile 1 switched to datafile copy |
八:檢查主庫的數據文件和日誌文件,將備庫置於ADG模式下
- [oracle@dg3 ~]$ sqlplus sys/123456@dg4 as sysdba
- SQL*Plus: Release 11.2.0.3.0 Production on Mon Apr 30 17:24:59 2012
- Copyright (c) 1982, 2011, Oracle. All rights reserved.
- Connected to:
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL> select member from v$logfile;
- MEMBER
- --------------------------------------------------------------------------------
- C:\APP\ORACLE\ORADATA\DG\REDO03.LOG
- C:\APP\ORACLE\ORADATA\DG\REDO02.LOG
- C:\APP\ORACLE\ORADATA\DG\REDO01.LOG
- C:\APP\ORACLE\ORADATA\DG\STANDBY04.DBF
- C:\APP\ORACLE\ORADATA\DG\STANDBY05.DBF
- C:\APP\ORACLE\ORADATA\DG\STANDBY06.DBF
- C:\APP\ORACLE\ORADATA\DG\STANDBY07.DBF
- 7 rows selected.
- SQL> select name from v$datafile;
- NAME
- --------------------------------------------------------------------------------
- C:\APP\ORACLE\ORADATA\DG\SYSTEM01.DBF
- C:\APP\ORACLE\ORADATA\DG\SYSAUX01.DBF
- C:\APP\ORACLE\ORADATA\DG\UNDOTBS01.DBF
- C:\APP\ORACLE\ORADATA\DG\USERS01.DBF
- SQL> select open_mode,database_role,db_unique_name from v$database;
- OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
- -------------------- ---------------- ------------------------------
- MOUNTED PHYSICAL STANDBY dg4
- SQL> alter database open;
- Database altered.
- SQL> select open_mode,database_role,db_unique_name from v$database;
- OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
- -------------------- ---------------- ------------------------------
- READ ONLY PHYSICAL STANDBY dg4
- SQL> alter database recover managed standby database using current logfile disconnect from session;
- Database altered.
- SQL> select open_mode,database_role,db_unique_name from v$database;
- OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
- -------------------- ---------------- ------------------------------
- READ ONLY WITH APPLY PHYSICAL STANDBY dg4
- SQL> archive log list;
- Database log mode Archive Mode
- Automatic archival Enabled
- Archive destination c:\app\oracle\standbylog
- Oldest online log sequence 14
- Next log sequence to archive 0
- Current log sequence 14
- SQL> select applied,sequence# from v$archived_log where sequence# >10;
- APPLIED SEQUENCE#
- --------- ----------
- YES 12
- YES 11
- IN-MEMORY 13
九:測試數據是否實時同步
- SQL> archive log list;
- Database log mode Archive Mode
- Automatic archival Enabled
- Archive destination /u01/app/oracle/standbylog
- Oldest online log sequence 12
- Next log sequence to archive 14
- Current log sequence 14
- SQL> create table t as select * from v$database;
- Table created.
- SQL> conn sys/123456@dg4 as sysdba
- Connected.
- SQL> desc t;
- Name Null? Type
- ----------------------------------------- -------- ----------------------------
- DBID NUMBER
- NAME VARCHAR2(9)
- CREATED DATE
- RESETLOGS_CHANGE# NUMBER
- RESETLOGS_TIME DATE
- PRIOR_RESETLOGS_CHANGE# NUMBER
- PRIOR_RESETLOGS_TIME DATE
- LOG_MODE VARCHAR2(12)
- CHECKPOINT_CHANGE# NUMBER
- ARCHIVE_CHANGE# NUMBER
- CONTROLFILE_TYPE VARCHAR2(7)
- CONTROLFILE_CREATED DATE
- CONTROLFILE_SEQUENCE# NUMBER
- CONTROLFILE_CHANGE# NUMBER
- CONTROLFILE_TIME DATE
- OPEN_RESETLOGS VARCHAR2(11)
- VERSION_TIME DATE
- OPEN_MODE VARCHAR2(20)
- PROTECTION_MODE VARCHAR2(20)
- PROTECTION_LEVEL VARCHAR2(20)
- REMOTE_ARCHIVE VARCHAR2(8)
- ACTIVATION# NUMBER
- SWITCHOVER# NUMBER
- DATABASE_ROLE VARCHAR2(16)
- ARCHIVELOG_CHANGE# NUMBER
- ARCHIVELOG_COMPRESSION VARCHAR2(8)
- SWITCHOVER_STATUS VARCHAR2(20)
- DATAGUARD_BROKER VARCHAR2(8)
- GUARD_STATUS VARCHAR2(7)
- SUPPLEMENTAL_LOG_DATA_MIN VARCHAR2(8)
- SUPPLEMENTAL_LOG_DATA_PK VARCHAR2(3)
- SUPPLEMENTAL_LOG_DATA_UI VARCHAR2(3)
- FORCE_LOGGING VARCHAR2(3)
- PLATFORM_ID NUMBER
- PLATFORM_NAME VARCHAR2(101)
- RECOVERY_TARGET_INCARNATION# NUMBER
- LAST_OPEN_INCARNATION# NUMBER
- CURRENT_SCN NUMBER
- FLASHBACK_ON VARCHAR2(18)
- SUPPLEMENTAL_LOG_DATA_FK VARCHAR2(3)
- SUPPLEMENTAL_LOG_DATA_ALL VARCHAR2(3)
- DB_UNIQUE_NAME VARCHAR2(30)
- STANDBY_BECAME_PRIMARY_SCN NUMBER
- FS_FAILOVER_STATUS VARCHAR2(22)
- FS_FAILOVER_CURRENT_TARGET VARCHAR2(30)
- FS_FAILOVER_THRESHOLD NUMBER
- FS_FAILOVER_OBSERVER_PRESENT VARCHAR2(7)
- FS_FAILOVER_OBSERVER_HOST VARCHAR2(512)
- CONTROLFILE_CONVERTED VARCHAR2(3)
- PRIMARY_DB_UNIQUE_NAME VARCHAR2(30)
- SUPPLEMENTAL_LOG_DATA_PL VARCHAR2(3)
- MIN_REQUIRED_CAPTURE_CHANGE# NUMBER