oracle11g dataguard物理備庫搭建(關閉主庫cp數據文件到備庫)

Dataguard 環境:

操作系統:Redhat6.4

Primary數據庫:
IP 地址:192.168.1.122
數據庫SID:ora11g
DB_UNIQUE_NAME:ora11g_primary

Standby數據庫:
IP 地址:192.168.1.123
數據庫SID:ora11g
DB_UNIQUE_NAME:ora11g_standby

(注:oracle數據庫版本是11.2.0.1.0)

1.Primary端的配置
(1).檢查數據庫是否支持 Data Guard(企業版才支持),是否歸檔模式,Enable force logging

$ sqlplus '/as sysdba'
SQL> select * from v$option where parameter = 'Managed Standby';
確認主庫處於歸檔模式
SQL> archive log list (先檢查是否歸檔模式,不是則修改)
startup mount
alter database archivelog;
alter database open;

(2)將primary 數據庫置爲 FORCE LOGGING模式

SQL> alter database force logging; (強制產生日誌)
如果主庫沒有密碼文件則建立密碼文件,從而可以 OS驗證的方式登陸
$ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=oracle entries=5

(3)爲主數據庫添加備用聯機日誌文件
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/ora11g/stdby_redo04.log') size 50m;
alter database add standby logfile group 5 ('/u01/app/oracle/oradata/ora11g/stdby_redo05.log') size 50m;
alter database add standby logfile group 6 ('/u01/app/oracle/oradata/ora11g/stdby_redo06.log') size 50m;
alter database add standby logfile group 7 ('/u01/app/oracle/oradata/ora11g/stdby_redo07.log') size 50m;
standby redolog的組數參考公式:(online redolog組數 + 1) * 數據庫線程數;單機線程數爲1,RAC一般爲2。
standby redolog的組成員數和大小也儘量和online redolog一樣。
(注:在備庫中也要建立相同的standbylog組。)

(4)修改主庫參數文件
SQL> create pfile from spfile;

主庫
DB_NAME=ora11g
DB_UNIQUE_NAME=ora11g_primary
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary ,ora11g_standby)'
LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_primary'
LOG_ARCHIVE_DEST_2='SERVICE=ora11g_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_standby'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVEFORMAT=%t%s_%r.arc
FAL_SERVER=ora11g_standby
FAL_CLIENT=ora11g_primary
STANDBY_FILE_MANAGEMENT=AUTO

(5)建立備用庫的控制文件
SQL>shutdown immediate

SQL>startup mount
SQL> alter database create standby controlfile as '/u01/standby_ctl01.ctl';

(6)配置listener.ora和tnsnames.ora

Listener.ora 文件:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(SID_NAME = ora11g)
(ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DG-Primary)(PORT = 1521))
)
)

ADR_BASE_LISTENER = /u01/app/oracle

tnsnames.ora文件:

ORA11G_PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.122)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
ORA11G_STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.123)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)

(7)主庫用修改過的PFILE 生產SPFILE
關閉主數據庫
SQL>shutdown immediate
生成spfile
SQL> create spfile from pfile;

2.Standby端的配置

(1). 創建備庫存放數據文件和後臺跟蹤目錄
mkdir -p $ORACLE_BASE/oradata/ora11g

mkdir -p $ORACLE_BASE/admin/ora11g

mkdir -p $ORACLE_BASE/admin/ora11g/adump

mkdir -p $ORACLE_BASE/admin/ora11g/bdump

mkdir -p $ORACLE_BASE/admin/ora11g/cdump

mkdir -p $ORACLE_BASE/admin/ora11g/dpdump

mkdir -p $ORACLE_BASE/admin/ora11g/pfile

mkdir -p $ORACLE_BASE/admin/ora11g/udump

mkdir -p $ORACLE_BASE/diag/rdbms

mkdir -p $ORACLE_BASE/diag/tnslsnr
mkdir -p $ORACLE_BASE/flash_recovery_area/ora11g
mkdir -p $ORACLE_BASE/flash_recovery_area/ORA11g
mkdir -p $ORACLE_BASE/archive

