cent os6.5搭建oracle-dataguard
參考文章: 手把手教你安裝Data Guard 非常感謝此文作者,在我搭建DataGuard的過程中提供了很大幫助。
此文綜合了一些其他參考資料與上述文章,供初學者參考。
前言
此文適合於初步學習dataguard的同仁,本人也是剛接觸dataguard 在搭建過程中吃了不少苦頭,所以特地總結出來,希望能幫助到大家。1 配置資訊
主庫安裝資料庫,備庫只裝資料庫軟體
主庫:
作業系統:CentOs6.5
資料庫版本:Oracle 11g R2
DB_UNIQUE_NAME:JCZH
GLOBAL_NAME:JCZH
SERVICE_NAME:JCZH
ORACLE_SID:JCZH
主機名 bm-db3
IP:192.168.1.105
備庫: (以下部分資訊是以主庫資訊生成的,之前不存在)
作業系統:CentOs6.5
資料庫版本:Oracle 11g R2
DB_UNIQUE_NAME:JCZHSTANDBY
GLOBAL_NAME:JCZHSTANDBY
SERVICE_NAME:JCZHSTANDBY
ORACLE_SID:JCZH
主機名 bm-db2
IP:192.168.1.106
2修改Host檔案
主庫:
[email protected] ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db3 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db3 192.168.1.105 bm-db3 192.168.1.106 bm-db2
備庫:
[[email protected] ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db2
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db2
192.168.1.105 bm-db3
192.168.1.106 bm-db2
3 確定開啟監聽檔案(主庫)
[[email protected] ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 19-JUN-2017 12:13:20
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
****************
****************
Listener Parameter File /oracle/product/11.2.4/db_1/network/admin/listener.ora
Listener Log File /oracle/diag/tnslsnr/bm-db3/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
Services Summary...
Service "JCZH" has 2 instance(s).
Instance "JCZH", status UNKNOWN, has 1 handler(s) for this service...
Instance "JCZH", status READY, has 1 handler(s) for this service...
Service "JCZHXDB" has 1 instance(s).
Instance "JCZH", status READY, has 1 handler(s) for this service...
The command completed successfully
4 開啟主庫歸檔模式並修改監聽,生成引數檔案
4.1 開啟主庫歸檔模式
[[email protected] ~]$ sqlplus "/as sysdba"
檢視:
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
………
若未開啟 執行以下命令開啟:
alter database archivelog;
更改主庫為force logging
SQL> alter database force logging;
Database altered.
4.2建立主庫密碼檔案並修改監聽(主庫)
cd /$ORACLE_HOME/network/admin
orapwd file=$ORACLE_HOME/dbs/orapwJCZH password=oracle entries=30;
修改監聽檔案,加入靜態監聽
[[email protected] admin]$ cat listener.ora
# listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = JCZH)
(ORACLE_HOME = /mnt/disk1/oracle/product/11.2.4/db_1)
(SID_NAME = JCZH)
)
)
ADR_BASE_LISTENER = /oracle
監聽檔案建議複製系統生成的格式進行修改 複製空格對不上也會導致不能正常啟動
修改 tnsname檔案
[[email protected] admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
JCZH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = bm-db3)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = JCZH)
)
)
JCZHSTANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = bm-db2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = JCZHSTANDBY)
)
)
4.3生成引數檔案並修改
主庫:進入sqlplussqlplus “/as sysdba”
SQL->create pfile from spfile;
cd $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initJCZH.ora
……..
*.db_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'
*.db_name='JCZH'
*.db_recovery_file_dest_size=10737418240
*.db_unique_name='JCZH'
*.fal_client='JCZH'
*.fal_server='JCZHSTANDBY'
*.log_archive_config='dg_config=(JCZH,JCZHSTANDBY)'
*.log_archive_dest_1='LOCATION=/arch/JCZH LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZH'
*.log_archive_dest_2='service=JCZHSTANDBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZHSTANDBY'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_format='%t_%s_%r.arc'
*.log_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'
*.standby_file_management='AUTO'
修改檔案中以上值 沒有則新增,若有則保證路徑資訊等正確, db_recovery_file_dest_size 保證值不小於該值
注意:
1.log_archive_dest_2='SERVICE=STANDBY這個引數就是tnsnames的別名,就是這個檔案開頭的那個大寫的名字。
log_archive_dest_1 為本地日誌的存放資訊
注意DB_UNIQUE_NAME的不同。
配置此引數的意義為開啟遠端歸檔日誌的傳輸。
2: *.fal_server=JCZHSTANDBY
*.fal_client=JCZH
這兩個引數是各自的service_name。 主備庫相反
3. db_file_name_convert 與log_file_name_convert分別是資料和日誌存放地址,引數中第一個為備庫的,第二個是主庫的。注意。
修改完成後進入sqlplus
執行create spfile from pfile;
若出現提示資料庫已開啟則
shutdown immediate
create spfile from pfile;
startup
5.傳輸檔案
注意!以下所有執行都要下防火牆關閉模式下進行
主備庫都執行以下命令
service iptables stop
chkconfig iptables off
service iptables status
主庫:
傳輸主庫的引數檔案、密碼檔案以及tnsname檔案到備庫上:cd $ORACLE_HOME/dbs
scp initJCZH.ora orapwJCZH bm-db2:$ORACLE_HOME/dbs
cd /$ORACLE_HOME/network/admin/
scp tnsnames.ora bm-db2:$ORACLE_HOME/network/admin/
修改備庫引數檔案備庫上操作
cd $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initJCZH.ora
*.audit_file_dest='/oracle/admin/JCZHSTANDBY/adump'
*.control_files='/oracle/oradata/JCZH/control01.ctl','/oracle/fast_recovery_area/JCZH/control02.ctl'
*.db_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主備庫相反 資料庫檔案存放地址
*.db_name='JCZH'
*.db_recovery_file_dest='/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=10737418240
*.db_unique_name='JCZHSTANDBY' #修改 一定要與主庫不同 作者沒有配置過相同的
*.diagnostic_dest='/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=JCZHXDB)'
*.fal_client='JCZHSTANDBY' #修改與主庫相反
*.fal_server='JCZH' #同上
*.log_archive_config='dg_config=(JCZHSTANDBY,JCZH)'
*.log_archive_dest_1='LOCATION=/arch/JCZHSTANDBY LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZHSTANDBY'
#注意修改 為本地歸檔目錄地址,錄影在下文中建立
*.log_archive_dest_2='service=JCZH LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZH' #注意修改
*.log_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主備庫相反 日誌檔案存放地址
將模板中的紅色值修改為你自己的 注意 部分引數主備庫是相反的。
6建立目錄
在備庫上建立相應的目錄,因為備庫開始沒有建立資料庫,有些目錄是引數檔案中沒有的。
以下建立的目錄一定要確定是Oracle使用者 oinstall組的
在oracle使用者下建立 如oracle使用者沒有許可權則在root使用者下建立
建立完成後執行
chown -R oracle:oinstall 對應目錄
建立相關目錄
mkdir -p /mnt/disk1/oracle/admin/JCZH/adump/
mkdir -p /oracle/fast_recovery_area
mkdir -p /mnt/disk1/oracle/oradata/JCZH
mkdir /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup /oracle/fast_recovery_area
chmod 777 /mnt/disk1/backup /oracle/fast_recovery_area
mkdir -p /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
chown -R oracle:oinstall /mnt/disk1/arch/JCZH
chmod 777 /mnt/disk1/arch/JCZH
主庫上操作
在主庫上用rman做一個全備,也需要建立備份的目錄:
mkdir /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup
chmod 777 /mnt/disk1 /backup
mkdir -p /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
chown -R oracle:oinstall /mnt/disk1/arch/JCZH
chmod 777 /mnt/disk1/arch/JCZH
主庫上進行資料備份
rman
connect target /
backup device type disk format '/mnt/disk1/backup/%U' database plus archivelog;
退出rman,將主庫的備份檔案傳輸到備庫
此處再此強調,一定要關閉防火牆,並且使建立的所有目錄都在oracle使用者下,且具有相應的許可權
cd /mnt/disk1/backup/
scp * bm-db2: /mnt/disk1/backup
備庫上操作 啟動oracle到nomount狀態
su – oracle
sqlplus / as sysdba
startup nomount;
修改備庫的監聽檔案。
cd $ORACLE_HOME/networdk/admin
[[email protected] admin]$ cat listener.ora
# listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = JCZHSTANDBY)
(ORACLE_HOME = /oracle/product/11.2.4/db_1)
(SID_NAME = JCZH)
)
)
ADR_BASE_LISTENER = /oracle
啟動監聽確保服務註冊無誤
lsnrctl start
若監聽已啟動,執行
lsnrctl reload;
此處配置完成後主備庫都應進行連線測試
tnsping JCZH
tnsping JCZHSTANDBY
顯示Ok則配置完成,若有問題則檢查防火牆與tns檔案是否有誤!
7應用備份檔案
主庫資料庫啟動到Mount狀態
進入sqlplusshutdown immediate;
startup mount;
主庫應用備份檔案到備庫上,使用duplicate方式(在主庫上執行)
Oralce使用者下執行 rman指令
rman
connect target /
connect auxiliary sys/[email protected]
duplicate target database for standby;
如果主備庫日誌存放路徑與資料庫存放路徑相同 standby後面加入 nofilenamecheck命令
duplicate target database for standby nofilenamecheck;
執行中 等待命令完成
執行備庫恢復模式。(在備庫上執行)
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
JCZH MOUNTED
將主庫切換為Open狀態。
主庫進入 sqlplus模式
alter database open;
SQL> alter database recover managed standbydatabase disconnect from session;
Database altered.
檢視日誌同步情況,確保日誌都應用了。
select name,sequence#,APPLIED from v$archived_log order by sequence#;
沒有資料或日誌出現No都有問題 檢查檔案許可權以及防火牆問題,還不能解決
檢視日誌資訊
沒有資料或日誌出現No都有問題 檢查檔案許可權以及防火牆問題,還不能解決
檢視日誌資訊
[email protected] admin]$ cd $Oracle_Base/diag/rdbms/jczhstandby/JCZH/trace/
[[email protected] trace]$ tail -100f alert_JCZH.log
建立 standby logfile 。主庫和備庫都要新增。
主庫:
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M;
備庫:
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M;
注意路徑修改
8 實現日誌同步
備庫上執行
alter database recover managed standby database disconnect from session;
若提示已有恢復程序在進行中,則應用以下命令取消:
SQL> alter database recover managed standby database cancel;
SQL> alter database recover managed standby database cancel;
將備庫啟動到openread only的狀態
SQL> alter database open read only;
9檢視日誌是否同步
檢視主庫和備庫的日誌同步情況,確保已經同步主庫:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch/JCZH
Oldest online log sequence 21
Next log sequence to archive 23
Current log sequence 23
備庫:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch/JCZHSTANDBY
Oldest online log sequence 21
Next log sequence to archive 0
Current log sequence 23
備庫執行:
select name,sequence#,APPLIED from v$archived_log order bysequence#;
若未出現日誌應用資訊 則檢查主庫是否處於Open狀態
若日誌應用狀態出現No 則執行
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
若日誌已應用 但序號不統一 (Next不用管)
在主庫上執行
alter system switch logfile;
執行完成後再使用 archive log list;進行對比
若仍然無法同步,檢視日誌資訊 進行實時監控
10.確認資料同步
在主庫上建立一張表,看備庫上是否可以檢視到。
SQL> create table test (id number);
備庫:
SQL> desc test
ERROR:
ORA-04043: object test does not exist
注意:
發現數據沒有同步,請執行下面語句,接收資料。
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
SQL> desc test
Name Null? Type
----------------------------------------- ------------------------------------
ID NUMBER
再次驗證資料是否同步。
主庫:
SQL> insert into test values(1);
1 row created.
SQL> commit;
Commit complete.
備庫:
SQL> select * from test;
ID
----------
1
至此DataGuard已經搭建完成,接下來就是主備切換了。