1 說明
基於網上的文檔做了補充說明改動形成的文檔。
2 判斷DataGuard是否安裝
select * from v$option where parameter = 'Oracle Data Guard';
3 網絡配置
192.168.1.110---------------------------主庫-------------實例名----ora11g(ora11g_PD)
192.168.1.111---------------------------備庫-------------實例名----ora11g(ora11g_ST)
192.168.1.112---------------------------備庫-------------實例名----ora11g(ora11g_SD)
4 監聽配置
主庫
[oracle@node1~]$ cd /ora11g/oracle/product/11.2.0/db_1/network/admin
[oracle@node1]$ cat listener.ora
# listener.ora Network Configuration File:/ora11g/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =TCP)(HOST = node1)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY= EXTPROC1521))
)
)
ADR_BASE_LISTENER = /ora11g/oracle
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME =/ora11g/oracle/product/11.2.0/db_1)
(SID_NAME = ora11g)
)
)
[oracle@node1]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File:/ora11g/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORA11G_PD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST= 192.168.1.110)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
ORA11G_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST = 192.168.1.111)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
ORA11G_SD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST = 192.168.1.112)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
備庫1
[oracle@node2]$ cat listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =TCP)(HOST = node2)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY= EXTPROC1521))
)
)
ADR_BASE_LISTENER = /ora11g/oracle
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME = /ora11g/oracle/product/11.2.0/db_1)
(SID_NAME = ora11g)
)
)
[oracle@node2]$ cat tnsnames.ora
ORA11G_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST = 192.168.1.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
ORA11G_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST =192.168.1.111)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
ORA11G_SD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST =192.168.1.112)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
備庫2
[oracle@node3]$ cat listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =TCP)(HOST = node3)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY= EXTPROC1521))
)
)
ADR_BASE_LISTENER = /ora11g/oracle
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME = /ora11g/oracle/product/11.2.0/db_1)
(SID_NAME = ora11g)
)
)
[oracle@node3]$ cat tnsnames.ora
ORA11G_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST = 192.168.1.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
ORA11G_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST =192.168.1.111)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
ORA11G_SD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL =TCP)(HOST =192.168.1.112)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora11g)
)
)
5 主庫前期準備
設置強制寫日誌
SQL> select FORCE_LOGGING from v$database;
NO
SQL> alter database force logging;
SQL> select FORCE_LOGGING from v$database;
YES
6 創建口令文件
orapwd file=$ORACLE_HOME/dbs/orapwora11g password=test entries=5
7 修改主庫初始化參數
創建主庫pfile
sql > create pfile from spfile;
修改pfile
DB_UNIQUE_NAME='ORA11G_PD'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORA11G_PD,ORA11G_ST,ORA11G_SD)'
LOG_ARCHIVE_DEST_1= 'LOCATION=/ora11g/oracle/archiveVALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORA11G_PD'
LOG_ARCHIVE_DEST_2= 'SERVICE=ORA11G_ST LGWR SYNCVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA11G_ST'
LOG_ARCHIVE_DEST_3= 'SERVICE=ORA11G_SD LGWR SYNCVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA11G_SD'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_STATE_3=ENABLE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER='ora11g_st,ora11g_sd'
FAL_CLIENT='ora11g_pd'
STANDBY_FILE_MANAGEMENT=AUTO
Pfile 拷貝到備庫1、2上
[node1]$scp -rp /ora11g/oracle/product/11.2.0/db_1/dbs/initorcl.oranode2:/ora11g/oracle/product/11.2.0/db_1/dbs/
[node1]$scp -rp /ora11g/oracle/product/11.2.0/db_1/dbs/initorcl.oranode2:/ora11g/oracle/product/11.2.0/db_1/dbs/
8 修改數據庫運行在歸檔模式下
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
9 創建備份庫需要的控制文件
創建控制文件
Shutdown immediate
STARTUP MOUNT;
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/ora11g/oracle/ora11g01.ctl';
ALTER DATABASE OPEN;
創建主庫spfile
Shutdown immediate
startuppfile='/ora11g/oracle/oracle/product/11.2.0/db_1/dbs/initora11g.ora'
sql>create spfile from pfile='/ora11g/oracle/product/11.2.0/db_1/dbs/initora11g.ora'
;
(先把原來的幹掉)
shutdown immediate;
startup
10 備份生產數據庫
scp -rp /ora11g/oracle/oradata/ORA11G node2:/u01/oradata/
scp -rp /ora11g/oracle/admin/ORA11G node2:/ora11g/oracle/admin(記得在備庫1、2創建admin)
11 修改備庫1的pfile
DB_UNIQUE_NAME='ORA11G_ST'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORA11G_PD,ORA11G_ST)'
LOG_ARCHIVE_DEST_1= 'LOCATION=/ora11g/oracle/archiveVALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORA11G_ST'
LOG_ARCHIVE_DEST_2= 'SERVICE=ORA11G_PD LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=ORA11G_PD'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER=ORA11G_PD
FAL_CLIENT=ORA11G_ST
STANDBY_FILE_MANAGEMENT=AUTO
12 修改備庫2的pfile
DB_UNIQUE_NAME='ORA11G_SD'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORA11G_PD,ORA11G_SD)'
LOG_ARCHIVE_DEST_1= 'LOCATION=/ora11g/oracle/archiveVALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORA11G_SD'
LOG_ARCHIVE_DEST_2= 'SERVICE=ORA11G_PD LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=ORA11G_PD'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER=ORA11G_PD
FAL_CLIENT=ORA11G_SD
STANDBY_FILE_MANAGEMENT=AUTO
13 將控制文件拷貝到備庫1、2
[node1]$scp -rp /ora11g/oracle/ora11g01.ctlnode2:/ora11g/oracle/oradata/ORA11G/
[node1]$scp -rp /ora11g/oracle/ora11g01.ctlnode2:/ora11g/oracle/fast_recovery_area/orcl/controlfile/
[node1]$scp –rp /ora11g/oracle/ora11g01.ctl node3:/ora11g/oracle/oradata/ORA11G/
[node1]$scp -rp /ora11g/oracle/ora11g01.ctlnode3:/ora11g/oracle/fast_recovery_area/orcl/controlfile/
14 在備庫1、2上創建口令文件
orapwd file=$ORACLE_HOME/dbs/orapwora11g password=oracle entries=5
15 在備庫1、2上創建spfile
SQL>Shutdown immediate;
SQL>startup;
SQL>pfile='/ora11g/oracle/oracle/product/11.2.0/db_1/dbs/initora11g.ora';
SQL>CREATE SPFILE FROM PFILE;
16 啓動物理備用數據庫1、2
STARTUPMOUNT;
17 配置Standby Redo Log
在主備庫兩邊都配置standby redo log
在主庫查看日誌組的數量和每個日誌文件的大小
SQL> SELECT GROUP#, BYTES FROM V$LOG;
在備庫庫查看日誌組的數量和每個日誌文件的大小
SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;
創建日誌組和redo log文件
SQL> alter database add standby logfile
group 4 ('/ora11g/oracle/oracle/oradata/highfly/stdby_redo04.log') size50m,
group 5 ('/ora11g/oracle/oracle/oradata/highfly/stdby_redo05.log')size 50m,
group 6 ('/ora11g/oracle/oracle/oradata/highfly/stdby_redo06.log')size 50m,
group 7 ('/ora11g/oracle/oracle/oradata/highfly/stdby_redo07.log') size50m;
18 Start Redo Apply
在備庫
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USINGCURRENT LOGFILE DISCONNECT FROM SESSION;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>alter user scott account lock;
查看哪些歸檔日誌被APPLY了
在備庫
SQL>SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
在主庫強制日誌切換到當前的online redo log file.
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
在備庫查看新的被歸檔的redo data
SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROMV$ARCHIVED_LOG ORDER BY SEQUENCE#;
在備庫查看接收到的被應用的redo
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BYSEQUENCE#;
查看數據庫的角色
SQL>select database_role,protection_mode,protection_levelfrom v$database;
19 主備庫切換
1.查看主庫的狀態
SQL> SELECTSWITCHOVER_STATUS FROM V$DATABASE;
2.將主庫切換至備用模式
SQL> ALTERDATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH -
> SESSION SHUTDOWN;
3.關閉、裝載主數據庫
SQL> SHUTDOWNABORT;
SQL> STARTUP MOUNT;
4.查看備庫準備向主庫模式切換
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO_PRIMARY
1 row selected
5.切換備庫至主庫模式
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSIONSHUTDOWN;
6.打開新的主數據庫
SQL> ALTER DATABASEOPEN;
7. 在新的備庫服務器上啓動 REDO apply。
SQL> ALTER DATABASE RECOVER MANAGED STANDBYDATABASE USING CURRENT LOGFILE -
> DISCONNECT FROMSESSION;
20 災難恢復(failover)
Step 1
Flushany unsent redo from the primary database to the target standby
database
SQL> ALTER SYSTEMFLUSH REDO TO target_db_name;
Step 2
Verify that the standby database has the mostrecently archived redo log
filefor each primary database redo thread.
SQL>SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) -
> OVER (PARTITION BYthread#) AS LAST from V$ARCHIVED_LOG;
SQL> ALTER DATABASEREGISTER PHYSICAL LOGFILE 'filespec1';
Step 3
Identifyand resolve any archived redo log gaps.
SQL> SELECT THREAD#,LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
SQL> ALTER DATABASEREGISTER PHYSICAL LOGFILE 'filespec1';
Step 4
RepeatStep 3 until all gaps are resolved.
Step 5
StopRedo Apply.
Issuethe following SQL statement on the target standby database:
SQL> ALTER DATABASERECOVER MANAGED STANDBY DATABASE CANCEL;
Step 6
Finishapplying all received redo data.
Issuethe following SQL statement on the target standby database:
SQL> ALTER DATABASERECOVER MANAGED STANDBY DATABASE FINISH;
Step 7
Verifythat the target standby database is ready to become a primary
database.
Step 8
Switchthe physical standby database to the primary role.
Issuethe following SQL statement on the target standby database:
SQL> ALTER DATABASECOMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
Step 9
Openthe new primary database.
SQL> ALTER DATABASEOPEN;
Step10
Backup the new primary database.
Oracle recommendsthat a full backup be taken of the new primary database.
Step11
RestartRedo Apply if it has stopped at any of the other physical standby
databasesin your Data Guard configuration.
Forexample:
SQL> ALTERDATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE -
> DISCONNECT FROMSESSION;
附:
1. 啓動到管理模式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database recover managed standbydatabase disconnect from session;
2.啓動到只讀方式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database open read only;
3如果在管理恢復模式下到只讀模式
SQL> recover managed standby database cancel;
SQL> alter database open read only;