ORACLE Dataguard安裝
2011-02-25 15:58:23| 分類: 數據庫之Oracle | 標籤:oracle dataguard |字號大中小 訂閱
1 前言
1.1 Dataguard實施前準備
Oracle安裝分包括2塊,安裝DB 軟件和升級。 如果是10g的話,可以先將DB升級到10.2.0.5。 升級的原因是爲了避免某些bug。先安裝軟件,升級,升級完在用DBCA 創建實例。 這樣比安裝DB 和創建實例之後升級要簡單點。
(1)redo 文件默認是50M,改成100M
(2)每個redo group裏改成2個 redo logfile。 大小100M (只保留2組red log)
(3)檢查一下字符集:ZHS16GBK
(4)設置SGA,PGA 大小。
OLTP 系統一般的規則是:
SGA=內存*80%*80%
PGA=內存*80%*20%
註釋: 本次實施中 {SID} = oratest
2 Dataguard實施步驟
2.1 Primary端設置
2.1.1 設置oracle爲歸檔模式
查看當前歸檔模式情況: archive log list
設置本地歸檔目錄: 修改init{SID}.ora文件
*.log_archive_dest_1='LOCATION=/home/ora_arch'
*.log_archive_format='%t_%s_%r.dbf'
注意:
oracle startup啓動數據庫查詢啓動文件的順序:
1. spfile{SID}.ora文件 (爲二進制文件不可以手動更改)
2. spfile.ora文件
3. init{SID}.ora文件 (可以更改)
4. pfile.ora文件
設置爲歸檔模式,命令如下:
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
2.1.2 設置主數據庫爲force logging 模式
SQL> alter database force logging;
2.1.3 添加red log file
添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重複),併爲該組指定一個成員
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 100M;
2.1.4 創建備庫的密碼文件和控制文件
SQL> alter database create standby controlfile as '/home/u01/control01.ctl';
-- 說明: 判斷一個數據庫是Primary還是Standby,就是通過控制文件來判斷的。
拷貝/home/u01/product/10R2/db/dbs/orapw{SID} 至 /home/u01.
2.1.5 修改初始化參數文件
SQL> create pfile='/home/u01/initorcl.ora' from spfile;
在initorcl.ora 添加如下內容:
*.DB_UNIQUE_NAME='PRIMARY'
*.FAL_CLIENT='primary'
*.FAL_SERVER='standby'
*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'
*.log_archive_dest_1='LOCATION=/home/ora_arch db_unique_name=PRIMARY'
*.log_archive_dest_2='SERVICE=STANDBY DB_UNIQUE_NAME=STANDBY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.standby_archive_dest='/home/ora_arch'
*.standby_file_management='AUTO'
注意:
如果主庫和備庫的數據文件位置不同,還需要加如下2個參數:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
TNS設置:
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.6)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.7)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
用'/home/u01/init{SID}.ora' 這個pfile 啓動數據庫,並生成spfile。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile='/home/u01/init{SID}.ora';
ORACLE instance started.
Total System Global Area 1090519040 bytes
Fixed Size 2020128 bytes
Variable Size 301993184 bytes
Database Buffers 771751936 bytes
Redo Buffers 14753792 bytes
SQL> create spfile from pfile='/home/u01/init{SID}.ora';
File created.
2.1.6 修改listener.ora 和tnsnames.ora 文件
Listener.ora 文件: (本次不做修改, 啓動時先從庫. 關閉時先關閉主庫)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /home/u01/product/10R2/db)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /home/u01/product/10R2/db)
(SID_NAME = orctest
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(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. 錯誤,導致歸檔無法完成。
tnsnames.ora 文件
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.6)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.7)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
2.2 Standby 端配置
2.2.1 創建備庫存放數據文件和後臺跟蹤目錄
這個目錄可以和主庫相同,如果不同,就需要在主庫的初始化文件中進行轉換。
如: *.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
2.2.2 將主庫的密碼文件,控制文件,數據文件,參數文件,日誌文件copy到備庫
說明一點,這個控制文件是我們自己創建的standby 控制文件。將copy過來的控制文件再複製三份就可以了。
主備的控制文件是不一樣的。這裏除了採用直接copy 文件之外,還可以採用Rman恢復來做。 直接copy 需要停數據庫,如果採用RMAN 的話,就不需要停機了。
文件如下:
(初始安裝oracle, 沒有其他數據文件; 若對現網數據庫做DG,需要拷貝相應的文件)
control01.ctl redo01.log redo04.log redo07.log temp01.dbf
control02.ctl redo02.log redo05.log sysaux01.dbf undotbs01.dbf
control03.ctl redo03.log redo06.log system01.dbf users01.dbf
2.2.3 修改初始化參數文件
修改之後如下:
*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'
*.log_archive_dest_1='LOCATION=/home/ora_arch db_unique_name=STANDBY'
*.log_archive_dest_2='SERVICE=PRIMARY DB_UNIQUE_NAME=PRIMARY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_client='STANDBY'
*.fal_server='PRIMARY'
*.DB_UNIQUE_NAME='STANDBY'
*.standby_archive_dest='/home/ora_arch'
2.2.4 配置Listener.ora和tnsnames.ora
如果不存在,就從主庫上copy 過去。
2.2.5 在備庫添加redo log file
如果主庫沒有添加redo log file,可以先用copy 過來的初始化文件將數據庫啓動到mount 狀態。在創建個spfile,最後添加redo log。
SQL> startup mount pfile='/home/u01/init{SID}.ora'
ORACLE instance started.
SQL> create spfile from pfile='/home/u01/init{SID}.ora';
添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重複),併爲該組指定一個成員:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/home/u01/product/oradata/oratest/redo04.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/home/u01/product/oradata/oratest/redo05.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/home/u01/product/oradata/oratest/redo06.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/home/u01/product/oradata/oratest/redo07.log') size 100M;
提示: 在主庫上面已經添加了standby redologs 可以先用下面語句刪除掉. 再重新添加
alter database drop standby logfile group 4;
查看配置情況:
SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
GROUP# THREAD# SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
4 1 0 YES UNASSIGNED
5 0 0 YES UNASSIGNED
6 0 0 YES UNASSIGNED
7 0 0 YES UNASSIGNED
提示,由於從Primary數據庫複製文件時並沒有複製Online Redologs,因此物理Standby數據庫在第一次啓動REDO應用時,會在Alert文件中報Online Redo Logfile文件不存在,沒有關係,物理Standby會自動重建這批文件,同時你也不用擔心會丟失數據,Online Redologs中的數據會以歸檔文件的形式從Primary端接收。
至此,Data Guard 的操作已經完成,下面來開始驗證。
注意: tns的primary和standby配置需要先通過測試. 保證通信無誤後再啓動雙機服務.
Data Guard 啓動順序:
啓動順序:先standby ,後primary;
關閉順序:先primary 後standby;
2.3 驗證Dataguard狀態
在備庫將實例啓動到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;
//希望實時應用(MANAGED REAL TIME APPLY) 需要使用下面語句進行啓動:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY USING CURRENT LOGFILE DISCONNECT FROM SESSION;
在備庫啓動監聽:
$lsnrctl start
在主庫啓動實例:
SQL> startup;
在主庫啓動監聽:
$lsnrctl start
在主庫驗證歸檔目錄是否有效:
SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;
如果有錯誤,要排查原因。
SQL> alter system switch logfile;
查看歸檔日誌情況.
SQL> archive log list;
主備查詢結果一致,Data Guard 搭建結束。
3 主備切換
由於目前數據庫由3臺服務器組成,因此做主備切換後,需要重新對GIS分析數據庫做Stream同步。 下面主要介紹主從切換。
Data Guard主從數據庫雙向切換:
A.準備工作
(1)首先查詢主庫狀態,確認可以做切換:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------
TO STANDBY
SWITCHOVER_STATUS有三個狀態: to standby、 sessions active、 not allowed(該狀態下無法切換)
(2)在從庫上面確認所有的archive log 都已經apply:
select sequence#,first_time,next_time,applied from v$archived_log;
(3)在主庫上switch logfile:
Alter system switch logfile;
(4)觀察從庫上已經 apply所有archive log:
select sequence#,first_time,next_time,applied from v$archived_log;
查看是否仍然有連接
select username,program from v$session where status='ACTIVE';
B.切換:
(1)將主庫轉變爲可切換狀態:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
--------此時會有日誌切換,並傳輸到舊standby點。Standby端會自動cancel(查看alter{SId}.log日誌。
(2)standby
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
(3)原primary
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
alter database mount standby database;
(4)原primary
alter system set log_archive_dest_state_2=defer scope=both;
(5)原standby
RECOVER MANAGED STANDBY DATABASE CANCEL-------系統已自動執行。(會報異常錯誤, 可忽略)
shutdown immediate;
startup
(6)原standby( new primary)
alter system set log_archive_dest_state_2=enable scope=both;
(7)新的primary
ALTER SYSTEM SWITCH LOGFILE;
查看archive log是否自動傳輸
(8)原來的primary 新的standby
RECOVER MANAGED STANDBY DATABASE disconnect; (清除原有日誌信息)
(9)新的primary
ALTER SYSTEM SWITCH LOGFILE;
(10)新standby
archive log list; 查看
經測試,系統雙向切換成功,目前整套系統工作正常。
4 主庫失敗,啓用備庫(Failovers)
1. 查看是否有日誌GAP,沒有應用的日誌:
SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果有,則拷貝過來並且註冊
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路徑';
重複查看直到沒有應用的日誌:
2. 然後停止應用歸檔:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Database altered.
3. 下面將STANDBY數據庫切換爲PRIMARY數據庫:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
或SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
Database altered.
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
SQL> ALTER DATABASE OPEN; 或者 shutdown immediate+startup
Database altered.
檢查數據庫是否已經切換成功:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PRIMARY
至此,FAILOVER切換完成。這個時候應該馬上對新的PRIMARY數據庫進行備份。;