搭建 physical standby——copy資料檔案
一、DG環境說明
資料庫版本:11.2.0.1.0
作業系統:redhat linux 5
主庫:192.168.88.3 sharon
備庫:192.168.88.2 sharon
使用靜態IP,要確保IP是固定的,不要用DHCP來分配!
二、具體步驟
1. 啟動force logging
SQL> ALTER DATABASE FORCE LOGGING;
檢查:
SQL> select force_logging from v$database;
FORCE_LOG
---------
YES
2. 啟動歸檔模式
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter system setlog_archive_dest_1='location=/u01/arch/' scope=spfile;
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/arch/
Oldest online log sequence 91
Next log sequence to archive 92
Current log sequence 92
3. 檢查口令檔案
[oracle@sharon ~]$ cd $ORACLE_HOME/dbs
[oracle@sharon dbs]$ ll
total 44
-rw-rw---- 1 oracle oinstall 1544 Apr 21 12:35 hc_sharon.dat
-rw-r----- 1 oracle oinstall12920 May 3 2001 initdw.ora
-rw-r----- 1 oracle oinstall 8385 Sep 11 1998 init.ora
-rw-rw---- 1 oracle oinstall 24 Apr 21 12:43 lkSHARON
-rw-r----- 1 oracleoinstall 1536 Apr 21 12:46 orapwsharon
-rw-r----- 1 oracle oinstall 3584 Apr 22 09:01 spfilesharon.ora
如果不存在,手工建立,使用orapwd命令。 這個命令怎麼用,就不多做說明,不清楚的google一下:
[oracle@dg1 /]$ orapwd file=/u01/app/oracle/product/11.2.0/db_1/dbs/ orapwdave password=admin entries=30
4. 在主備庫分別建立listener,並啟動
用netca命令來調用圖形化介面建立!
5.在主備庫添加Oracle Net Service(tnsnames.ora),配置靜態監聽
使用netmgr命令來調用圖形化介面建立。
配置靜態監聽:
注意大小寫。有一次做的時候,執行個體名是大寫的,配置的動態監聽中sid 寫成了小寫,導致rman duplicate的時候連不上!
【說明】
*4、5兩步可以一起用netmgr來做,一次性搞定,比較方便!
*可以直接修改listener.ora,tnsnames.ora來配置監聽和oraclenet service,但是不建議這麼做,很容易出錯,多一個空格少一個空格就可能導致服務無法用,還是建議用工具來配置!
*配置靜態監聽預設連接埠號碼為1521,若衝突配置其他的連接埠號碼需要手工註冊以下。
[oracle@sharon admin]$ netmgr
[oracle@sharon admin]$ cat tnsnames.ora
# tnsnames.ora NetworkConfiguration File:/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generatedby Oracle configuration tools.
--注意我這裡的提示,它是使用工具產生的。
SHARON_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sharon)
)
)
SHARON_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.88.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sharon)
)
)
[oracle@sharon admin]$ cat listener.ora
# listener.ora NetworkConfiguration File:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generatedby Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = sharon)
(ORACLE_HOME =/u01/app/oracle/product/11.2.0/dbs)
(SID_NAME = sharon)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.88.3)(PORT =
1521))
)
)
配置好重啟下監聽:
[oracle@sharon admin]$ lsnrctl stop
[oracle@sharon admin]$ lsnrctl start
[oracle@sharon admin]$ lsnrctl status
LSNRCTL for Linux: Version11.2.0.1.0 - Production on 24-APR-2013 10:40:28
Copyright (c) 1991, 2009,Oracle. All rights reserved.
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.88.2)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version11.2.0.1.0 - Production
Start Date 24-APR-2013 10:40:03
Uptime 0 days 0 hr. 0 min. 26 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/sharon/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.88.2)(PORT=1521)))
Services Summary...
Service "sharon" has 1instance(s).
Instance "sharon", status UNKNOWN,has 1 handler(s) for this service...
The command completedsuccessfully
*狀態為UNKNOWN就代表是靜態監聽
tnsping下各服務,看是否通
[oracle@sharon admin]$ tnsping sharon_pd
TNS Ping Utility for Linux: Version 11.2.0.1.0- Production on 26-APR-2013 09:52:51
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.3)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = sharon_pd)))
OK (0 msec)
[oracle@sharon admin]$ tnsping sharon_st
TNS Ping Utility for Linux: Version 11.2.0.1.0- Production on 26-APR-2013 09:52:51
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.2)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = sharon_st)))
OK (0 msec)
6.在主庫建立standbycontrol file
這裡一定要把資料庫啟動到mount狀態來建立:
SQL> alter database create standby controlfile as '/u01/control01.ctl';
*資料庫執行個體是會不停地更新控制檔案的,因為如果我們不關閉執行個體,直接把資料檔案copy到備庫,這個操作上是沒有問題的,但是當我們開啟資料庫的時候,一定會提示我們如下的錯誤:
ORA-10458: standbydatabase requires recovery
ORA-01194: file 1 needsmore recovery to be consistent
ORA-01110: data file 1:'/u01/app/oracle/oradata/dave/system01.dbf'
我們說的copy 方法,就是直接把資料檔案,online redo 檔案直接copy到備庫。
主庫一直保持mount
狀態!
7.在主庫建立pfile檔案並修改pfile內容
SQL> create pfile from spfile;
在pfile添加如下內容:
#add for primary dg
*.db_unique_name='sharon_pd'
*.log_archive_config='dg_config=(sharon_pd,sharon_st)'
*.log_archive_dest_1='location=/u01/archlog valid_for=(all_logfiles,all_roles) db_unique_name=sharon_pd'
*.log_archive_dest_2='service=sharon_st reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=sharon_st'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.standby_file_management='auto'
*.fal_server='sharon_st'
*.fal_client=’sharon_pd’ –10g 要寫!11g不需要寫!
注意:
(1)在oracle 11g中,廢棄了fal_client 參數,也就是說不用配置。
(2)log_archive_dest_n 這個參數中的Oracle Net Service名首位是一樣的,前面寫哪個,最後的db_unique_name就寫哪個,不要搞錯了。
(3)如果主備庫的路徑不同,修改在主庫的參數檔案裡添加如下2個參數:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
--用修改過的pfile重建spfile:
Shutdown 再建立
用pfile啟動到mount
SQL>startup mount pfile=’$ORACLE_HOME/dbs/initsharon.ora’;
SQL> create spfile from pfile;
8.在備庫建立相關的目錄
因為我們的備庫沒有建立執行個體,所以是沒有相關的目錄的,我們需要參考主庫的位置來建立。
以免遺漏可以看主庫的pfile來建立!
[oracle@sharon oracle]$ pwd
/u01/app/oracle
[oracle@sharon oracle]$ ls
admin checkpoints diag fast_recovery_area oradata product
--FRA:
[oracle@sharon sharon]$ pwd
/u01/app/oracle/fast_recovery_area/sharon
--DATAFILE:
[oracle@sharon sharon]$ pwd
/u01/app/oracle/oradata/sharon
[oracle@sharon sharon]$ pwd
/u01/app/oracle/admin/Sharon
[oracle@sharon sharon]$ mkdir –p /u01/app/oracle/oradata/sharon
[oracle@sharon sharon]$ mkdir –p /u01/app/oracle/fast_recovery_area/sharon
[oracle@sharon sharon]$ mkdir –p /u01/app/oracle/admin/sharon/adump
[oracle@sharon sharon]$ mkdir –p /u01/app/oracle/admin/sharon/dpdump
9. 將主庫的參數檔案copy到備庫並修改
[oracle@sharon dbs]$ scp initsharon.ora 192.168.88.2:/u01/app/oracle/product/11.2.0/db_1/dbs
參數檔案,我們在主庫的pfile中已經修改,我們這裡只需要該2個參數即可:
#add for standby dg
*.db_unique_name='sharon_st'
*.log_archive_config='dg_config=(sharon_pd,sharon_st)'
*.log_archive_dest_1='location=/u01/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=sharon_st'
*.log_archive_dest_2='service=sharon_pd reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=sharon_pd'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.standby_file_management='auto'
*.fal_server='sharon_pd'
*.fal_client='sharon_st' --10g要寫!11g不用寫!
10.將主庫的密碼檔案,控制檔案,資料檔案,記錄檔copy到備庫
--口令檔案:
[oracle@sharon dbs]$ scp orapwsharon 192.168.88.2:/u01/app/oracle/product/11.2.0/db_1/dbs
--控制檔案:
--從備庫取:注意修改了控制檔案的名稱:
[oracle@sharon sharon]$ scp 192.168.88.3:/u01/control01.ctl /u01/app/oracle/oradata/sharon/control01.ctl
[oracle@sharon sharon]$ scp 192.168.88.3:/u01/control01.ctl /u01/app/oracle/fast_recovery_area/sharon/control02.ctl
注意:11g的控制檔案在不同的目錄下面,control02.ctl在FRA中!
--資料檔案
[oracle@sharon sharon]$ scp 192.168.88.3:/u01/app/oracle/oradata/sharon/*.dbf /u01/app/oracle/oradata/sharon/
11.啟動備庫並應用applyservice
[oracle@sharon sharon]$sqlplus / as sysdba
--11g直接startup
SQL> startup
SQL> select open_modefrom v$database;
OPEN_MODE
--------------------
READONLY
--10g:
SQL> startup nomount;
SQL>alter database mount standby database ;
SQL>alter database recover managed standby database disconnect from session;
12. 將主庫啟動到open 狀態並檢查DG 配置是否有錯誤
我們在建立standby 控制檔案的是,把主庫啟動到mount狀態的。
SQL> alter database open;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
--查詢DG 狀態:
SQL> col error for a10
SQL> col dest_name for a20
SQL> select DEST_NAME,STATUS,PROCESS,ERROR,TRANSMIT_MODE from v$archive_dest WHERE TARGET='STANDBY';
DEST_NAME STATUS PROCESS ERROR TRANSMIT_MOD
-------------------- --------- ---------- ---------- ------------
LOG_ARCHIVE_DEST_2 VALID LGWR ASYNCHRONOUS
如果DG 配置的有問題,這裡會顯示INVALID,並且error 會提示具體的錯誤原因,也可以查看alert log 來確定原因。
13. 在主備庫添加online redo log 和standby redo log
--主庫添加standby redo log:大小和online redo
相同,比online redo group
多一組。
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4('/u01/app/oracle/sharon/redo04.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5('/u01/app/oracle/sharon/redo05.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6('/u01/app/oracle/sharon/redo06.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7('/u01/app/oracle/sharon/redo07.log') size 50M;
--驗證:
SQL> col member for a50
SQL> select group#,type, member from v$logfile;
--備庫執行
SQL> col member for a50
SQL> select group#,type, member from v$logfile;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4('/u01/app/oracle/oradata/sharon/redo04.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5('/u01/app/oracle/oradata/sharon/redo05.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6('/u01/app/oracle/oradata/sharon/redo06.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7('/u01/app/oracle/oradata/sharon/redo07.log') size 50M;
--驗證:
SQL> col member for a50
SQL> select group#,type, member from v$logfile;
--Oracle 11g的物理standby 備庫是啟動到read-only狀態的
SQL> alter database recover managed standbydatabase disconnect from session;
Database altered.
11g
SQL> select open_modefrom v$database;
OPEN_MODE
--------------------
READ ONLY WITH APPLY
測試:
--主庫:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
23
SQL> alter system switch logfile;
System altered.
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
24
--查詢DG 狀態:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
24
SQL> col error for a10
SQL> col dest_name for a20
SQL>select DEST_NAME,STATUS,PROCESS,ERROR,TRANSMIT_MODEfrom v$archive_dest WHERE TARGET='STANDBY';
DEST_NAME STATUS PROCESS ERROR TRANSMIT_MOD TARGET
----------------------------- ---------- ---------- ------------ -------
LOG_ARCHIVE_DEST_2 VALID LGWR ASYNCHRONOUS
STANDBY
注意:
當監聽不在1521連接埠時,就需要設定local_listener參數。
將監聽的資訊添加到tnsnames.ora 檔案中。pmon在動態註冊監聽時要從tnsnames.ora中讀取資訊。
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =TCP)(HOST = IP)(PORT = 1522))
)
然後以sys用戶運行:
SQL> alter system setlocal_listener=listener;
SQL> alter system register;
或者:
SQL> alter system setLOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1522))';
SQL> alter system register;