(2).把文件傳輸到備庫下
關閉主庫複製文件
$scp $ORACLE_BASE/oradata/.dbf 192.168.1.123:/$ORACLE_BASE/oradata/ora11g
$scp $ORACLE_BASE/oradata/
.log 192.168.1.123:/$ORACLE_BASE/oradata/ora11g
$scp /u01/standby_ctl01.ctl 192.168.1.123:/$ORACLE_BASE/oradata/ora11g
$scp $ORACLE_HOME/dbs/initora11g.ora 192.168.1.123: $ORACLE_HOME/dbs/
$ cd $ORACLE_BASE/oradata/ora11g
$ mv standby_ctl01.ctl control01.ctl
$ cp control01.ctl /u01/app/oracle/flash_recovery_area/ora11g/
$cd /u01/app/oracle/flash_recovery_area/ora11g/
$ mv control01.ctl control02.ctl

(3)建立密碼文件
如果主庫沒有密碼文件則建立密碼文件,從而可以 OS驗證的方式登陸
$ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=oracle entries=5
(4)修改備庫參數文件
DB_NAME=ora11g
DB_UNIQUE_NAME=ora11g_standby
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary ,ora11g_standby)'
LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_standby'
LOG_ARCHIVE_DEST_2='SERVICE=ora11g_primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_primary'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVEFORMAT=%t%s_%r.arc
FAL_SERVER=ora11g_primary
FAL_CLIENT=ora11g_standby
STANDBY_FILE_MANAGEMENT=AUTO

(4)修改備庫的listener.ora和tnsnames.ora,如果沒有的話,可以直接從主庫複製過去

Listener.ora 文件:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(SID_NAME = ora11g)
(ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DG-Standby)(PORT = 1521))
)
)

ADR_BASE_LISTENER = /u01/app/oracle

tnsnames.ora文件:

ORA11G_PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.122)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
ORA11G_STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.123)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)

(5)複製主庫的密碼文件到備庫的相應位置(注:如果主備庫不能同步很可能就是密碼文件不一樣)

先查看備份庫是否有密碼文件,有就先刪除,然後再複製。
scp $ORACLE_HOME/dbs/orapwora11g 192.168.1.123:/$ORACLE_HOME/dbs/

3.Dataguard啓動
(1)啓動順序,先啓動備庫,然後再啓動主庫

啓動standby database
SQL>startup nomount
SQL>alter database mount standby database; #執行此命令後備庫會處於手動恢復狀態。

啓動primary database
SQL>startup mount
SQL>alter database set standby database to maximize availability; (設置爲最大性能模式也是默認模式)
SQL>alter database open;
啓動standby database到recover manage模式

SQL>alter database recover managed standby database disconnect from session;
#執行此命令後,備庫會切換到自動恢復模式。

如果要啓動到實時日誌應用模式 (注:前提必須創建standby logfile)

alter database recover managed standby database using current logfile; #切換備庫到適時應用日誌模式,即real-time apply。執行這個命令後光標會停止在那裏。
或者alter database recover managed standby database using current logfile disconnect from session; #執行這個命令後,會切斷這個session,執行的功能與上面相同。
SQL>alter database recover managed standby database using current logfile disconnect from session;

切換standby database到read only模式

SQL> alter database recover managed standby database cancel; #首先取消備庫的自動恢復模式
SQL>alter database open read only;
如果要切換回recover manage模式(啓動日誌應用或者啓動日誌實時應用)
SQL> alter database recover managed standby database disconnect from session; 啓動日誌應用
SQL>alter database recover managed standby database using current logfile disconnect from session; 啓動日誌實時應用

4、啓動和關閉順序

啓動順序

(1).啓從、主庫的監聽Listener
從庫DG-Standby:
$lsnrctl start

主庫DG-Primary:
$lsnrctl start

(2).啓動備庫數據庫,執行如下:
$sqlplus /nolog
SQL>conn /as sysdba
SQL> startup nomount
SQL> alter database mount standby database; #讓備庫處於standby
SQL> alter database recover managed standby database using current logfile disconnect from session; ; #開始實時同步

