目標:在主庫不停機的情況下搭建active standby 數據庫
環境說明:
數據庫版本:Release 11.2.0.4.0
操作系統 :Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Primary db_unique_name : hjprddb1
standby db_unique_name : hjprddb2
解決方案
1.對主數據庫進行必要的更改。
a. 啓用 force logging。
b. 如果沒有密碼文件,則創建密碼文件。
c. 創建備用 redo 日誌。
d. 修改參數文件,使其適用於 Dataguard。
2. 確保 sql*net 連接正常。
3. 使用主數據庫活動文件,通過網絡創建備用數據庫。
a. 創建密碼文件
b. 爲備用數據庫(輔助數據庫)創建初始化參數文件
c. 爲數據庫文件創建需要的裝載點或文件夾
d. 連接至主數據庫作爲其目標數據庫,以運行創建備用 ON STANDBY。
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
SPFILE
PARAMETER_VALUE_CONVERT '', ''
SET DB_FILE_NAME_CONVERT '', ''
SET LOG_FILE_NAME_CONVERT '', ''
SET SGA_MAX_SIZE 200M
SET SGA_TARGET 125M;
4. 檢查日誌傳送和應用。
操作過程:
1. 爲生產數據庫成爲主數據庫做準備
a. 確保數據庫是 archivelog 模式。
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
b. 啓用 force logging
SQL> ALTER DATABASE FORCE LOGGING;
c. 創建備用 redo 日誌
SQL> alter database add standby logfile '<name>' size <size>;
SQL> alter database add standby logfile thread 1 group 4 ('/opt/app/oracle/hjprddb1/redo01_a.log') size 50m ;
Database altered.
SQL> alter database add standby logfile thread 1 group 5 ('/opt/app/oracle/hjprddb1/redo02_a.log') size 50m ;
Database altered.
SQL> alter database add standby logfile thread 1 group 6 ('/opt/app/oracle/hjprddb1/redo03_a.log') size 50m ;
Database altered.
d. 修改主要初始化參數,使其適用於主數據庫的 dataguard
SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(hjprddb1,hjprddb2)';
System altered.
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/opt/app/oracle/hjprddb1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hjprddb1';
System altered.
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=hjprddb2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=hjprddb2';
System altered.
SQL> alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
System altered.
SQL> alter system set FAL_SERVER=hjprddb2;
System altered.
SQL> alter system set FAL_CLIENT=hjprddb1;
System altered.
SQL> alter system set DB_FILE_NAME_CONVERT='/opt/app/oracle/hjprddb2','/opt/app/oracle/hjprddb1' scope=spfile;
System altered.
SQL> alter system set LOG_FILE_NAME_CONVERT='/opt/app/oracle/hjprddb2','/opt/app/oracle/hjprddb1' scope=spfile;
System altered.
2. 確保 sql*net 連接正常。
在備庫的 listener.ora 文件中插入 hjprddb2 的靜態條目。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =hjprddb2.com.cn )(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /opt/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = hjprddb2.com.cn )
(ORACLE_HOME = /opt/app/oracle/product/10.2.0/db_1 )
(SID_NAME = hjprddb2)
)
)
主庫和備庫的 TNSNAMES.ORA 應該有兩個條目
hjprddb1=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.236.128)(PORT = 1521))
)
(CONNECT_DATA =
(service_name =hjprddb1)
)
)
hjprddb2=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.236.129)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = hjprddb2.com.cn )
)
)
在主數據庫和備用數據庫中使用以下命令,檢查 SQL*Net 配置
% tnsping hjprddb1
% tnsping hjprddb2
3. 創建備用數據庫
a. 從主數據庫 $ORACLE_HOME/dbs 中複製密碼文件,並將其重命名爲備用數據庫名稱。
用戶名必須爲 SYS 且主數據庫和備用數據庫的密碼需相同。
此處的最佳做法是按照建議複製密碼文件。
密碼文件名稱必須和備用站點上使用的實例名稱/SID 匹配,而非 DB_NAME。
b. 僅用一個參數 DB_NAME 創建初始化參數。
DB_NAME=chicago
DB_UNIQUE_NAME=boston
DB_BLOCK_SIZE=<same as primary>
c. 在備庫創建需要的目錄以放置 $ADR_HOME 中的數據文件和跟蹤文件。
d. 將環境變量 ORACLE_SID 設置爲備用服務並啓動備用實例。
% export ORACLE_SID=boston
% sqlplus "/ as sysdba"
SQL> startup nomount pfile=$ORACLE_HOME/dbs/initcore1.ora注意:使用 PFILE 或 SPFILE
# 附加註釋
# 如果使用了 DUPLICATE without TARGET connection,則不能使用 SPFILE
# 否則將得到以下錯誤消息
RMAN-05537: DUPLICATE without TARGET connection when auxiliary instance is started with spfile cannot use SPFILE clause
e. 驗證“AS SYSDBA”連接正在運行
% sqlplus /nolog
SQL> connect sys/<passwd<@boston AS SYSDBA
connect sys/<passwd>@chicago AS SYSDBA
f. 在主系統上執行RMAN 並連接主數據庫和輔助數據庫(即備用數據庫)
[oracle@hjprddb1 ~]$ rman target
sys/oracle@hjprddb1 auxiliary
sys/oracle@hjprddb2
Recovery Manager: Release 11.2.0.4.0 - Production on Sat Dec 28 22:34:31 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: HJPRDDB1 (DBID=3777025748)
connected to auxiliary database: HJPRDDB2 (not mounted)
RMAN> run {
2> allocate channel prmy1 type disk;
3> allocate channel prmy2 type disk;
4> allocate channel prmy3 type disk;
5> allocate channel prmy4 type disk;
6> allocate auxiliary channel stby type disk;
7>
8> duplicate target database for standby from active database spfile
9> parameter_value_convert 'hjprddb1','hjprddb2'
10> set db_unique_name='hjprddb2'
11> set db_file_name_convert='/hjprddb1/','/hjprddb2/'
12> set log_file_name_convert='/hjprddb1/','/hjprddb2/'
13> set control_files='/opt/app/oracle/hjprddb2/control01.ctl' ---該路徑爲備庫上控制文件的存放路徑
14> set log_archive_max_processes='5'
15> set fal_client='hjprddb2'
16> set fal_server='hjprddb1'
17> set standby_file_management='AUTO'
18> set log_archive_config='dg_config=(hjprddb1,hjprddb2)'
19> set log_archive_dest_2='service=hjprddb1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=hjprddb1' ;
20> }
using target database control file instead of recovery catalog
allocated channel: prmy1
channel prmy1: SID=1 device type=DISK
allocated channel: prmy2
channel prmy2: SID=47 device type=DISK
allocated channel: prmy3
channel prmy3: SID=32 device type=DISK
allocated channel: prmy4
channel prmy4: SID=43 device type=DISK
allocated channel: stby
channel stby: SID=20 device type=DISK
Starting Duplicate Db at 28-DEC-13
contents of Memory Script:
{
backup as copy reuse
targetfile '/opt/app/oracle/product/11.2.0/db_1/dbs/orapwhjprddb1' auxiliary format
'/opt/app/oracle/product/10.2.0/db_1/dbs/orapwhjprddb2' targetfile
'/opt/app/oracle/product/11.2.0/db_1/dbs/spfilehjprddb1.ora' auxiliary format
'/opt/app/oracle/product/10.2.0/db_1/dbs/spfilehjprddb2.ora' ;
sql clone "alter system set spfile= ''/opt/app/oracle/product/10.2.0/db_1/dbs/spfilehjprddb2.ora''";
}
executing Memory Script
Starting backup at 28-DEC-13
Finished backup at 28-DEC-13
sql statement: alter system set spfile= ''/opt/app/oracle/product/10.2.0/db_1/dbs/spfilehjprddb2.ora''
contents of Memory Script:
{
sql clone "alter system set audit_file_dest =
''/opt/app/oracle/admin/hjprddb2/adump'' comment=
'''' scope=spfile";
sql clone "alter system set dispatchers =
''(PROTOCOL=TCP) (SERVICE=hjprddb2XDB)'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_dest_1 =
''LOCATION=/opt/app/oracle/hjprddb2 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hjprddb1'' comment=
'''' scope=spfile";
sql clone "alter system set db_unique_name =
''hjprddb2'' comment=
'''' scope=spfile";
sql clone "alter system set db_file_name_convert =
''/hjprddb1/'', ''/hjprddb2/'' comment=
'''' scope=spfile";
sql clone "alter system set log_file_name_convert =
''/hjprddb1/'', ''/hjprddb2/'' comment=
'''' scope=spfile";
sql clone "alter system set control_files =
''/opt/app/oracle/hjprddb2/control01.ctl'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_max_processes =
5 comment=
'''' scope=spfile";
sql clone "alter system set fal_client =
''hjprddb2'' comment=
'''' scope=spfile";
sql clone "alter system set fal_server =
''hjprddb1'' comment=
'''' scope=spfile";
sql clone "alter system set standby_file_management =
''AUTO'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_config =
''dg_config=(hjprddb1,hjprddb2)'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_dest_2 =
''service=hjprddb1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=hjprddb1'' comment=
'''' scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
executing Memory Script
sql statement: alter system set audit_file_dest = ''/opt/app/oracle/admin/hjprddb2/adump'' comment= '''' scope=spfile
sql statement: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=hjprddb2XDB)'' comment= '''' scope=spfile
sql statement: alter system set log_archive_dest_1 = ''LOCATION=/opt/app/oracle/hjprddb2 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hjprddb1'' comment= '''' scope=spfile
sql statement: alter system set db_unique_name = ''hjprddb2'' comment= '''' scope=spfile
sql statement: alter system set db_file_name_convert = ''/hjprddb1/'', ''/hjprddb2/'' comment= '''' scope=spfile
sql statement: alter system set log_file_name_convert = ''/hjprddb1/'', ''/hjprddb2/'' comment= '''' scope=spfile
sql statement: alter system set control_files = ''/opt/app/oracle/hjprddb2/control01.ctl'' comment= '''' scope=spfile
sql statement: alter system set log_archive_max_processes = 5 comment= '''' scope=spfile
sql statement: alter system set fal_client = ''hjprddb2'' comment= '''' scope=spfile
sql statement: alter system set fal_server = ''hjprddb1'' comment= '''' scope=spfile
sql statement: alter system set standby_file_management = ''AUTO'' comment= '''' scope=spfile
sql statement: alter system set log_archive_config = ''dg_config=(hjprddb1,hjprddb2)'' comment= '''' scope=spfile
sql statement: alter system set log_archive_dest_2 = ''service=hjprddb1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=hjprddb1'' comment= '''' scope=spfile
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area 551165952 bytes
Fixed Size 2255112 bytes
Variable Size 436209400 bytes
Database Buffers 109051904 bytes
Redo Buffers 3649536 bytes
allocated channel: stby
channel stby: SID=18 device type=DISK
contents of Memory Script:
{
backup as copy current controlfile for standby auxiliary format '/opt/app/oracle/hjprddb2/control01.ctl';
}
executing Memory Script
Starting backup at 28-DEC-13
channel prmy1: starting datafile copy
copying standby control file
output file name=/opt/app/oracle/product/11.2.0/db_1/dbs/snapcf_hjprddb1.f tag=TAG20131228T223457 RECID=1 STAMP=835396499
channel prmy1: datafile copy complete, elapsed time: 00:00:07
Finished backup at 28-DEC-13
contents of Memory Script:
{
sql clone 'alter database mount standby database';
}
executing Memory Script
sql statement: alter database mount standby database
contents of Memory Script:
{
set newname for tempfile 1 to
"/opt/app/oracle/hjprddb2/temp01.dbf";
switch clone tempfile all;
set newname for datafile 1 to
"/opt/app/oracle/hjprddb2/system01.dbf";
set newname for datafile 2 to
"/opt/app/oracle/hjprddb2/sysaux01.dbf";
set newname for datafile 3 to
"/opt/app/oracle/hjprddb2/undotbs01.dbf";
set newname for datafile 4 to
"/opt/app/oracle/hjprddb2/users01.dbf";
backup as copy reuse
datafile 1 auxiliary format
"/opt/app/oracle/hjprddb2/system01.dbf" datafile
2 auxiliary format
"/opt/app/oracle/hjprddb2/sysaux01.dbf" datafile
3 auxiliary format
"/opt/app/oracle/hjprddb2/undotbs01.dbf" datafile
4 auxiliary format
"/opt/app/oracle/hjprddb2/users01.dbf" ;
sql 'alter system archive log current';
}
executing Memory Script
executing command: SET NEWNAME
renamed tempfile 1 to /opt/app/oracle/hjprddb2/temp01.dbf in control file
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting backup at 28-DEC-13
channel prmy1: starting datafile copy
input datafile file number=00001 name=/opt/app/oracle/hjprddb1/system01.dbf
channel prmy2: starting datafile copy
input datafile file number=00002 name=/opt/app/oracle/hjprddb1/sysaux01.dbf
channel prmy3: starting datafile copy
input datafile file number=00003 name=/opt/app/oracle/hjprddb1/undotbs01.dbf
channel prmy4: starting datafile copy
input datafile file number=00004 name=/opt/app/oracle/hjprddb1/users01.dbf
output file name=/opt/app/oracle/hjprddb2/users01.dbf tag=TAG20131228T223511
channel prmy4: datafile copy complete, elapsed time: 00:00:19
output file name=/opt/app/oracle/hjprddb2/undotbs01.dbf tag=TAG20131228T223511
channel prmy3: datafile copy complete, elapsed time: 00:07:46
output file name=/opt/app/oracle/hjprddb2/sysaux01.dbf tag=TAG20131228T223511
channel prmy2: datafile copy complete, elapsed time: 00:13:56
output file name=/opt/app/oracle/hjprddb2/system01.dbf tag=TAG20131228T223511
channel prmy1: datafile copy complete, elapsed time: 00:14:26
Finished backup at 28-DEC-13
sql statement: alter system archive log current
contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=1 STAMP=835397373 file name=/opt/app/oracle/hjprddb2/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=2 STAMP=835397373 file name=/opt/app/oracle/hjprddb2/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=3 STAMP=835397373 file name=/opt/app/oracle/hjprddb2/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=4 STAMP=835397373 file name=/opt/app/oracle/hjprddb2/users01.dbf
Finished Duplicate Db at 28-DEC-13
released channel: prmy1
released channel: prmy2
released channel: prmy3
released channel: prmy4
released channel: stby
RMAN> exit
4. 現在連接備用數據庫 sqlplus 並啓動 MRP(管理恢復進程)。比較主數據庫的最新序列和 MRP(管理恢復進程)的應用序列。
示例:
SQL> alter database recover managed standby database disconnect from session;
5. 如果您是購買了ADG 許可證的客戶可以用只讀模式打開 DB 並啓動恢復。
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database disconnect;
參考metalink文檔 ID 1526160.1)