1. 程式人生 > 實用技巧 >ORACLE DG 單例項-單例項

ORACLE DG 單例項-單例項

環境說明:

主庫:primary 192.168.2.31 例項名:dg 對外的服務名稱:pri
備庫:standby 192.168.2.101 例項名稱dg 對外的服務名稱:std

備庫不需要建立例項,只需要安裝資料庫軟體,因為這點,有人就會問,沒有建立例項為什麼會有例項名稱呢,
這個例項名稱是指在和主庫保持一致而在引數檔案中需要寫入的例項名稱
這裡要注意區分:
主機名 例項名 服務名
etc/hosts 監聽和引數檔案中會用到 監聽和連線例項時需要用到
監聽中需要用到

oracle中:
1、查詢資料庫名:select name,dbid from v$database;或者show parameter db_name;
2、查詢例項名:select instance_name from v$instance;或者show parameter instance_name;
3、查詢資料庫域名:select value from v$parameter where name='db_domain';或者show parameter domain;
4、查詢資料庫伺服器:select value from v$parameter where name='service_name';或者show parameter service;或者show parameter names;
5、資料庫服務名:此引數是資料庫標識類引數,用service_name表示。資料庫如果有域,則資料庫服務名就是全域性資料庫名;
如果沒有,則資料庫服務名就是資料庫名。查詢:show parameter service_name;

主備庫都需要新增ip地址和主機名稱的對應,是為了在監聽中的host 作為連線

/etc/hosts
192.168.2.31 primary
192.168.2.101 standby

一、監聽和服務的配置
1、主庫listener.ora

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = pri)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/)
(SID_NAME = dg)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS 
= (PROTOCOL = TCP)(HOST = primary)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle

注意這裡的pri和dg(pri是指一個數據庫對外提供的服務,dg是指例項的名稱,這裡提供了一個名為pri的服務該服務下有dg這個例項)
連線時就可以使用sqlplus sys/abc123@pri as sysdba 表示連線到了dg這個例項上。
主庫:tnsnames.ora 備庫(tnsnames和主庫一樣)

std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = std)
)
)

pri =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pri)
)
)

備庫listener.ora

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = std)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/)
(SID_NAME = dg)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

ADR_BASE_LISTENER = /u01/app/oracle

配置完成之後重啟監聽。
並使用下面的語句驗證:
(1)tnsnames配置完之後tnsping pri 和tnsping std應該成功
(2)lisenter.ora配置完之後使用sqlplus sys/abc123@pri as sysdba
sqlplus sys/abc123@std as sysdba
測試是否可以連線,如果沒有聯通,一般是因為沒有將密碼檔案傳輸到備庫。

3、生成密碼檔案並將密碼檔案複製到對應的目錄:(使用dbca會自動生成密碼檔案)

建立口令檔案 orapwd file='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwprimary' password=letoula entries=10
密碼為sys使用者的密碼 
scp /u01/app/oracle/product/11.2.0/dbs/orapwdg oracle/@192.168.8.131:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/

因為我們的主庫和備庫的例項名稱一致所以口令檔案也應該完全一致。就是用主庫的口令檔案,這樣才能保證
使用sqlplus連線時使用者名稱和密碼的正確性。


二、前期的準備:

(1)設定強制寫日誌

[oracle@Oracle11g2 admin]$ sqlplus / as sysdba 
SQL> select FORCE_LOGGING from v$database; 
NO 
SQL> alter database force logging;

SQL> select FORCE_LOGGING from v$database;
YES

(2)修改資料庫執行在歸檔模式下

archive log list
sql>SHUTDOWN IMMEDIATE; 
sql>STARTUP MOUNT; 
sql>ALTER DATABASE ARCHIVELOG; 
sql> ALTER DATABASE OPEN; 
修改歸檔的路徑:
alter system set log_archive_dest_1='location=/u01/app/arch/dg';

(3)新增standby redolog
主庫、從庫上都配置standby redolog

在主庫檢視日誌組的數量和每個日誌檔案的大小??
SQL>select * from v$log;

在備庫庫檢視日誌組的數量和每個日誌檔案的大小??
SQL>select * from v$log;