(3).啓動主庫
$sqlplus /nolog
SQL>conn /as sysdba
SQL> startup
.切換standby database到read only模式

SQL> alter database recover managed standby database cancel; #首先取消備庫的自動恢復模式
SQL>alter database open read only;
如果要切換回recover manage模式(啓動日誌應用或者啓動日誌實時應用)
SQL> alter database recover managed standby database disconnect from session; 啓動日誌應用
SQL>alter database recover managed standby database using current logfile disconnect from session; 啓動日誌實時應用

(3).啓動主庫數據庫(上述第二步執行完畢後,方可執行如下命令):
SQL>startup

關閉順序

關閉的時候正好相反,先關閉主庫,然後關閉從庫。
(1). 關閉主庫
$su – oracle
SQL>sqlplus /nolog
SQL>conn /as sysdba
SQL>shutdown immediate;
(2). 關閉從庫
su – oracle
SQL>sqlplus /nolog
SQL>conn /as sysdba
SQL>alter database recover managed standby database cancel; #停止同步
SQL>shutdown immediate

5、功能切換
Switchover狀態切換

首先在primary上操作:

(1). 驗證主庫是否能執行角色轉換到備庫(原主庫執行)

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS


    TO STANDBY 
    1 row selected

(2).開始把物理主庫改變爲物理備庫(原主庫執行)

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY with session shutdown;
注:如果有活動的session可以使用此選項,否則轉換會遇到ORA-01093錯誤,也可以殺掉活動會話或等活動會話後進行轉換
(3).關閉並重啓主庫(原主庫執行)
SQL> shutdown immediate
SQL> startup nomount
SQL> alter database mount standby database; #讓備庫處於standby
SQL> alter database recover managed standby database using current logfile disconnect from session; ; #開始實時同步

然後在standby上操作:
(1).驗證備庫是否能執行角色轉換到主庫(原備庫執行)
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS


TO_PRIMARY
1 row selected

(2).開始把物理備庫轉換成物理主庫(原備庫執行)
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
--如果報ORA-16139: media recovery required,可能是由於未應用日誌引起,可先執行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

(3)打開備庫,然後關閉重啓.(原備庫執行)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

(4) 驗證是否轉換成功(原備庫執行)
SQL> ALTER SYSTEM SWITCH LOGFILE;

啓動日誌應用

(5) 應用歸檔日誌(原主庫上執行)
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

小竅門:要想順利的實現switchover,最好在每臺server上都同時設置好primary和standby的一些初始化參數,雖然其中一些參數只有在primary或者standby其中之一上起作用。

應急切換

(注:模擬主庫由於故障無法正常switchover,需要執行failover,強制備庫->pridb並接管業務)

(1).備庫:

由於是failover,所以理解主庫這時候已經無法正常使用,只需備庫切換至pridb

停止應用恢復模式

alter database recover managed standby database finish;

轉換standbydb爲primary db

alter database commit to switchover to primary;

重啓數據庫,恢復正常業務

SQL>shutdown immediate

SQL>startup

select open_mode,database_role from v$database;

OPEN_MODE DATABASE_ROLE


OPEN PRIMARY

注:failover將破壞dataguard模式,需要重新配置dataguard,網上也說不需要配置,但是還沒有測試成功

Failover狀態切換
在備庫上進行切換:
1.首先停止備庫的自動恢復狀態:
SQL>alter database recover managed standby database finish;
如果沒有使用過standby redo log的話執行:
SQL>alter database recover managed standby database finish skip standby logfile;
2.切換備庫到主庫:
SQL>alter database commit to switchover to primary;

  1. 關閉數據庫:
    SQL>shutdown immediate;
  2. 啓動數據庫:
    SQL>startup;
    Active狀態切換:
    Active是從8i延續過來的,其實不建議採用:

在備庫上執行切換:
1:alter database recover managed standby database cancel;
2:alter database activate standby database;
3:shutdown immediate

