物理standby database 環境搭建html
Arch asysncweb
Oracle Dataguard數據庫
hostsession |
IPoracle |
Oracle_sidapp |
DB_unique_name性能 |
FAL_serverui |
FAL_clientthis |
primaryspa |
192.168.126.136 |
dgtest |
dg_pd |
dg_st |
dg_pd |
standy |
192.168.126.128 |
dgtest |
dg_st |
dg_pd |
dg_st |
一. Primary 端的配置
1. 主庫設置爲force logging 模式
SQL> alter database force logging;
2. 主庫設爲歸檔模式
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
3. 建立備庫的密碼文件和控制文件
SQL> alter database create standby controlfile as '/u01/control01.ctl';
-- 說明: 判斷一個數據庫是Primary仍是Standby,就是經過控制文件來判斷的。
[oracle@localhostdbs]$ orapwd file=/u01/orapwDG password=ank88ank
若是已經存在,就不用建立了。 缺省狀況下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感)
4. 修改初始化參數文件
*.DB_UNIQUE_NAME='dg_pd'
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg_pd,dg_st)'
*.log_archive_dest_1='location=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg_pd'
*.LOG_ARCHIVE_DEST_2='SERVICE=dg_st ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg_st '
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.standby_file_management='AUTO'
*.FAL_SERVER='dg_st'
*.FAL_CLIENT='dg_pd'
若是主庫和備庫的數據文件位置不一樣,還須要加以下2個參數:
*.log_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/dgtest/'
*.db_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/dgtest/'
-- 注意:orcl_st,orcl_pd 是在tnsnames文件中配置的
用'/u01/pri.ora' 這個pfile 啓動數據庫,並生成spfile。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile='/u01/pri.ora';
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> create spfile from pfile='/u01/pri.ora';
File created.
6. 修改listener.ora 和tnsnames.ora 文件
Listener.ora 文件:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME =/u01/app/oracle/product/10.2.0/db)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = dg)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db)
(SID_NAME = dgtest)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.32.129)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
注意:SID_LIST_LISTENER 配置的是靜態註冊,若是沒有該參數,並且Data Guard 啓動順序又不正確,那麼在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,致使歸檔沒法完成。
Oracle Listener 動態註冊 與 靜態註冊
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx
Tnsnames.ora 文件
DG_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.32.128)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dg)
)
)
DG_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.32.129)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dg)
)
)
二. Standby 端配置
1. 建立備庫存放數據文件和後臺跟蹤目錄, 這個目錄能夠和主庫相同, 若是不一樣,就須要在主庫的初始化文件中進行轉換。
如:
*.log_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/orcl/'
--建相目錄
mkdir -p $ORACLE_BASE/oradata/dgtest
mkdir $ORACLE_BASE/admin/dgtest
mkdir -p $ORACLE_BASE/admin/dgtest/adump
mkdir $ORACLE_BASE/admin/dgtest/bdump
mkdir $ORACLE_BASE/admin/dgtest/cdump
mkdir $ORACLE_BASE/admin/dgtest/dpdump
mkdir $ORACLE_BASE/admin/dgtest/pfile
mkdir $ORACLE_BASE/admin/dgtest/udump
mkdir $ORACLE_BASE/admin/dgtest/
2. 將主庫的密碼文件,控制文件,數據文件,參數文件,日誌文件copy到備庫。
說明一點,這個控制文件是咱們本身建立的standby 控制文件。將copy過來的控制文件再複製三份就能夠了。 主備的控制文件是不同的。 這裏除了採用直接copy 文件以外,還能夠採用Rman 恢復來作。 直接copy 須要停數據庫,若是採用RMAN 的話,就不須要停機了。
--數據文件,redo文件
scp *.dbf 192.168.32.144:/u01/app/oracle/oradata/dgtest
scp *.log 192.168.32.144:/u01/app/oracle/oradata/dgtest
--密碼文件,參數文件
scp pri.ora 192.168.32.144:/u01
scp orapwdgtest 192.168.32.144:/u01/app/oracle/product/10.2.0/db/dbs
--listener tnsnames
scp listener.ora 192.168.32.144:/u01/app/oracle/product/10.2.0/db/network/admin
scp tnsnames.ora 192.168.32.144:/u01/app/oracle/product/10.2.0/db/network/admin
--standby 控制文件
scp *.ctl 192.168.32.144:/u01/app/oracle/oradata/dgtest/
cp control01.ctl control02.ctl
cp control01.ctl control03.ctl
3. 修改初始化參數文件
*.DB_UNIQUE_NAME='dg_st'
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg_pd,dg_st)'
*.log_archive_dest_1='location=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg_st'
*.LOG_ARCHIVE_DEST_2='SERVICE=dg_pd ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg_pd'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.standby_file_management='AUTO'
*.FAL_SERVER='dg_pd'
*.FAL_CLIENT='dg_sd'
--
保存爲std.ora
4. 修改listener.ora 和 tnsnames.ora 文件,若是不存在,就從主庫上copy 過去。
至此,Data Guard 的操做已經完成,下面來開始驗證。
補充:
啓動備庫
SQL>startup nomount pfile='/u01/std.ora'
SQL>create spfile from pfile='/u01/std.ora'
------------------------------------環境 End-----------------------------------
-----------start------------
--注意Data Guard 啓動順序:
啓動順序:先standby ,後primary;
關閉順序:先primary 後standby;
在備庫將實例啓動到mount 狀態:
SQL> startup nomount;
SQL>alter database mount standby database ;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>alter database recover managed standby database disconnect from session;
在備庫啓動監聽:
$lsnrctl start
在主庫啓動實例:
SQL> startup;
在主庫啓動監聽:
$lsnrctl start
--------------------DataGuard Acitve OK------------
Now
Primary:open
Standby:mount
--Standby只讀模式打開
--中止redo應用
SQL>alter database recover managed standby database cancel
SQL>alter database open;
SQL>select open_mode from v$database;
OPEN_MODE
----------
READ ONLY
--Standby從新回到redo apply狀態
SQL>shutdown immediate
SQL>startup nomount
SQL>alter database mount standby database disconnect
SQL>alter database recover managed standby database disconnect
--驗證是否傳輸到了Standby database
--Primary database
SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
7 23-FEB-11 23-FEB-11
7 23-FEB-11 23-FEB-11
8 23-FEB-11 23-FEB-11
8 23-FEB-11 23-FEB-11
9 23-FEB-11 23-FEB-11
9 23-FEB-11 23-FEB-11
SQL> alter system switch logfile;
System altered.
--Standby database
SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
7 23-FEB-11 23-FEB-11
8 23-FEB-11 23-FEB-11
9 23-FEB-11 23-FEB-11
10 23-FEB-11 23-FEB-11
--驗證Standby redo 是否應用
SQL>SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# APP
---------- ---
3 YES
4 YES
5 YES
6 YES
7 YES
8 YES
9 YES
10 YES
8 rows selected.
--若是出錯
在主庫驗證歸檔目錄是否有效:
SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;
若是有錯誤,要排查緣由。
SQL> SELECT STATUS ,ERROR FROM V$ARCHIVE_DEST;
STATUS ERROR
--------- -----------------------------------------------------------------
VALID
VALID
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
INACTIVE
注意:若是在主庫執行 alter database clear unarchived logfile或alter database open resetlogs , 則dataguard要重建。
補充:
--監控日誌應用服務
SQL>select database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status from v$database;
--設置新的數據保護模式並重啓數據庫
當保護模式更改順序:
maximize protection ---> maximize availability ----> maximize performance
當在把dataguard的保護級別按這上面的順序減低的時候, 不須要primary庫在mount狀態,不然primary 必須在mount 狀態。
如:
SQL> alter database set standby database to maximize availability;
alter database set standby database to maximize availability
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any
instance
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database set standby database to maximize availability;
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
報錯了,這是由於最大可用性須要先修改日誌傳送方式爲lgwr同步方式,不然,數據庫是沒法open.
SQL> alter system set log_archive_dest_2='service=orcl_st lgwr sync AFFIRM';
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database set standby database to maximize availability;
Database altered.
SQL> alter database open;
Database altered.
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
alter database set standby database to maximize performance;
提示:maximize後可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分別對應最大保護,最高可用性及最高性能。
在最大保護模式下,直接關閉備庫是不行的,若是在備庫上關閉數據庫,會有以下提示:
SQL> shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL>
在最大保護模式下,備庫是不容許關閉的,此時首先關閉主庫,而後備庫就能夠順利關閉了
注意: 主庫的保護模式修改以後,備庫的模式也會改變,和主庫保持一致。
3. 查看日誌歸檔狀況
主庫進行日誌切換:
SQL>Alter system switch logfile;
select max(sequence#) from v$archived_log;
select max(sequence#) from v$log_history;
select group#,sequence#,archived,status from v$log;
select name,sequence#,applied from v$archived_log;
select sequence#,applied from v$archived_log;
若不一樣步,
1>看log日誌, archive是否有丟失
2>能夠在備庫坐以下操做:
--中止redo apply
alter database recover managed standby database cancel;
--開始redo apply
alter database recover managed standby database disconnect from session;