本文為墨天輪數據庫管理服務團隊第138期技術分享,內容原創,作者為技術顧問楊玉壯,如需轉載請聯繫小墨(VX:modb666)並註明來源。如需查看更多文章可關注【墨天輪】公眾號。
注意:本文測試搭建,正式環境搭建按需修改
所需環境:兩台服務器
- 主庫:192.168.100.19(自己設置) 主機名:oracle19c 預裝了oracle19c-db軟件 監聽和庫都是正常的
- 備庫:192.168.100.20(自己設置)主機名:oracle19c-dg 預裝了oracle19c-db軟件 (無監聽,無數據庫)
0、最重要的一步,關閉主備庫所在操作系統的防火牆和SELINUX
1、修改/etc/hosts文件,將主從的ip和主機名添加進去(主備兩邊都要做)
192.168.100.19 oracle19c
192.168.100.20 oracle19c-dg
1.1 ping對方主機名看看是否連通
- 主:ping oracle19c-dg
- 備:ping oracle19c
2、主庫啓動到FORCE LOGGING(強制日誌)
簡單點來説:強制日誌就是對數據庫中所有的操作都產生日誌信息,並將該信息寫入到聯機重做日誌文件中(ONLINE REDO LOG)。FORCE LOGGING默認是不開啓的。如果你要是配置ADG的話,那麼強制日誌必須處於開啓狀態。
alter database force logging;
select force_logging from v$database;
FORCE_LOGGING
---------------------------------------
YES
看到YES就成功了
如何關閉強制日誌:
alter database no force logging;
select force_logging from v$database;
FORCE_LOGGING
---------------------------------------
NO
3、檢查主庫是否在歸檔模式下
archive log list;
如果不是的話就設置到歸檔模式:
使用oracle用户執行下面的創建目錄命令
mkdir -p /u01/app/oracle/oradata/ORCL/arch
進入到ORACLE數據庫
sqlplus / as sysdba
設置歸檔目錄
alter system set log_archive_dest_1='location=/u01/app/oracle/oradata/ORCL/arch' scope=both;
關閉數據庫
shutdown immediate
將數據庫啓動到mount狀態
startup mount
開啓歸檔模式
alter database archivelog;
啓動數據庫
alter database open;
再次檢查歸檔狀態
archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/oradata/ORCL/arch
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
看到上面信息證明已經開啓了。
3.1 給主庫添加stand by備用日誌組 ,要比現有的日誌組多一組。
select group#, members, bytes from v$log;
GROUP# MEMBERS BYTES
---------- ---------- ----------
1 1 209715200
2 1 209715200
3 1 209715200
現在我有三組,按照上面的説法那麼我的standby日誌組就要有四組。standby日誌組是給切換以後的備庫用的。
select member from v$logfile;(找到你的redo的位置)
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/redo03.log
/u01/app/oracle/oradata/ORCL/redo02.log
/u01/app/oracle/oradata/ORCL/redo01.log
添加standby日誌
alter database add standby logfile '/u01/app/oracle/oradata/ORCL/stdredo01.log' size 200M;
alter database add standby logfile '/u01/app/oracle/oradata/ORCL/stdredo02.log' size 200M;
alter database add standby logfile '/u01/app/oracle/oradata/ORCL/stdredo03.log' size 200M;
alter database add standby logfile '/u01/app/oracle/oradata/ORCL/stdredo04.log' size 200M;
select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/redo03.log
/u01/app/oracle/oradata/ORCL/redo02.log
/u01/app/oracle/oradata/ORCL/redo01.log
/u01/app/oracle/oradata/ORCL/stdredo01.log
/u01/app/oracle/oradata/ORCL/stdredo02.log
/u01/app/oracle/oradata/ORCL/stdredo03.log
/u01/app/oracle/oradata/ORCL/stdredo04.log
添加完成
4、為了讓ADG庫起到更好的作用,我們需要修改LINUX內核參數。
將這兩個參數加入到sysctl.conf文件中並sysctl -p生效(用ROOT用户)
vi /etc/sysctl.conf
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
添加後生效
sysctl -p
注:net.ipv4.tcp\_r(w)mem含義為:自動優化所使用的接收緩衝區
5、將監聽修改為靜態監聽(強烈推薦。因為我們要加入網絡優化參數,如果你不加參數也可以)
切換到監聽所在目錄(主備庫都要做)
cd $ORACLE_HOME/network/admin
vi listener.ora(創建靜態監聽)這是主庫的
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19c/db_1/)
(PROGRAM = extproc)
)
(SID_DESC =
(SDU=32767)
(SID_NAME = orcl)
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19c/db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
修改完了以後重新加載監聽 lsnrctl reload
然後檢查監聽狀態 lsnrctl status
vi listener.ora(創建靜態監聽)這是備庫的
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19c/db_1/)
(PROGRAM = extproc)
)
(SID_DESC =
(SDU=32767)
(SID_NAME = orcl)
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19c/db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-dg)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
6、修改tnsname.ora文件 主備庫都添加下面的內容
註釋:這是添加主備庫的別名,其中MD代表MASETDATABASE 主庫別名;SD代表SLAVEDATABASE 備庫別名。
vi tnsnames.ora(先修改主庫的,裏面有東西的話不用管直接添加下列內容)
MD =
(DESCRIPTION =
(SDU=32767)
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
SD =
(DESCRIPTION =
(SDU=32767)
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-dg)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
vi tnsnames.ora(修改備庫的,裏面有東西的話不用管直接添加下列內容)
MD =
(DESCRIPTION =
(SDU=32767)
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
SD =
(DESCRIPTION =
(SDU=32767)
(SEND_BUF_SIZE=1406250)
(RECV_BUF_SIZE=1406250)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-dg)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
下列連通性實驗必須保證主備庫監聽都是開啓的:
主庫在oracle用户下使用:tnsping SD
[oracle@oracle19c admin]$ tnsping SD
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 11-FEB-2022 14:47:33
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (SDU=32767) (SEND_BUF_SIZE=1406250) (RECV_BUF_SIZE=1406250) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-dg)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK (10 msec)
看到0k就代表成功
備庫在oracle用户下使用:tnsping MD
[oracle@oracle19c-dg admin]$ tnsping md
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 11-FEB-2022 14:47:43
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (SDU=32767) (SEND_BUF_SIZE=1406250) (RECV_BUF_SIZE=1406250) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK (0 msec)
看到OK就代表成功
7、複製密碼文件(從主庫到備庫):
cd $ORACLE_HOME/dbs
scp orapworcl oracle@oracle19c-dg:$ORACLE_HOME/dbs
(傳輸過程出現這玩意:Are you sure you want to continue connecting (yes/no)? 必須 輸入yes)
拷貝完成後測試一下:
sqlplus sys/oracle@MD as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Feb 11 15:57:31 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> exit
8、主庫添加下列參數:
alter system set job_queue_processes=10 scope=spfile; --作業進程限制 可加可不加看你具體需求
alter system set db_unique_name='orclmd' scope=spfile; (由於我們使用的是一個高可用集羣,所以集羣下每個節點都需要有一個唯一名)
orclmd=orcl(實例名)md(masterdatabase)
本地監聽只會註冊你規定好的別名:
alter system set local_listener='MD' scope=spfile;
alter system set global_names=true scope=both; --開啓全局名稱
ALTER DATABASE RENAME GLOBAL_NAME TO orcl; --設置你的全局名稱 要和非DG集羣時你的實例名保持一致
--db_file_name_convert :在使用數據複製時,指定你的主備庫的數據複製路徑
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL' scope=spfile;
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL' scope=spfile;
(主庫) (備庫)
如果你的數據文件有多個路徑(兩個路徑:/u01/app/oracle/oradata/ORCL和/u01/app/oracle/oradata/ORCL1)
主庫第一個路徑 對應的備庫的第一路徑
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL' ,'/u01/app/oracle/oradata/ORCL1','/u01/app/oracle/oradata/ORCL1'scope=spfile;
主庫第二路徑 對應備庫第二路徑
--log_file_name_convert:在使用數據複製時,指定你的主備庫的日誌複製路徑(online REDO和standby redo)
alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL/redo' scope=spfile;
--FAL_CLIENT 設定FAL的客户端名稱,一般為本地在tnsnames.ora中的別名,改參數只在備庫角色時有效,但是ORACLE建議你還是在兩邊都是要設置,為了方便角色切換。
alter system set fal_client='MD' scope=spfile;
--這個參數設定備庫從哪裏獲取到歸檔日誌,一般設定為對方(如果是主庫的就相對於是備庫,如果備庫的話就相對於是主庫)在tnsnames.ora文件裏的別名。
alter system set fal_server='SD' scope=spfile;
--啓動db接收或發送redo data,包括所有庫的db_unique_name
alter system set log_archive_config = 'DG_CONFIG=(orclmd,orclsd)' scope=spfile;
重新指定歸檔目錄
alter system set log_archive_dest_1='location=/u01/app/oracle/oradata/ORCL/arch valid_for=(all_logfiles,all_roles) db_unique_name=orclmd' scope=spfile;
alter system set log_archive_dest_2='service=SD LGWR SYNC AFFIRM valid_for=(all_logfiles,primary_role) db_unique_name=orclsd' scope=spfile;
-歸檔目錄的狀態
alter system set LOG_ARCHIVE_DEST_STATE_1='ENABLE';
alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE';
--該參數控制是否自動在備庫中建立主庫新建的數據文件
注意以下兩點:
(1)他不會自動創建日誌文件
(2)如果數據文件重名會覆蓋原有的數據文件
alter system set standby_file_management='AUTO' scope=spfile;
--設置一個叫做orcl的服務
alter system set service_names='orcl' scope=spfile;
--設置歸檔的進程數據量
alter system set log_archive_max_processes=4 scope=spfile;
9、修改備庫參數
9.1 在主庫中把spfile備份出一個pfile出來,方便我們修改
cd $ORACLE_HOME/dbs
strings spfileorcl.ora > orcl_init.ora
scp orcl_init.ora oracle@oracle19c-dg:$ORACLE_HOME/dbs
9.2 進入到備庫的$ORACLE\_HOME/dbs下
cd $ORACLE_HOME/dbs
vi orcl_init.ora(把這種orcl.__的統統刪除)
(修改下列參數)
*.db_unique_name='orclsd'
*.global_names=TRUE
*.local_listener='SD'
*.fal_client='SD'
*.fal_server='MD'
*.log_archive_config='DG_CONFIG=(orclmd,orclsd)' --這個位置不需要修改了
*.log_archive_dest_1='location=/u01/app/oracle/oradata/ORCL/arch valid_for=(all_logfiles,all_roles) db_unique_name=orclsd'
*.log_archive_dest_2='service=MD LGWR SYNC AFFIRM valid_for=(all_logfiles,primary_role) db_unique_name=orclmd'
*.log_archive_format='ARC_%t_%S_%r.arc' (我主庫在開歸檔時沒有改,你們按需修改歸檔命名格式)
創建歸檔目錄()
mkdir -p /u01/app/oracle/oradata/ORCL/arch
創建adump目錄
mkdir -p /u01/app/oracle/admin/orcl/adump
創建redo目錄
mkdir -p /u01/app/oracle/oradata/ORCL/redo
備庫的參數文件整體信息:
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCL/control01.ctl','/u01/app/oracle/oradata/ORCL/control02.ctl'#Restore Controlfile
*.db_block_size=8192
*.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL'
*.db_name='orcl'
*.db_unique_name='orclsd'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.fal_client='SD'
*.fal_server='MD'
*.global_names=TRUE
*.local_listener='SD'
*.log_archive_config='DG_CONFIG=(orclmd,orclsd)'
*.log_archive_dest_1='location=/u01/app/oracle/oradata/ORCL/arch valid_for=(all_logfiles,all_roles) db_unique_name=orclsd'
*.log_archive_dest_2='service=MD LGWR SYNC AFFIRM valid_for=(all_logfiles,primary_role) db_unique_name=orclmd'
*.log_archive_max_processes=4
*.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCL/redo'
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=200m
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.service_names='orcl'
*.sga_target=700m
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
10、重啓主備庫監聽
11、主備庫測試連接(如果你之前已經做過了,那麼這一步你也沒必要做了)
--主
sqlplus sys/oracle@SD as sysdba
--備
sqlplus sys/oracle@MD as sysdba
12、啓動備庫到nomount狀態(用我們剛才做的那個pfile,如果你之前做完了 這一步就不用再做了)
########################################################
startup nomount pfile='/u01/app/oracle/product/19c/db_1/dbs/orcl_init.ora'
數據庫正常啓動以後創建spfile
create spfile from pfile='/u01/app/oracle/product/19c/db_1/dbs/orcl_init.ora';
關閉數據庫
shutdown abort
########################################################
這次再將備庫啓動到nomount狀態 spfile文件創建完成
startup nomount
執行這個命名alter system set standby\_file\_management='MANUAL';防止redo複製時出錯
用該命令檢查一下參數
SHOW PARAMETER STANDBY_FILE_MANAGEMENT
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
standby_file_management string
MANUAL(看到這玩意就是成功了)
13、在主庫通過Rman Duplicate創建備庫
主庫上執行
rman target sys/oracle@MD auxiliary sys/oracle@SD nocatalog
ORACLE用户下執行的
然後開始複製數據庫:
duplicate target database for standby from active database nofilenamecheck;
14、在備庫執行此語句代表文件全部傳輸到此
select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/redo/redo03.log
/u01/app/oracle/oradata/ORCL/redo/redo02.log
/u01/app/oracle/oradata/ORCL/redo/redo01.log
/u01/app/oracle/oradata/ORCL/redo/stdredo01.log
/u01/app/oracle/oradata/ORCL/redo/stdredo02.log
/u01/app/oracle/oradata/ORCL/redo/stdredo03.log
/u01/app/oracle/oradata/ORCL/redo/stdredo04.log
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/system01.dbf
/u01/app/oracle/oradata/ORCL/sysaux01.dbf
/u01/app/oracle/oradata/ORCL/undotbs01.dbf
/u01/app/oracle/oradata/ORCL/users01.dbf
備庫複製完之後已經就是mount狀態了
15、到備庫開啓實時日誌應用
alter database open;
alter database recover managed standby database using current logfile disconnect from session;
set pagesize 100
歸檔日誌的應用狀態
select sequence# ,applied from v$archived_log;
SEQUENCE# APPLIED
---------- ---------------------------
11 YES
12 YES
13 YES
14 IN-MEMORY(不用去關心)
上述語句執行完畢後,把我們這個給改回來
alter system set standby_file_management='AUTO';
standby_file_management --->備庫文件管理“AUTO-自動模式,MANUAL-手動模式”
16、主庫建表驗證是否備庫中存在(後面再做。。。。)
17、關閉備庫後重新啓動
關閉備庫:
shutdown immediate
開啓備庫:
startup
查看備庫狀態:
select database_role,protection_mode,open_mode from v$database;
SQL> select database_role,protection_mode,open_mode from v$database;
DATABASE_ROLE PROTECTION_MODE OPEN_MODE
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY(看到這個狀態就説明你成功了)
recover managed standby database using current logfile disconnect from session; (備庫應用日誌進行介質恢復)
SQL> recover managed standby database using current logfile disconnect from session;
Media recovery complete.
SQL> select database_role,protection_mode,open_mode from v$database;
DATABASE_ROLE PROTECTION_MODE OPEN_MODE
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY (實時應用日誌開啓成功)
至此 ADG配置完成。
墨天輪從樂知樂享的數據庫技術社區蓄勢出發,全面升級,提供多類型數據庫管理服務。墨天輪數據庫管理服務旨在為用户構建信賴可託付的數據庫環境,併為數據庫廠商提供中立的生態支持。
墨天輪數據庫服務官網:https://www.modb.pro/service