總結一下Failover 和 Switchover 的區別:

在9i 的dataguad環境中:
1:執行Switch Over 必須是Primary 正常,並且是必須Primary 主動先Switch成 standby.然後standby 才能switch 成primary。
2:如果需要作成primary出問題,standby 能接管的話,必須作 failover ,而不是SwitchOver。

Failover :
將主數據庫offline,備用數據庫online,這種操作由系統和軟件失敗引起。 即使在備用數據庫上應用重做日誌,也可能出現數據丟失的現象,除非備用數據庫運行在 guaranteed protection 模式。
原主數據庫重新使用時必須重新啓動實例。
其它的備用數據庫也需重新啓動實例。

Switchover :
故意將主數據庫offline,而將另一備用數據庫online,它能夠切換到備用數據庫而不需同步操作。如:可使用 Switchover 完成系統的平滑升級。 即使在備用數據庫上不應用重做日誌,也不會造成數據的丟失。
數據庫不需重新啓動實例。這使主數據庫幾乎能立即在備用數據庫上恢復它的功能,因此可經常進行定期維護而不需中斷操作。
Failover和Switchover的區別爲:
當Failover發生,備用數據庫切換爲主數據庫之後,它丟失了備用數據庫的所有能力,也就是說,不能再返回到備用模式;而Switchover可以,備用數據庫可切換爲主數據庫,也可從主數據庫再切換回備用數據庫。

四、相關視圖
v$archive_dest
v$archive_dest_status
v$log_history
v$archvied_log
v$managed_standby
v$archive_gap

6、常見問題

(1). 日誌無法傳送
SQL>select dest_name,status,error from v$archive_dest;
察看相應的歸檔路徑的狀態是否 valid ,否則根據error 信息進行處理
(2). 無法使用alter database 重命名 data file
在standby 上,當設置 standby_file_management 爲auto 時,不允許下列操作
alter database rename
alter database add/drop logfile
alter database add/drop standby logfile member
alter database create datafile as
(3). switchover 失敗
SQL>alter database commit to switchover to physical standby
錯誤: ORA-01093:alter database close only permitted with no session connected
可以察看引起該錯誤的活動 session
SQL> select sid,process,program from v$session where type='USER' and
sid<>(select distinct sid from v$mystat);
然後根據查出的 sid 結合v$session 視圖最後用
alter system kill session ‘ sid,serial’ 來kill 掉進程,斷開該 session
或者使用如下命令來做 switchover
SQL>alter database commit to switchover to physical standby with session shutdown;
(4). 在standby database 的 read only模式下做 report 時出現錯誤:
ora-01220:file base sort illegal before database is open.
可能原因: standby database 沒有temporary tablespace
(5).當主機和備機在運行過程中,把備機停下來,主機的歸檔日誌將不能傳到備機,當把備機服務起來後,主機的歸檔日誌也不能傳到備機,需要把主機的所有服務都重啓一次纔可以傳日誌。
請問爲什麼需要把主機要重啓一次呢?有沒有不需要重啓主機就可以解決此問題呢?
發生這種情況時,覈查幾處:
( 1) . show parameter log_archive_dest ;
( 2) . select REOPEN_SECS,MAX_FAILURE from V$ARCHIVE_DEST;
察看是否是因爲由於備機沒有開機,造成 primary node 無法正常傳送 archived log,並且達到了最大允許的失敗次數。如果是這樣,可以通過 alter system set log_archive_dest... 來重置屬性值,恢復日誌的正常傳送。
也可以手工傳送相關的日誌到備機,
對於物理standby : ALTER DATABASE REGISTER LOGFILE '/xxx/xxx/arcr_xxx.arc'
對於邏輯standby : ALTER DATABASE REGISTER LOGICAL LOGFILE '/xxx/xxx/arcr_xxx.arc'
(3). 執行SELECT MESSAGE FROM V$DATAGUARD_STATUS; 察看相關信息,還有根據 dataguard 的不同類型來察看相關的 view 來確定當前的狀態,具體參見 dataguard 的官方文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章