建立日誌組和redolog檔案
ALTER DATABASE ADD STANDBY LOGFILE group11('/u01/app/oracle/oradata/dg/redo11.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group12('/u01/app/oracle/oradata/dg/redo12.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group13('/u01/app/oracle/oradata/dg/redo13.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group14('/u01/app/oracle/oradata/dg/redo14.log') SIZE 50M;

standby redolog的組數參考公式:(online redolog組數+1)*資料庫執行緒數;

單機執行緒數為1,RAC一般為2。standby redolog的組成員數和大小也儘量和online redolog一樣。


(4) 在主庫上建立備份庫需要的控制檔案 (注意要啟動到nomount狀態,否則控制檔案不一致)
建立控制檔案:

sql>ALTER  DATABASE  CREATE  STANDBY  CONTROLFILE  AS  '/tmp/standby.ctl';  
scp 到備庫

(5) 備份生產資料庫 將主庫資料庫檔案拷貝到備份機器上(注意目錄也需要一致,如果沒有該目錄這需要建立檔案)
包括主庫的所有的
資料檔案
密碼檔案
引數檔案
線上日誌和standby 日誌檔案
控制檔案(注意這裡的控制檔名稱為standby.ctl拷貝過去之後,要將名稱修改為原來的名稱也就是pfile檔案中對應的名
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl')
並且兩個目錄都要有,第二個控制檔案是從第一地復並重命名的。

在備庫複製兩份控制檔案

scp /u01/app/oracle/oradata/dg/* oracle/@192.168.2.101:/u01/app/oracle/oradata/dg/
cp standby.ctl /u01/app/oracle/oradata/dg/control01.ctl
cp /u01/app/oracle/oradata/dg/control01.ctl /u01/app/oracle/fast_recovery_area/dg/control02.ctl

二、(主庫)引數檔案
(1)生成pfile檔案並新增DG需要的配置
啟動主庫 startup

create pfile='/home/oracle/spfile/initdg.ora' from spfile;

(2)修改pfile檔案

dg.__db_cache_size=587202560
dg.__java_pool_size=16777216
dg.__large_pool_size=33554432
dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dg.__pga_aggregate_target=587202560
dg.__sga_target=855638016
dg.__shared_io_pool_size=0
dg.__shared_pool_size=201326592
dg.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='dg'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1435500544
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

以下是新增的內容:
*.db_unique_name='pri'
*.log_archive_config='DG_CONFIG=(pri,std)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri'
*.log_archive_dest_2='SERVICE=std LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=std'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='std'
*.fal_client='pri'
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
*.standby_file_management='AUTO'
#*.standby_archive_dest='/u01/app/arch/primary'



alter system set db_unique_name='RAC' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(RAC,DG)' scope=both sid='*';
alter system set log_archive_dest_1='LOCATION=+DATADG/rac/ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RAC' scope=both sid='*';
alter system set log_archive_dest_2='SERVICE=DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DG' scope=both sid='*';


alter system set db_file_name_convert='/u01/app/oracle/data/orcl/datafile','+DATADG/RAC/DATAFILE' scope=spfile sid='*';
alter system set log_file_name_convert='/u01/app/oracle/data/orcl/onlinelog','+DATADG/rac/ONLINELOG' scope=spfile sid='*';


alter system set standby_file_management=AUTO scope=both sid='*';
alter system set fal_server='DG' scope=both sid='*';

(3)修改完成之後,使用修改後的pfile建立spfile ,也就是運用當前的引數
主庫:
shutdown immediate

建立主庫spfile
sql>startup pfile='/home/oralce/spfile/initdg.ora';
sql > create spfile from pfile;

再次關閉資料庫並使用後當前的spfile啟動資料庫:
sql >shutdown immediate
sql >startup

四、備庫引數檔案的修改:
(1)複製一份主庫使用的pfile檔案到備庫的/home/oracle/spfile這個檔案是自己建立的,
方便對pfile檔案修改:
scp initdg.ora [email protected]:/home/oracle/spfile/

(2)修改備庫的pfile檔案,因為備庫的例項名稱和主庫的一致,所有前面的所有有關例項的引數都不休要修改。
只需要修改dg的相關配置引數:

dg.__db_cache_size=587202560
dg.__java_pool_size=16777216
dg.__large_pool_size=33554432
dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dg.__pga_aggregate_target=587202560
dg.__sga_target=855638016
dg.__shared_io_pool_size=0
dg.__shared_pool_size=201326592
dg.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='dg'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1435500544
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

以下是修改的內容
*.db_unique_name='std'
*.log_archive_config='DG_CONFIG=(pri,std)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'
*.log_archive_dest_2='SERVICE=pri LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='pri'
*.fal_client='std'
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
*.standby_file_management='AUTO'
#*.standby_archive_dest='/u01/app/arch/primary'
注:檔案的轉換隻需要在備庫修改即可,主庫可以不用修改(只考慮主備切換的情況)

ALTER SYSTEM SET db_file_name_convert=('+DATADG/yymh/datafile','/data/yymh/datafile','+DATADG/yymh/tempfile','/data/yymh/tempfile/')


這裡註釋的內容
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
可以檢視相關引數說明,因為主備例項一致,目錄結構也一致,所以不需要配置

(3)建立備庫需要的目錄:(主要對照pfile檔案的內容)需要
建立歸檔目錄:*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
審計目錄:*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
控制檔案和資料檔案目錄:
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
資料檔案目錄:/u01/app/oracle/oradata/dg/


(4)修改好pfile檔案,建立了目錄,並且將所有的控制檔案,資料檔案,redolog檔案、密碼檔案上傳之後,我們就可以啟動備庫了;
以pfile檔案啟動資料庫為nomount狀態。

sql>startup nomount pfile='/home/oralce/spfile/initdg.ora'
sql>alter database mount standby database;

建立spfile檔案
sql>create spfile from pfile='/u01/app/backup/initstandby.ora';
(建立好spfile檔案之後我們可以使用spfiel檔案啟動資料庫了)

下面就是然資料同步了,這是可以測試,現在主庫上插入資料,再到備庫上執行下面的恢復語句,將資料恢復到備庫上。
修改資料庫處於應用歸檔狀態
alter database recover managed standby database disconnect from session;


通過下列語句暫停redo應用。
不關閉這個狀態的話那麼備庫資料庫會自動和主庫保持一致,主庫的所有操作都會和備庫一致。
否則需要手動執行日誌切換才能保證主備庫的狀態的一致:alter system switch logfile;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

只讀模式開啟資料庫
alter database open read only;

配置完成
----------------------------------------------------------
----------------------------------------------------------
判斷配置是否成功,主要通過檢視主資料庫歸檔日誌的sequence是否一致 檢視方法
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
55
通過在主庫執行alter system switch logfile; 切換日誌,可以觀察到備庫會自動應用通過主庫傳過來的日誌
SQL> alter system switch logfile;
查詢資料庫狀態 SQL> select status from v$instance;
查詢歸檔日誌是否應用(應用需要點時間)SQL> select sequence#,applied from v$archived_log where applied='YES' order by sequence#;
檢視主庫DG狀態:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
日誌測試:
在primary庫上執行

五、Start Redo Apply
下面的語句可以所有的主庫的資料運用到備庫:

sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE 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;



檢視dg主備庫同步情況

藍小山 2020-05-19 14:49:59 334 收藏 1
分類專欄: ORACLE
版權
使用sys使用者登入備庫資料庫,檢視資料庫狀態
select open_mode,database_role from v$database;
1
檢視備庫程序情況
select process,status,sequence# from v$managed_standby;

RFS程序:負責日誌的傳輸
MRP程序:負責日誌的應用
針對RAC環境的dg環境,RFS和MRP是隻存在一個節點中的。
如果登入一個節點發現沒有這兩個程序,要在另一個節點上再次驗證。

檢視備庫資料庫同步情況:
select thread#,sequence#,applied from v$archived_log;
檢視applied的結果,如果是YES 最後為IN-MEMORY 表示資料已經應用。
如果 結果中出現NO,表示資料同步已經出現延遲,要明確是未來得及應用還是同步中斷。