ORACLE DataGuard环境搭建详细步骤(新方法)
生活随笔
收集整理的這篇文章主要介紹了
ORACLE DataGuard环境搭建详细步骤(新方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:實驗環境介紹
***鑒于生產環境均采用64位系統和數據庫軟件,本實驗也將采用這個標準***采用vmware workstation 10(版本隨意,我用的10)虛擬機軟件作為安裝平臺對于真機的要求:CPU:INTEL:CORE I3級別或以上(推薦)AMD :4核心CPU或以上(推薦)內存:建議4G以上系統:WIN7 /8 64位/WINDOWS SERVER 2003/2008 64位硬盤:虛擬機所在分區剩余空間50G以上,固態硬盤最好虛擬機系統: Oracle Enterprise Linux 5 update 5(64位)
數據庫版本: Oracle 11gR2 11.2.0.3 (64位)基礎要求:(1)安裝兩臺虛擬機分別作為主庫和備庫,硬盤大小隨意。但要保證
根分區有20G,別給太小了就行。物理內存1G,SWAP 2G關于Active database duplication方式:(必看)
在Oracle 10g下,我們可以使用RMAN duplicate 命令創建一個具有不同DBID 的復制庫。 到了Oracle 11gR2, RMAN 的duplicate 有2種方法實現:1. Active database duplication (本文所使用的方式,適用于11gR2之后的版本)2. Backup-based duplication (傳統方式,10g,11g通用)Active database duplication 通過網絡,直接copy target 庫到auxiliary 庫,然后創建復制庫。這種方法就不需要先用RMAN 備份數據庫,然后將備份文件發送到auxiliary端。這個功能的作用是非常大的。 尤其是對T級別的庫。 因為對這樣的庫進行備份,然后將備份集發送到備庫,在進行duplicate 的代價是非常大的。 一備份要占用時間,二要占用備份空間,三在網絡傳送的時候,還需要占用帶寬和時間。所以Active database duplicate 很好的解決了以上的問題。 它對大庫的遷移非常有用。如果是從RAC duplicate 到單實例,操作是一樣的。 如果是從單實例duplicate 到RAC。 那么先duplicate 到 單實例。 然后將單實例轉換成RAC。二:安裝數據庫軟件前的系統配置 (主庫和備庫端都要做下列操作)
1.基本配置:
一定要用新裝的系統(這里以紅帽企業版5.5為例),系統要求最低配置1G內存,2Gswap分區,根分區20G以上,裝好系統后先配置好yum,IP地址,/etc/sysconfig/network文件中的主機名,以及/etc/hosts文件中的IP地址和主機名的對應關系。主庫IP:192.168.1.101
主庫主機名:pri.cty.com pri
備庫IP:192.168.1.102
備庫主機名:std.cty.com std2.裝包
yum install binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers ksh kernel-headers libaio libaio-devel libgcc libgomp libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel -y3.查看共享內存大小,要求最低為1GB
# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 506M 0 506M 0% /dev/shm
發現不夠,修改
# vim /etc/fstab 在tmpfs那一行的defaults后面加上,size=1024m保存退出后重新掛載:
# mount -o remount /dev/shm
再次查看共享內存:
# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.0G 0 1.0G 0% /dev/shm
修改成功4.創建相關的組與用戶:
groupadd oinstall
groupadd dba
groupadd oper
useradd -g oinstall -G dba,oper oracle
passwd oracle5.創建所需的目錄并賦予特定的屬主和屬組
mkdir /u01/app/oracle -pv
chown oracle.oinstall /u01 -R
建議:最好為單獨分一個區,然后將u01掛載到該分區上(可不做,看情況)6.編輯limits.conf 文件
vim /etc/security/limits.conf
添加下面5行內容:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 102407.編輯sysctl.conf文件,設置相關參數
vim /etc/sysctl.conf
添加/修改下列內容:(注意!下面的參數,若是已經存在,則直接修改數值,不要再添加同樣的參數,相同的參數只能有一個!如果需要修改的參數已經大于下面的數字,則不用修改,請仔細核對!)
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
保存退出后,別忘了用sysctl -p命令使參數生效!8.編輯vim /home/oracle/.bash_profile文件,配置相關環境變量
添加下列幾行:
export TMP=/tmp
export TMPDIR=/tmp
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export ORACLE_SID=pri (備庫端設置為std)
export PATH=$ORACLE_HOME/bin:$PATH
至此,安裝環境相關配置結束。三:開始安裝oracle11g數據庫軟件 (主庫和備庫端都要做下列操作)
1.掛載oracle11g的鏡像到/mnt/cdrom 目錄下,并把3個包解壓到/usr/local/src 目錄下
cd /mnt/cdrom/
unzip p10404530_112030_LINUX_1of7.zip -d /usr/local/src
unzip p10404530_112030_LINUX_2of7.zip -d /usr/local/src
unzip p10404530_112030_LINUX_3of7.zip -d /usr/local/src
(只裝數據庫的話,解壓前兩個包即可,第三個包是grid)
2. root身份執行xhost +,然后切換到oracle用戶進入/usr/local/src/database目錄中,執行runInstaller 開始安裝 (database是默認解壓完的目錄名)
# xhost +
# su - oracle
$ ./runInstaller
注意:安裝oracle11g要求分辨率最低為1024x768,不然無法完整顯示安裝過程安裝過程:略
注意:主庫在安裝完軟件后需要進行DBCA建庫操作,推薦不要啟用歸檔模式,會節省時間,備庫端不要建庫!四:開始搭建Dataguard1:將數據庫改為強制日志模式 (此步驟只在主庫上做)
[oracle@pri ~]$ sqlplus / as sysdba查看當前是否強制日志模式:
SYS@pri> select name,log_mode,force_logging from v$database; NAME LOG_MODE FOR
--------- ------------ ---
PRI NOARCHIVELOG NOSYS@pri> alter database force logging;Database altered.SYS@pri> select name,log_mode,force_logging from v$database;NAME LOG_MODE FOR
--------- ------------ ---
PRI NOARCHIVELOG YES2:創建密碼文件(此步驟只在主庫上做)
注意:兩端分別創建自己的密碼文件好像有問題,備庫的密碼文件需要跟主庫一致,否則導致日志傳輸不到備庫,有待驗證。我最后是將主庫的密碼文件直接copy到備庫,重命名后使用。
[oracle@pri ~]$ cd $ORACLE_HOME/dbs
[oracle@pri dbs]$ ls
hc_racdb1.dat init.ora initracdb1.ora orapwpri 已經有一個密碼文件了
[oracle@pri dbs]$ orapwd file=orapwpri password=oracle force=y
(windows :orapwd file=D:/oracle/product/10.1.0/Db_1/database/PWDorcl.ORA password=oracle;)
這條命令可以手動生成密碼文件,force=y的意思是強制覆蓋當前已有的密碼文件
[oracle@pri dbs]$ ls
hc_pri.dat init.ora initpri.ora lkPRI orapwpri spfilepri.ora將主庫的密碼文件copy給備庫,并重命名
[oracle@pri dbs]$ scp orapwpri 192.168.1.102:$ORACLE_HOME/dbs/orapwstd
orapwpri 100% 1536 1.5KB/s 00:00 3:創建standby redolog日志組 (此步驟只在主庫上做)
原則:
1:standby redo log的文件大小與primary 數據庫online redo log 文件大小相同
2:standby redo log日志文件組的個數依照下面的原則進行計算:Standby redo log組數公式>=(每個instance日志組個數+1)*instance個數假如只有一個節點,這個節點有三組redolog,所以Standby redo log組數>=(3+1)*1 == 4所以至少需要創建4組Standby redo log查看當前線程與日志組的對應關系及日志組的大小:
SYS@pri> select thread#,group#,bytes/1024/1024 from v$log; THREAD# GROUP# BYTES/1024/1024--------------- ------------- ------------------------1 1 501 2 501 3 50
如上,我現在的環境有三組redolog,每個日志組的大小都是50M,
所以Standby redo log組數>=(3+1)*1== 4
所以至少需要創建4組Standby redo log,大小均為50M
(thread:線程,只有在多實例數據庫才有用的參數,例如RAC環境,單實例不考慮)查看當前有哪些日志組及其成員:
SYS@pri> col member for a50
SYS@pri> select group#,member from v$logfile;GROUP# MEMBER
---------- --------------------------------------------------3 /u01/app/oracle/oradata/pri/redo03.log2 /u01/app/oracle/oradata/pri/redo02.log1 /u01/app/oracle/oradata/pri/redo01.log先手動創建standby log日志組所需的目錄:
(創建新目錄只是為了便于區分,并非必須)
[oracle@pri dbs]$ cd /u01/app/oracle/oradata/
[oracle@pri oradata]$ ls
pri
[oracle@pri oradata]$ mkdir standbylog
[oracle@pri oradata]$ ls
pri standbylog新建4個日志組作為standby redolog日志組,大小與原來的日志組一致:
由于已經存在group1-3,,所以group號只能從4開始
SYS@pri> alter database add standby logfile group 52 '+DATA/tongyong/onlinelog/std_redo05.log'3 size 300m;Database altered.SYS@pri> alter database add standby logfile group 52 '/u01/app/oracle/oradata/standbylog/std_redo05.log'3 size 50m;Database altered.SYS@pri> alter database add standby logfile group 62 '/u01/app/oracle/oradata/standbylog/std_redo06.log'3 size 50m;Database altered.SYS@pri> alter database add standby logfile group72 '/u01/app/oracle/oradata/standbylog/std_redo07.log'3 size 50m;Database altered.查看standby 日志組的信息:
SYS@pri> select group#,sequence#,status, bytes/1024/1024 from v$standby_log;GROUP# SEQUENCE# STATUS BYTES/1024/1024
---------- ------------------ ------------------- ------------------------4 0 UNASSIGNED 505 0 UNASSIGNED 506 0 UNASSIGNED 507 0 UNASSIGNED 50查看當前有哪些日志組及其成員:
SYS@pri> set pagesize 100
SYS@pri> col member for a60
SYS@pri> select group#,member from v$logfile order by group#;GROUP# MEMBER------------ ------------------------------------------------------------1 /u01/app/oracle/oradata/pri/redo01.log2 /u01/app/oracle/oradata/pri/redo02.log3 /u01/app/oracle/oradata/pri/redo03.log4 /u01/app/oracle/oradata/standbylog/std_redo04.log5 /u01/app/oracle/oradata/standbylog/std_redo05.log6 /u01/app/oracle/oradata/standbylog/std_redo06.log7 /u01/app/oracle/oradata/standbylog/std_redo07.log4:修改主庫的pfile參數文件 (此步驟只在主庫上做)查看spfile的路徑:
SYS@pri> show parameter spfile;NAME TYPE VALUE
----------- ----------- -----------------------------------------------------------------
spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfilepri.ora用spfile創建一個pfile,用于修改:
SYS@pri> create pfile from spfile; 修改主庫的pfile:
[oracle@pri ~]$ cd $ORACLE_HOME/dbs
[oracle@pri dbs]$ vim initpri.ora
pri.__db_cache_size=125829120
pri.__java_pool_size=4194304
pri.__large_pool_size=4194304
pri.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
pri.__pga_aggregate_target=146800640
pri.__sga_target=272629760
pri.__shared_io_pool_size=0
pri.__shared_pool_size=125829120
pri.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/pri/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/pri/control01.ctl','/u01/app/oracle/fast_recovery_area/pri/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='pri' DG主庫和備庫的db_name必須一致,db_unique_name不一致
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4227858432
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=priXDB)'
*.memory_target=419430400
*.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/pri valid_for=(all_logfiles,all_roles) db_unique_name=pri'
*.log_archive_dest_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=std'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.log_archive_max_processes=4*.fal_server='std'
*.fal_client='pri'
*.db_file_name_convert='/u01/app/oracle/oradata/std','/u01/app/oracle/oradata/pri'
*.log_file_name_convert='/u01/app/oracle/oradata/std','/u01/app/oracle/oradata/pri'
*.standby_file_management='auto'
修改完畢,保存退出手工創建/u01/app/arch/pri:
[oracle@pri dbs]$ mkdir /u01/app/arch/pri -pv
mkdir: created directory `/u01/app/arch'
mkdir: created directory `/u01/app/arch/pri'5:用修改過的pfile重新創建一個spfile,用于重啟數據庫 (此步驟只在主庫上做)
關閉數據庫:
SYS@pri> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.用修改過的pfile重新創建一個spfile:
SYS@pri> create spfile from pfile; 此時把數據庫改為歸檔模式: (如果當初建庫時選擇了啟用歸檔,則此步驟忽略)
由于當前數據庫已關閉,首先需要把數據庫啟動到mount狀態
SYS@pri> startup mount;
ORACLE instance started.
Database mounted.
SYS@pri> alter database archivelog; 啟用歸檔模式
Database altered.SYS@pri> alter database open; OPEN數據庫
Database altered.SYS@pri> archive log list; 查看是否啟用歸檔模式
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/arch/pri
Oldest online log sequence 6
Next log sequence to archive 8
Current log sequence 8
如上,歸檔路徑已經改為/u01/app/arch/pri,證明對pfile的修改已生效查看當前數據庫是否使用spfile啟動:
SYS@pri> show parameter spfile;NAME TYPE VALUE
----------- ----------- -----------------------------------------------------------------
spfile string /u01/app/oracle/product/11.2.0/db_1/dbs/spfilepri.ora如上,若能看到spfile的路徑,則證明數據庫是使用spfile啟動的,若沒有值,則說明是用pfile啟動的。確認數據庫已經啟用歸檔模式和強制日志模式:
SYS@pri> select name,log_mode,force_logging from v$database;NAME LOG_MODE FOR
--------- ------------------- -------
PRI ARCHIVELOG YES6:修改監聽文件,添加靜態監聽 (主庫、備庫都要做)
主庫:
[oracle@pri ~]$ cd $ORACLE_HOME/network/admin
[oracle@pri admin]$ vim listener.ora 添加如下內容:
SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = pri)(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)(SID_NAME = pri)))主庫修改后最終效果如下圖:備庫:
[oracle@pri ~]$ cd $ORACLE_HOME/network/admin
[oracle@pri admin]$ vim listener.ora 添加如下內容:
SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = std)(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)(SID_NAME = std)))備庫修改后最終效果如下圖:使新增加的監聽生效: (主庫和備庫端都要做)
[oracle@pri admin]$ lsnrctl stop
[oracle@pri admin]$ lsnrctl start 確認新增加的靜態監聽有效:
主庫:
[oracle@pri ~]$ lsnrctl status
..........................................(N行省略)
Service "pri" has 2 instance(s).Instance "pri", status UNKNOWN, has 1 handler(s) for this service...Instance "pri", status READY, has 1 handler(s) for this service...
Service "priXDB" has 1 instance(s).Instance "pri", status READY, has 1 handler(s) for this service...
The command completed successfully備庫:
[oracle@std ~]$ lsnrctl status
..........................................(N行省略)
Service "std" has 1 instance(s).Instance "std", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully如上,靜態監聽添加成功7:編輯網絡服務名配置文件tnsnames.ora (主庫和備庫端都要做)
[oracle@pri admin]$ cd $ORACLE_HOME/network/admin
[oracle@pri admin]$ pwd
/u01/app/oracle/product/11.2.0/db_1/network/admin
[oracle@pri admin]$ ls
listener.ora samples shrept.lst tnsnames.ora
[oracle@pri admin]$ vim tnsnames.ora
編輯結果如下:# tnsnames.ora Network Configuration File:/uel/app/oracleproduct/11.2./db_/n etwork/admin/tnsnames.ora Generated by oracle configuration tools.
PRI=
(DESCRIPTION=(ADDRESS =(PROTOCOL=TCP)(HOST=192.168.1.101)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = pri)))
STD=
(DESCRIPTION=(ADDRESS =(PROTOCOL=TCP)(HOST=192.168.1.102)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = std)))保證主庫和備庫的tnsnames.ora文件中的內容完全相同,可以把修改后的文件直接傳給備庫。
[oracle@pri admin]$ scp tnsnames.ora 192.168.1.102:$ORACLE_HOME/network/admin
tnsnames.ora 100% 925 0.9KB/s 00:00 配置完后,確保在任意一端上都能tnsping通對方:
[oracle@pri admin]$ tnsping std
[oracle@std admin]$ tnsping pri8:在備庫端,修改pfile參數文件(只在備庫端做)
首先,在主庫端把pfile拷貝給備庫端的$ORACLE_HOME/dbs目錄下,并重命名:
[oracle@pri ~]$ cd $ORACLE_HOME/dbs
[oracle@pri dbs]$ ls
hc_pri.dat init.ora initpri.ora lkPRI orapwpri spfilepri.ora
[oracle@pri dbs]$ scp initpri.ora 192.168.1.102:$ORACLE_HOME/dbs/initstd.ora
initpri.ora 100% 1497 1.5KB/s 00:00
然后在備庫端進行修改:
[oracle@std ~]$ cd $ORACLE_HOME/dbs
[oracle@std dbs]$ vim initstd.ora
std.__db_cache_size=125829120
std.__java_pool_size=4194304
std.__large_pool_size=4194304
std.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
std.__pga_aggregate_target=146800640
std.__sga_target=272629760
std.__shared_io_pool_size=0
std.__shared_pool_size=125829120
std.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/std/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/std/std_con.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='pri' DG主庫和備庫的db_name必須一致,db_unique_name不一致
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4227858432
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=stdXDB)'
*.memory_target=419430400
*.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/std valid_for=(all_logfiles,all_roles) db_unique_name=std'
*.log_archive_dest_2='service=pri valid_for=(online_logfiles,primary_role) db_unique_name=pri'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.log_archive_max_processes=4
*.fal_server='pri'
*.fal_client='std'
*.db_file_name_convert='/u01/app/oracle/oradata/pri','/u01/app/oracle/oradata/std'
*.log_file_name_convert='/u01/app/oracle/oradata/pri','/u01/app/oracle/oradata/std'
*.standby_file_management='auto'修改完畢,保存退出注意:整個搭建過程最需要留意的就是主庫和備庫的PFILE配置,建議修改完后仔細對照主備庫PFILE的區別9:在備庫端手工創建所需的目錄(備庫端做,不提前創建的話恢復時會報錯!)
/u01/app/oracle/admin/std/adump
/u01/app/oracle/diag/rdbms/std/std/trace
/u01/app/arch/std
/u01/app/oracle/oradata/std
/u01/app/oracle/oradata/standbylog
創建 /u01/app/oracle/fast_recovery_area創建 /u01/app/oracle/admin/std/adump
[oracle@std dbs]$ cd /u01/app/oracle/
[oracle@std oracle]$ ls
cfgtoollogs checkpoints diag product (由于沒建庫,此時沒有admin目錄)
[oracle@std oracle]$ mkdir -pv admin/std/adump
mkdir: created directory `admin'
mkdir: created directory `admin/std'
mkdir: created directory `admin/std/adump'創建 /u01/app/oracle/diag/rdbms/std/std/trace
[oracle@std oracle]$ cd /u01/app/oracle/diag/rdbms/
[oracle@std rdbms]$ ls (由于沒建庫,該目錄下為空)
[oracle@std rdbms]$ mkdir -pv std/std/trace
mkdir: created directory `std'
mkdir: created directory `std/std'
mkdir: created directory `std/std/trace'創建 /u01/app/arch/std
[oracle@std rdbms]$ cd /u01/app/
[oracle@std app]$ ls
oracle oraInventory
[oracle@std app]$ mkdir -pv arch/std
mkdir: created directory `arch'
mkdir: created directory `arch/std'創建 /u01/app/oracle/oradata/std
[oracle@std app]$ cd /u01/app/oracle/
[oracle@std oracle]$ ls
admin cfgtoollogs checkpoints diag product
[oracle@std oracle]$ mkdir -pv oradata/std
mkdir: created directory `oradata'
mkdir: created directory `oradata/std'創建 /u01/app/oracle/oradata/standbylog
[oracle@std oracle]$ cd /u01/app/oracle/oradata/
[oracle@std oradata]$ ls
std
[oracle@std oradata]$ mkdir -pv standbylog
mkdir: created directory `standbylog'創建 /u01/app/oracle/fast_recovery_area
[oracle@std dbs]$ cd /u01/app/oracle/
[oracle@std oracle]$ ls
admin cfgtoollogs checkpoints diag oradata product
[oracle@std oracle]$ mkdir -pv fast_recovery_area
mkdir: created directory `fast_recovery_area'10:用修改后的pfile創建一個spfile,用于啟動數據庫(備庫端做)
[oracle@std ~]$ sqlplus / as sysdba
Connected to an idle instance.SYS@std> create spfile from pfile;
File created.將數據庫啟動到nomount狀態
SYS@std> startup nomount;
ORACLE instance started.Total System Global Area 839282688 bytes
Fixed Size 2233000 bytes
Variable Size 482348376 bytes
Database Buffers 352321536 bytes
Redo Buffers 2379776 bytes
SYS@std> 11:利用RMAN在備庫上恢復主庫(備庫端做)
[oracle@std ~]$ rman target sys/oracle@pri auxiliary sys/oracle@std
Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 15 20:47:45 2020Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.connected to target database: PRI (DBID=775616459)
connected to auxiliary database: PRI (not mounted)RMAN> duplicate target database for standby from active database nofilenamecheck;
這條命令可以直接恢復數據文件,standby控制文件,standby日志組,非常霸道
Starting Duplicate Db at 15-APR-20
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=20 device type=DISKcontents of Memory Script:
{backup as copy reusetargetfile '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwpri' auxiliary format '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwstd' ;
}
executing Memory ScriptStarting backup at 15-APR-14
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=42 device type=DISK
Finished backup at 15-APR-14contents of Memory Script:
{backup as copy current controlfile for standby auxiliary format '/u01/app/oracle/oradata/std/std_con.ctl';
}
executing Memory ScriptStarting backup at 15-APR-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_pri.f tag=TAG20140415T164006 RECID=2 STAMP=844965607
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 15-APR-14contents of Memory Script:
{sql clone 'alter database mount standby database';
}
executing Memory Scriptsql statement: alter database mount standby databasecontents of Memory Script:
{set newname for tempfile 1 to "/u01/app/oracle/oradata/std/temp01.dbf";switch clone tempfile all;set newname for datafile 1 to "/u01/app/oracle/oradata/std/system01.dbf";set newname for datafile 2 to "/u01/app/oracle/oradata/std/sysaux01.dbf";set newname for datafile 3 to "/u01/app/oracle/oradata/std/undotbs01.dbf";set newname for datafile 4 to "/u01/app/oracle/oradata/std/users01.dbf";set newname for datafile 5 to "/u01/app/oracle/oradata/std/example01.dbf";backup as copy reuse datafile 1 auxiliary format "/u01/app/oracle/oradata/std/system01.dbf" datafile 2 auxiliary format "/u01/app/oracle/oradata/std/sysaux01.dbf" datafile 3 auxiliary format "/u01/app/oracle/oradata/std/undotbs01.dbf" datafile 4 auxiliary format "/u01/app/oracle/oradata/std/users01.dbf" datafile 5 auxiliary format "/u01/app/oracle/oradata/std/example01.dbf";sql 'alter system archive log current';
}
executing Memory Scriptexecuting command: SET NEWNAMErenamed tempfile 1 to /u01/app/oracle/oradata/std/temp01.dbf in control fileexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEStarting backup at 15-APR-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/pri/system01.dbf
output file name=/u01/app/oracle/oradata/std/system01.dbf tag=TAG20140415T164013
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/pri/sysaux01.dbf
output file name=/u01/app/oracle/oradata/std/sysaux01.dbf tag=TAG20140415T164013
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/pri/example01.dbf
output file name=/u01/app/oracle/oradata/std/example01.dbf tag=TAG20140415T164013
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/pri/undotbs01.dbf
output file name=/u01/app/oracle/oradata/std/undotbs01.dbf tag=TAG20140415T164013
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:04
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/pri/users01.dbf
output file name=/u01/app/oracle/oradata/std/users01.dbf tag=TAG20140415T164013
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 15-APR-14sql statement: alter system archive log currentcontents of Memory Script:
{switch clone datafile all;
}
executing Memory Scriptdatafile 1 switched to datafile copy
input datafile copy RECID=2 STAMP=844965655 file name=/u01/app/oracle/oradata/std/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=3 STAMP=844965655 file name=/u01/app/oracle/oradata/std/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=4 STAMP=844965655 file name=/u01/app/oracle/oradata/std/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=5 STAMP=844965655 file name=/u01/app/oracle/oradata/std/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=6 STAMP=844965655 file name=/u01/app/oracle/oradata/std/example01.dbf
Finished Duplicate Db at 15-APR-14RMAN>
恢復數據庫結束12:嘗試開啟備庫登陸并查看數據庫當前狀態:[oracle@std ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 14 16:41:50 2014
Copyright (c) 1982, 2010, Oracle. All rights reserved.Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@std> select status from v$instance;STATUS
------------
MOUNTED (RMAN恢復完直接就是mount狀態)13:備庫啟動日志應用
SYS@std> alter database recover managed standby database disconnect from session;
Database altered.
(停止日志應用的命令是:alter database recover managed standby database cancel;)查看日志應用情況:
SYS@std> set pagesize 100
SYS@std> select sequence#,applied from v$archived_log order by 1;SEQUENCE# APPLIED
---------- ---------8 YES9 YES10 YES如上,如果發現有個NO的,也是正常的,說明該日志在主庫上還沒有歸檔,可以在主庫上運行alter system switch logfile;命令來進行日志切換,再到備庫查看日志應用情況14:分別查看主庫和備庫的歸檔序列號是否一致:
先在主庫手動切換一下日志:
SYS@pri> alter system switch logfile;System altered.
然后查看主庫:
SYS@pri> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/arch/pri
Oldest online log sequence 10
Next log sequence to archive 12
Current log sequence 12備庫:
SYS@std> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/arch/std
Oldest online log sequence 10
Next log sequence to archive 0
Current log sequence 12結果完全一致,至此,DataGuard的搭建成功!五:相關知識補充:
1:DataGuard的三種數據保護模式:
(1)MAXIMIZE PROTECTION(最大保護模式):最大數據保護與無數據分歧,LGWR將同時傳送到備用節點,在主節點事務確認之前,備用節點也必須完全收到日志數據。如果網絡不好,引起LGWR不能傳送數據,將引起嚴重的性能問題,導致主節點DOWN機。(2)MAXIMIZE AVAILABILITY(最大可用模式):無數據丟失模式,允許數據分歧,允許異步傳送。正常情況下運行在最大保護模式,在主節點與備用節點的網絡斷開或連接不正常時,自動切換到最大性能模式,主節點的操作還是可以繼續的。在網絡不好的情況下有較大的性能影響。(3)MAXIMIZE PERFORMANCE(最大性能模式):這種模式應當可以說是從8i繼承過來的備用服務器模式,異步傳送,無數據同步檢查,可能丟失數據,但是能獲得主節點的最大性能。2:DataGuard 保護模式切換: (重點,注意升級切換和降級切換的區別)
(1)查看當前的保護模式:
select database_role, protection_mode, protection_level from v$database;(2)三種保護模式的級別排名:
最大性能 --> 最大可用 --> 最大保護 (從左至右,保護模式級別提升)(3)升級切換步驟:
1. 備庫停止redo應用:
alter database recover managed standby database cancel;2. 主庫重啟到mount狀態: (升級切換,需要重啟主庫)shutdown immediate;
startup mount3. 主庫升級切換保護模式并OPEN數據庫: (升級切換是重點,仔細看)
重點:當要進行升級切換時,一定要先查看一下主庫和備庫的LOG_ARCHIVE_DEST_2 參數,若配置不正確,那么在OPEN數據庫時會報錯ORA-16072!(尤其是要修改成最大保護模式時)下表中描述了不同保護模式下LOG_ARCHIVE_DEST_2 參數應該設置的屬性:最大保護 最高可用 最高性能
REDO 寫進程 LGWR LGWR LGWR 或 ARCH
網絡傳輸模式 SYNC SYNC LGWR 進程時 SYNC 或 ASYNC , ARCH 進程時 SYNC
磁盤寫操作 AFFIRM AFFIRM AFFIRM 或 NOAFFIRM
是否需要standby redologs YES YES 可沒有但推薦有查看:show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------ ---------- ----------------------------------------------------------------
log_archive_dest_2 string service=std valid_for=(online_logfiles,primary_role) db_unique_name=std
如上,并沒有包含升級切換所需的參數,可以用下列兩條命令修改:主庫修改:SYS@pri> alter system set log_archive_dest_2='service=std lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=std';備庫修改:SYS@std> alter system set log_archive_dest_2='service=pri lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=pri';然后修改保護模式:
alter database set standby database to maximize availability;
(或者alter database set standby database to maximize protection;)
開啟數據庫:
alter database open;4. 備庫啟動redo應用:
alter database recover managed standby database disconnect from session;(4)降級切換步驟: (相對于升級切換,降級切換的步驟就簡單的多了)
1. 備庫停止redo應用:
alter database recover managed standby database cancel;2. 主庫調整保護模式:
alter database set standby database to maximize performance;3. 備庫啟動redo應用:
alter database recover managed standby database disconnect from session;3:舉例:將主庫和備庫的保護模式設置為最大保護模式(默認是最大性能模式)1. 查看當前的保護模式: (在主庫或者備庫端查看都可以)
SYS@pri> select database_role, protection_mode, protection_level from v$database;DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------------------- -------------------------------------- --------------------------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE2. 備庫停止redo應用:
SYS@std> alter database recover managed standby database cancel;
Database altered.2. 主庫重啟到mount狀態: (由于是升級切換,所以需要重啟主庫)
SYS@pri> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.SYS@pri> startup mount;
ORACLE instance started.Total System Global Area 417546240 bytes
Fixed Size 2227072 bytes
Variable Size 331351168 bytes
Database Buffers 79691776 bytes
Redo Buffers 4276224 bytes
Database mounted.3. 查看主庫和備庫的parameter log_archive_dest_2參數設置是否正確:
主庫查看:
SYS@pri> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------ ---------- ----------------------------------------------------------------
log_archive_dest_2 string service=std valid_for=(online_logfiles,primary_role) db_unique_name=std
備庫查看:
SYS@std> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------ ---------- ----------------------------------------------------------------
log_archive_dest_2 string service=pri valid_for=(online_logfiles,primary_role) db_unique_name=pri如上,并沒有包含升級切換所需的參數,可以用下列兩條命令修改:主庫修改:
SYS@pri> alter system set log_archive_dest_2='service=std lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=std';
備庫修改:
SYS@std> alter system set log_archive_dest_2='service=pri lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=pri';(當然,也可以在一開始搭建的時候,PFILE里就這么寫,具體情況看實際要求)
主庫再次查看:
SYS@pri> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------ ---------- ----------------------------------------------------------------
log_archive_dest_2 string service=std lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=std備庫再次查看:
SYS@std> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------ ---------- ----------------------------------------------------------------
log_archive_dest_2 string service=pri lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=pri4. 主庫升級切換到最大保護模式并OPEN數據庫:
SYS@pri> alter database set standby database to maximize protection;
Database altered.SYS@pri> alter database open;
Database altered.5. 備庫啟動redo應用:
SYS@std> alter database recover managed standby database disconnect from session;
Database altered.查看主庫的相關信息:
SYS@pri> select name,database_role,open_mode,protection_mode from v$database;NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
--------- ------------------------ -------------------- ------------------------------
PRI PRIMARY READ WRITE MAXIMUM PROTECTION查看備庫的相關信息:
SYS@std> select name,database_role,open_mode,protection_mode from v$database;NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
--------- ------------------------ -------------------- ------------------------------
PRI PHYSICAL STANDBY MOUNTED MAXIMUM PROTECTION可以看到,主庫修改完保護模式,備庫是自動跟著修改的,至于降級操作,參考上面的步驟即可,太簡單就不做演示了。5:Oracle Data Guard 的開啟關閉:(1)Data Guard 主備庫開關順序:啟動:
1:MOUNT備庫
2:OPEN主庫
3:備庫開啟日志應用 alter database recover managed standby database disconnect from session;
關閉:
1:備庫關閉日志應用 alter database recover managed standby database cancel;
2:關閉主庫
3:關閉備庫(2)在最大保護模式下,直接關閉備庫是不行的,如果直接關閉,會有如下提示:
SQL> shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL>
在最大保護模式下,備庫是不允許關閉的,此時首先關閉主庫,然后備庫就可以順利關閉了。6:Oracle Data Guard 主備切換:(1) Switchover 一般SWITCHOVER切換都是計劃中的切換,特點是在切換后,不會丟失任何的數據,而且這個過程是可逆的,整個DATA GUARD環境不會被破壞,原來DATA GUARD環境中的所有物理和邏輯STANDBY都可以繼續工作。在進行DATA GUARD的物理STANDBY切換前需要注意:
1)確認主庫和從庫間網絡連接通暢;
2)確認沒有活動的會話連接在數據庫中;
3)PRIMARY數據庫處于打開的狀態,STANDBY數據庫處于MOUNT狀態;
4)確保STANDBY數據庫處于ARCHIVELOG模式;
5)如果設置了REDO應用的延遲,那么將這個設置去掉;
6)確保配置了主庫和從庫的初始化參數,使得切換完成后,DATA GUARD機制可以順利的運行。主庫:
1. 查看switchover 狀態
SYS@pri> select name,database_role,switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ------------------------ ---------------------------------
PRI PRIMARY TO STANDBY附:A:switchover_status出現session active/not allowed 當出現session active的時候表示還有活動的session,則運行 Alter database commit to switchover to physical standby with session shutdown;
當出現not allowed時,說明切換標記還沒收到,此時不能執行轉換。
當主庫備庫狀態都正常,并且沒有進行主備切換的操作時,備庫的switchover_status就是not allowed。當主庫執行了切換成備庫的操作后,備庫的switchover_status才是to primary。 B:ora- 01153: an incompatible media recovery is active運行下面代碼 Alter database recover managed standby database finish; 或者Alter database recover managed standby database finish force; Alter database recover managed standby database disconnect from session; 2 切換成備庫
SYS@pri> alter database commit to switchover to physical standby with session shutdown;
或者
SYS@pri> alter database commit to switchover to physical standby;
Database altered. 3 啟動到mount和應用日志狀態
SYS@pri> shutdown immediate;
若此時提示ORA-01092: ORACLE instance terminated. Disconnection forced,則quit退出,重新sqlplus登陸數據庫即可。
SYS@pri> startup nomount;
SYS@pri> alter database mount standby database;
SYS@pri> alter database recover managed standby database disconnect from session; 4. 查看數據庫模式
SYS@pri> select name,database_role,switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ----------------------------- ---------------------------------
PRI PHYSICAL STANDBY TO PRIMARY如上,此時主庫已經切換為物理備庫備庫:
1.查看switchover狀態
SYS@std> select name,database_role,switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ----------------------------- ---------------------------------
PRI PHYSICAL STANDBY TO PRIMARY補充:若出現:ORA-16139: media recovery required
是因為沒有執行:alter database recover managed standby database disconnect from session; 2. 切換成主庫
SYS@std> alter database commit to switchover to primary;
Database altered.
SYS@std> shutdown immediate;
SYS@std> startup;
SYS@std> alter system switch logfile; 3. 查看數據庫模式
SYS@std> select name,database_role,switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ------------------------ ---------------------------------
PRI PRIMARY TO STANDBY如上,物理備庫已成功切換為主庫驗證同步:
SYS@pri> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
---------------------------40SYS@std> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
---------------------------40(2)Failover: FAILOVER切換一般是PRIMARY數據庫發生故障后的切換,這種情況是STANDBY數據庫發揮其作用的情況。這種切換發生后,可能會造成數據的丟失。而且這個過程不是可逆的,DATA GUARD環境會被破壞。 由于PRIMARY數據庫已經無法啟動,所以FAILOVER切換所需的條件并不多,只要檢查STANDBY是否運行在最大保護模式下,如果是的話,需要將其置為最大性能模式,否則切換到PRIMARY角色也無法啟動。 1. 查看當前保護模式,確保當前保護模式為最大性能模式:
SYS@std> select name,database_role,open_mode,protection_mode from v$database;NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
--------- ------------------------ -------------------- ------------------------------
PRI PHYSICAL STANDBY MOUNTED MAXIMUM PROTECTION
如上,當前是最大保護模式,修改為最大性能模式:
SYS@std> alter database set standby database to maximize performance;Database altered.再次查看,OK
SYS@std> select name,database_role,open_mode,protection_mode from v$database;NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
--------- ------------------------ -------------------- ------------------------------
PRI PHYSICAL STANDBY MOUNTED MAXIMUM PERFORMANCE2. 查看是否有日志GAP,沒有應用的日志:
SYS@std> select unique thread#,max(sequence#) over (partition by thread#) last from v$archived_log;THREAD# LAST-------------- ----------1 75
SYS@std> select thread#,low_sequence#,high_sequence# from v$archive_gap;no rows selected
如上,no rows selected,表示沒有GAP。 如果有,則拷貝過來并且注冊
SYS@std> alter database register physical logfile '路徑';
重復查看直到沒有未應用的日志 3. 然后停止應用歸檔:
SYS@std> alter database recover managed standby database cancel;
Database altered.4. 下面將STANDBY數據庫切換為PRIMARY數據庫: -
取消日志應用:
SYS@std> alter database recover managed standby database finish;
這個finish是Failover專用的,功能類似cancel,區別是finish破壞了主從結構,用了finish就得重建dg。所以模擬這個實驗的時候,最好提前給虛擬機做個快照!
或:
SYS@std> alter database recover managed standby database finish force;切換為主庫:
SYS@std> alter database commit to switchover to primary;
Database altered.OPEN主庫:
SYS@std> alter database open;
Database altered.
或者 shutdown immediate+startup 5:檢查數據庫是否已經切換成功: NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
--------- ------------------------ -------------------- ------------------------------
PRI PRIMARY MOUNTED MAXIMUM PERFORMANCE至此,FAILOVER切換完成。這個時候應該馬上對新的PRIMARY數據庫進行備份。
總結
以上是生活随笔為你收集整理的ORACLE DataGuard环境搭建详细步骤(新方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poi导出excel中响应头文件名乱码
- 下一篇: Python面向对象——面向对象介绍、实