Oracle10G Dataguard 多個備庫 - 主庫和物理備庫的切換

dbhelper發表於2015-03-01
一、規劃

平臺:VMWare Server1.07、RHEL4.5 X86、Oracle10.2.0.1+p6810189_10204。
保護模式:最大可用。為了考慮主庫和物理備庫的切換,主庫也建standby redo logs。邏輯備庫不考慮切換。
為了更加理解引數設定,db_name、db_unique_name、Net Service Name引數設定成了不一樣。

主庫:
db_name = ORCLDB
db_unique_name/ORACLE_SID = WENDING
Net Service Name = db_wending

物理備庫:
db_name = ORCLDB    --需和主庫一致
db_unique_name/ORACLE_SID = PHYSTDBY
Net Service Name = db_phystdby

邏輯備庫:
db_name = LOGDB        --轉為邏輯備庫後的資料庫名,不能和主庫一致
db_unique_name/ORACLE_SID = LOGSTDBY
Net Service Name = db_logstdby

命令提示符:
# 表示以root使用者操作
$ 表示以oracle使用者操作
SQL> 表示登陸sqlplus操作

其它提示:
所有密碼都為iamwangnc。
 
二、虛擬機器和oracle軟體安裝

2.1 VMWare下安裝RHEL4.5

安裝方法很簡單,按照提示來做即可。為每個虛擬機器分配 512MB 記憶體,10GB磁碟空間。虛擬機器的網路連結方式為NAT。

安裝完一臺虛擬機器後配置靜態IP,然後複製兩份用來做備機,在複製的虛擬機器中重新配置靜態IP和MAC地址:
Xwindow下:Applications - System Settings - Network - Devices - Edit - General裡配置靜態IP,
Xwindow下:Applications - System Settings - Network - Devices - Edit - Hadrware Device裡手工按Probe一下獲取新MAC地址
然後重啟網路服務或主機即可。

VMWare-Tools的安裝,安裝的好處:可以調整linux的解析度、滑鼠可以在虛擬機器和宿主機間自由移動、可以從宿主機直接拖動檔案複製到虛擬機器裡。
啟動虛擬機器後:
VMWare選單 - VM - Install Vmware Tools,如果出不來安裝提示那麼使用以下方法:
VMWare選單 - VM - Settings - 選擇CD-ROM - Use ISO image - 選上C:\Program Files\VMware\VMware Workstation\linux.iso檔案;然後啟動虛擬機器,從桌面上開啟光碟,雙擊VMwareTools-6.0.5-109488.i386.rpm檔案開始安裝,安裝後配置:
# cd /usr/bin
# vmware-config-tools.pl
然後,按提示配置就可以了,配置過程中會閃幾下,這是正常的。最後,按Ctrl+Alt,在左下角你會看到沒有出現“沒有安裝VMware-tools”的提示。

同步虛擬機器OS與宿主機OS的時間:
* 執行“vmware-toolbox”以顯示 VMware Tools Properties 視窗。在 Options 選項卡下,選擇 Time synchronization between the virtual machine and the host operating system。您應該發現 tools.syncTime = "TRUE" 引數已經追加到虛擬機器配置檔案 X:\Virtual Machines\Red Hat Enterprise Linux 4\rhel4.vmx 中。
* 編輯 /boot/grub/grub.conf,並將選項“clock=pit nosmp noapic nolapic”新增到讀取核心 /boot/ 的那一行。您已經將選項新增到兩個核心,現在只需對特定核心進行更改。
     #boot=/dev/sda
      default=0
      timeout=5
      splashimage=(hd0,0)/boot/grub/splash.xpm.gz
      hiddenmenu
      title Enterprise (2.6.9-42.0.0.0.1.ELsmp)
              root (hd0,0)
              kernel /boot/vmlinuz-2.6.9-42.0.0.0.1.ELsmp ro
      root=LABEL=/ rhgb quiet clock=pit nosmp noapic nolapic
              initrd /boot/initrd-2.6.9-42.0.0.0.1.ELsmp.img
      title Enterprise-up (2.6.9-42.0.0.0.1.EL)
              root (hd0,0)
              kernel /boot/vmlinuz-2.6.9-42.0.0.0.1.EL ro root=LABEL=/
      rhgb quiet clock=pit nosmp noapic nolapic
              initrd /boot/initrd-2.6.9-42.0.0.0.1.EL.img

2.2 每個主機安裝Oracle軟體

# groupadd oinstall
# groupadd dba
# useradd -g oinstall -G dba oracle
# passwd oracle   
# vi /etc/sysctl.conf
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
# /sbin/sysctl -p    (修改以後讓引數生效)

為了提升效能增加oracle使用者的shell限制:
# vi /etc/security/limits.conf
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile 1024
oracle              hard    nofile 65536
# vi /etc/pam.d/login
session    required     /lib/security/pam_limits.so
session    required     pam_limits.so
# vi /etc/profile
if [ $USER = "oracle" ]; then
        if [ $SHELL = "/bin/ksh" ]; then
              ulimit -p 16384
              ulimit -n 65536
        else
              ulimit -u 16384 -n 65536
        fi
fi
# vi /etc/selinux/config    (使安全linux標誌失效)
SELINUX=disabled

建立基本目錄:
# mkdir -p /u01/app/oracle
# chown -R oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/app/oracle

.bash_profile需增加或修改如下引數:
# su - oracle
$ vi ~/.bash_profile
umask 022
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_SID=WENDING    #物理備庫此處為PHYSTDBY、邏輯備庫此處為LOGSTDBY
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
export NLS_DATE_FORMAT="YYYY-MM-DD.HH24:MI:SS"
$ . ~/.bash_profile

開始安裝oracle軟體:
$ gunzip 10201_database_linux32.zip
$ cd database
$ ./runInstaller    (安裝時按照提示來做即可,只安裝oracle軟體)

2.3 如果有舊庫,需要先刪除

$ sqlplus '/as sysdba'
SQL> startup mount exclusive restrict force;
SQL> drop database;

2.4 每個主機建立需要的目錄

--存放trace檔案
$ rm -rf $ORACLE_BASE/admin/$ORACLE_SID
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/adump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/bdump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/cdump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/dpdump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/pfile
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/udump
--存放資料庫檔案
$ rm -rf /orahome/oradata/$ORACLE_SID
mkdir -p /orahome/oradata/$ORACLE_SID
--存放歸檔檔案
$ rm -rf /orahome/arch/$ORACLE_SID
mkdir -p /orahome/arch/$ORACLE_SID
--快閃記憶體區
$ rm -rf /orahome/flash_recovery_area
mkdir -p /orahome/flash_recovery_area
--存放備份檔案
$ rm -rf /orahome/backup
mkdir -p /orahome/backup

2.5 每個主機的hosts檔案

# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost vmthree    #最後一個引數分別是每個主機的hostname
192.168.137.128 vmone
192.168.137.129 vmtwo
192.168.137.130 vmthree

2.6 每個主機的listener.ora

$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
)

LISTENER =
(DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = vmone)(PORT = 1521))    #host引數,各主機配置成vmone,vmtwo,vmthree
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
)

2.7 每個主機的tnsnames.ora

注意初始引數設定了db_domain=LK,但這不是必需的,tnsnames裡SERVICE_NAME要加上這個域。
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
db_wending =
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = vmone)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = WENDING.LK)
    )
)

db_phystdby =
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = vmtwo)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PHYSTDBY.LK)
    )
)

db_logstdby =
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = vmthree)(PORT = 1523))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = LOGSTDBY.LK)
    )
)
三、新建主庫(主機vmone)

3.1 準備主庫初始化引數

$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora
#以下為建庫必需引數
control_files='/orahome/oradata/WENDING/control01.ctl','/orahome/oradata/WENDING/control02.ctl','/orahome/oradata/WENDING/control03.ctl'
db_block_size = 8192
db_name = ORCLDB
db_unique_name = WENDING
sga_max_size = 256M
sga_target = 256M
undo_management = AUTO
undo_tablespace = UNDOTBS1
#以下為一般建庫需設定的引數,不設定就採用預設值
audit_file_dest = /u01/app/oracle/admin/WENDING/adump
background_dump_dest = /u01/app/oracle/admin/WENDING/bdump
core_dump_dest = /u01/app/oracle/admin/WENDING/cdump
user_dump_dest = /u01/app/oracle/admin/WENDING/udump
db_domain = LK
db_recovery_file_dest=/orahome/flash_recovery_area
db_recovery_file_dest_size=2G
job_queue_processes = 10
log_archive_format = 'log_%t_%s_%r.arc'
open_cursors = 1500
processes = 500
undo_retention = 10800
audit_sys_operations = TRUE #如果需要開通審計功能需設定
audit_trail = os #這裡注意,如果將來會轉換成物理備庫,這裡就不能設定db,否則將來物理備庫沒法開啟read only模式
#以下為建備庫必需的設定,每增加一個備庫,就在log_archive_config裡增加備庫的db_unique_name,並後續增設一個log_archive_dest_x引數
remote_login_passwordfile='EXCLUSIVE'
log_archive_config='DG_CONFIG=(WENDING,PHYSTDBY,LOGSTDBY)'
log_archive_dest_1='LOCATION=/orahome/arch/WENDING VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=WENDING'
log_archive_dest_state_1='ENABLE'

3.2 建立密碼檔案,一定是要用格式orapw

$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=iamwangnc force=y

3.3 建spfile,啟動例項並開始建庫

$ sqlplus '/as sysdba'
SQL> create spfile from pfile='$ORACLE_HOME/dbs/init$ORACLE_SID.ora';
SQL> startup nomount
SQL> create database ORCLDB controlfile reuse
character set ZHS16GBK national character set AL16UTF16
logfile group 1 ('/orahome/oradata/WENDING/redo1.log') size 50M reuse,
group 2 ('/orahome/oradata/WENDING/redo2.log') size 50M reuse,
group 3 ('/orahome/oradata/WENDING/redo3.log') size 50M reuse
datafile '/orahome/oradata/WENDING/system.dbf' size 500M reuse autoextend on next 10M maxsize unlimited extent management local
sysaux datafile '/orahome/oradata/WENDING/sysaux.dbf' size 100M autoextend on next 10M maxsize unlimited
default temporary tablespace temp tempfile '/orahome/oradata/WENDING/temp01.dbf' size 100M reuse autoextend on next 10M maxsize unlimited
undo tablespace undotbs1 datafile '/orahome/oradata/WENDING/undotbs1.dbf' size 100M reuse autoextend on next 10M maxsize unlimited
user sys identified by "iamwangnc" user system identified by "iamwangnc";

3.4 執行資料字典指令碼,其中catalog.sql和catproc.sql是必需的,其它可選

SQL> spool /orahome/cat.log
SQL> @?/rdbms/admin/catalog.sql   (建資料字典檢視)
SQL> @?/rdbms/admin/catproc.sql   (建儲存過程包)
SQL> @?/rdbms/admin/catblock.sql (建鎖相關的幾個檢視)
SQL> @?/rdbms/admin/catoctk.sql   (建密碼工具包dbms_crypto_toolkit)
SQL> @?/rdbms/admin/owminst.plb   (建工作空間管理相關物件,如dmbs_wm)
SQL> spool off

3.5 新建sqlplus屬性和幫助、USERS表空間、EM資料庫

SQL> connect system/iamwangnc
SQL> @?/sqlplus/admin/pupbld.sql
SQL> @?/sqlplus/admin/help/hlpbld.sql helpus.sql

SQL> connect /as sysdba
SQL> CREATE TABLESPACE USERS LOGGING DATAFILE '/orahome/oradata/WENDING/users01.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 10m MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
SQL> ALTER DATABASE DEFAULT TABLESPACE USERS;

建立和配置EM資料庫(可選):
SQL> @?/sysman/admin/emdrep/sql/emreposcre /u01/app/oracle/product/10.2.0/db_1 SYSMAN iamwangnc TEMP ON;

3.6. 最後修改為歸檔模式並重啟

SQL> shutdown immediate;
SQL> connect /as sysdba
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;

重新編譯所有失效過程:
SQL> execute utl_recomp.recomp_serial();

配置EM(可選):
SQL> alter user SYSMAN identified by "iamwangnc" account unlock;
SQL> alter user DBSNMP identified by "iamwangnc" account unlock;
SQL> exit
$ emca -config dbcontrol db -silent -DB_UNIQUE_NAME WENDING -PORT 1521 -EM_HOME /u01/app/oracle/product/10.2.0/db_1 -LISTENER LISTENER -SERVICE_NAME WENDING.LK -SYS_PWD iamwangnc -SID WENDING -ORACLE_HOME /u01/app/oracle/product/10.2.0/db_1 -DBSNMP_PWD iamwangnc -HOST game -LISTENER_OH /u01/app/oracle/product/10.2.0/db_1 -LOG_FILE /u01/app/oracle/product/10.2.0/db_1/log/emConfig.log -SYSMAN_PWD iamwangnc

到此建庫完畢!

3.6 查詢主庫資訊

$ sqlplus '/as sysdba'
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PRIMARY          WENDING                        READ WRITE MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE SESSIONS ACTIVE      NO NO
SQL> archive log list;
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            /orahome/arch/WENDING
最早的聯機日誌序列     10
下一個存檔日誌序列   12
當前日誌序列           12

四、主庫準備工作(主機vmone)

4.1 Enable force logging

$ sqlplus '/as sysdba'
SQL> alter database force logging;
SQL> exit

4.2 啟動監聽

$ lsnrctl start
$ tnsping db_wending

4.3 備份主庫並建立備庫控制檔案

11g裡可用rman直接在遠端複製一個資料庫,無需備份和恢復。
$ rman target /
RMAN> backup full database format '/orahome/backup/dbfull_%T_%s_%p.bak';
--RMAN> backup archivelog all format '/orahome/backup/arch_%T_%s_%p.bak';
RMAN> exit
$ sqlplus '/as sysdba'
SQL> alter database create standby controlfile as '/orahome/backup/control01.ctl' reuse;
SQL> exit
為安全起見,控制檔案一般設定三份:
$ cp /orahome/backup/control01.ctl /orahome/backup/control02.ctl
$ cp /orahome/backup/control01.ctl /orahome/backup/control03.ctl
注意:建備庫控制檔案前產生的歸檔檔案後續不會傳送給備庫,這是正常的。

4.4 為備庫準備引數檔案

$ sqlplus '/as sysdba'
SQL> create pfile = '/orahome/backup/initPHYSTDBY.ora' from spfile;
SQL> create pfile = '/orahome/backup/initLOGSTDBY.ora' from spfile;

4.5 修改物理備庫一引數檔案

注意路徑資訊,紅色表示要注意修改的地方。
$ vi /orahome/backup/initPHYSTDBY.ora
#以下為建庫必需引數
*.control_files='/orahome/oradata/PHYSTDBY/control01.ctl','/orahome/oradata/PHYSTDBY/control02.ctl','/orahome/oradata/PHYSTDBY/control03.ctl'
*.db_block_size=8192
*.db_name='ORCLDB'
*.db_unique_name='PHYSTDBY'
*.sga_max_size=320M
*.sga_target=320M
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
#以下為一般建庫需設定的引數,不設定就採用預設值
*.audit_file_dest='/u01/app/oracle/admin/PHYSTDBY/adump'
*.background_dump_dest='/u01/app/oracle/admin/PHYSTDBY/bdump'
*.core_dump_dest='/u01/app/oracle/admin/PHYSTDBY/cdump'
*.user_dump_dest='/u01/app/oracle/admin/PHYSTDBY/udump'
*.db_recovery_file_dest='/orahome/flash_recovery_area'
*.db_recovery_file_dest_size=2G
*.db_domain='LK'
*.job_queue_processes=10
*.open_cursors=1500
*.processes=500
*.remote_login_passwordfile='EXCLUSIVE'
*.log_archive_config='DG_CONFIG=(WENDING,PHYSTDBY,LOGSTDBY)'
*.log_archive_dest_1='LOCATION=/orahome/arch/PHYSTDBY VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PHYSTDBY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_format='log_%t_%s_%r.arc'
*.undo_retention=10800
#以下是作為備庫需增加的引數
*.fal_client='db_phystdby'
*.fal_server='db_wending'
*.db_file_name_convert='WENDING','PHYSTDBY'
*.log_file_name_convert='WENDING','PHYSTDBY'
*.standby_file_management='AUTO'

引數說明:
fal_client/server='tnsnames.ora中配置的網路服務名,即網路連線串'
db/log_file_name_convert='主庫資料或日誌檔案目錄1','備庫資料或日誌檔案目錄1','主庫資料或日誌檔案目錄2','備庫資料或日誌檔案目錄2'...可以只設定相異部分
standby_file_management='AUTO' 自動同步主庫上新建的資料檔案到備庫,但主庫增刪logfile或rename datafile會有限制。
compatible='10.2.0.4.0' 備庫該引數需大於或等於主庫該引數,一般用預設即可,如果要做切換,那主備庫的該引數必需一樣。

4.6 修改邏輯備庫二引數檔案

注意路徑資訊,其實現在還當作物理備庫來做,後續會轉為邏輯備庫,修改的地方同上,紅色表示要注意修改的地方。
$ vi /orahome/backup/initLOGSTDBY.ora
#以下為建庫必需引數
*.control_files='/orahome/oradata/LOGSTDBY/control01.ctl','/orahome/oradata/LOGSTDBY/control02.ctl','/orahome/oradata/LOGSTDBY/control03.ctl'
*.db_block_size=8192
*.db_name='ORCLDB'
*.db_unique_name='LOGSTDBY'
*.sga_max_size=320M
*.sga_target=320M
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
#以下為一般建庫需設定的引數,不設定就採用預設值
*.audit_file_dest='/u01/app/oracle/admin/LOGSTDBY/adump'
*.background_dump_dest='/u01/app/oracle/admin/LOGSTDBY/bdump'
*.core_dump_dest='/u01/app/oracle/admin/LOGSTDBY/cdump'
*.user_dump_dest='/u01/app/oracle/admin/LOGSTDBY/udump'
*.db_recovery_file_dest='/orahome/flash_recovery_area'
*.db_recovery_file_dest_size=2G
*.db_domain='LK'
*.job_queue_processes=10
*.open_cursors=1500
*.processes=500
*.remote_login_passwordfile='EXCLUSIVE'
*.log_archive_config='DG_CONFIG=(WENDING,PHYSTDBY,LOGSTDBY)'
*.log_archive_dest_1='LOCATION=/orahome/arch/LOGSTDBY VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=LOGSTDBY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_format='log_%t_%s_%r.arc'
*.undo_retention=10800
#以下是作為備庫需增加的引數
*.fal_client='db_logstdby'
*.fal_server='db_wending'
*.db_file_name_convert='WENDING','LOGSTDBY'
*.log_file_name_convert='WENDING','LOGSTDBY'
*.standby_file_management='AUTO'

4.8 複製上面生成的檔案backup_*.bak、control0*.ctl、init*.ora到備機對應目錄下

注意rman備份的檔案在主備機上目錄/orahome/backup/要一致,如果是NFS就更好,無需傳送;如果備機上實在無該目錄,可以透過link方式實現。

$ scp /orahome/backup/*.bak vmtwo:/orahome/backup/
$ scp /orahome/backup/initPHYSTDBY.ora vmtwo:/orahome/backup/
$ scp /orahome/backup/*.ctl vmtwo:/orahome/oradata/PHYSTDBY/

$ scp /orahome/backup/*.bak vmthree:/orahome/backup/
$ scp /orahome/backup/initLOGSTDBY.ora vmthree:/orahome/backup/
$ scp /orahome/backup/*.ctl vmthree:/orahome/oradata/LOGSTDBY/

五、建立物理備庫一(主機vmtwo)

5.1 建立密碼檔案

格式一定是要用orapw,密碼和主庫一樣。
$ $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=iamwangnc force=y

5.2 在備庫上建spfile並啟動備庫

$ sqlplus '/as sysdba'
SQL> create spfile from pfile='/orahome/backup/initPHYSTDBY.ora';
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> exit

5.3 備庫做rman恢復

11g裡可用rman直接在遠端複製一個資料庫,無需備份和恢復。
$ rman target /
RMAN> restore database;
RMAN> exit

5.4 啟動監聽並確保在主備庫間能互相tnsping通

$ lsnrctl start
$ tnsping db_wending
$ tnsping db_phystdby
$ lsnrctl status (確保備庫監聽PHYSTDBY例項成功)
主庫(vmone):
$ tnsping db_phystdby
$ tnsping db_wending
$ lsnrctl status (確保主庫監聽WENDING例項成功)

5.6 主庫增加歸檔目的地引數並歸檔測試(vmone)

$ sqlplus '/as sysdba'
SQL> alter system set log_archive_dest_2='SERVICE=db_phystdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PHYSTDBY' scope=both;
SQL> alter system set log_archive_dest_state_2='ENABLE' scope=both;
SQL> alter system archive log current;

5.7 在備庫上檢查日誌是否都從主庫傳送過來並啟動redo apply

SQL> host ls -l /orahome/arch/LOGSTDBY
此時會發現主庫建備庫控制檔案前產生的歸檔檔案未傳送過來,這是正常的。

如果歸檔日誌一個都沒傳送過來,則在主庫上檢查歸檔目的地是否有錯(vmone):
SQL> select dest_id,dest_name,error from v$archive_dest;

如果日誌能成功傳送,則在備庫上開始應用日誌(vmtwo):
SQL> recover managed standby database disconnect;
此時備庫的alert日誌檔案可能會有如下錯誤資訊:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/orahome/oradata/LOGSTDBY/redo3.log'
ORA-27037: unable to obtain file status
不用管,只看後面的歸檔檔案是否成功完成了媒體恢復。

5.8 查詢備庫資訊

SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PHYSICAL STANDBY PHYSTDBY                       MOUNTED    MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE NOT ALLOWED          NO NO
查詢日誌應用情況(或者檢視alert日誌檔案):
SQL> SELECT name, applied, REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#, first_time, next_time FROM V$ARCHIVED_LOG order by SEQUENCE#;
檢視備庫日誌資訊:
SQL> select * from v$dataguard_status;

到此物理備庫建立完畢!

六、建立物理備庫二(主機vmthree)

6.1 建立密碼檔案

格式一定是要用orapw,密碼和主庫一樣。
$ $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=iamwangnc force=y

6.2 在備庫上建spfile並啟動備庫

$ sqlplus '/as sysdba'
SQL> create spfile from pfile='/orahome/backup/initLOGSTDBY.ora';
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> exit

6.3 備庫做rman恢復

11g裡可用rman直接在遠端複製一個資料庫,無需備份和恢復。
$ rman target /
RMAN> restore database;
RMAN> exit

6.4 啟動監聽並確保在主備庫間能互相tnsping通

$ lsnrctl start
$ tnsping db_wending
$ tnsping db_logstdby
$ lsnrctl status (確保備庫監聽LOGSTDBY例項成功)
主庫(vmone):
$ tnsping db_logstdby
$ tnsping db_wending
$ lsnrctl status (確保主庫監聽WENDING例項成功)

6.6 主庫增加歸檔目的地引數並歸檔測試(vmone)

$ sqlplus '/as sysdba'
SQL> alter system set log_archive_dest_3='SERVICE=db_logstdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=LOGSTDBY' scope=both;
SQL> alter system set log_archive_dest_state_3='ENABLE' scope=both;
SQL> alter system archive log current;

6.7 在備庫上檢查日誌是否都從主庫傳送過來並啟動redo apply

SQL> host ls -l /orahome/arch/LOGSTDBY
此時會發現主庫建備庫控制檔案前產生的歸檔檔案未傳送過來,這是正常的。

如果歸檔日誌一個都沒傳送過來,則在主庫上檢查歸檔目的地設定是否有錯(vmone):
SQL> select dest_id,dest_name,error from v$archive_dest;

如果日誌能成功傳送,則在備庫上開始應用日誌(vmthree):
SQL> recover managed standby database disconnect;
此時備庫的alert日誌檔案可能會有如下錯誤資訊:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/orahome/oradata/LOGSTDBY/redo3.log'
ORA-27037: unable to obtain file status
不用管,只看後面的歸檔檔案是否成功完成了媒體恢復。

6.8 查詢備庫資訊

SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PHYSICAL STANDBY LOGSTDBY                       MOUNTED    MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE NOT ALLOWED          NO NO
查詢日誌應用情況(或者檢視alert日誌檔案):
SQL> SELECT name, applied, REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#, first_time, next_time FROM V$ARCHIVED_LOG order by SEQUENCE#;
檢視備庫日誌資訊:
SQL> select * from v$dataguard_status;

到此物理備庫建立完畢!

七、物理備庫資料同步測試

7.1 新建表空間測試

主庫(vmone):
$ sqlplus '/as sysdba'
SQL> create tablespace ts_test datafile '/orahome/oradata/WENDING/ts_test.dbf' size 100m reuse;
SQL> alter system archive log current;
SQL> select * from v$dbfile;
     FILE# NAME
---------- ----------------------------------------
         1 /orahome/oradata/WENDING/system.dbf
         2 /orahome/oradata/WENDING/undotbs1.dbf
         3 /orahome/oradata/WENDING/sysaux.dbf
         4 /orahome/oradata/WENDING/users01.dbf
         5 /orahome/oradata/WENDING/ts_test.dbf

備庫恢復需要點時間,透過檢視備庫alert日誌檔案,確認完成了媒體恢復後,檢查備庫是否也建立了同樣的資料檔案。

物理備庫庫一(vmtwo):
$ sqlplus '/as sysdba'
SQL> select * from v$dbfile;
     FILE# NAME
---------- ------------------------------------------------------------
         1 /orahome/oradata/PHYSTDBY/system.dbf
         2 /orahome/oradata/PHYSTDBY/undotbs1.dbf
         3 /orahome/oradata/PHYSTDBY/sysaux.dbf
         4 /orahome/oradata/PHYSTDBY/users01.dbf
         5 /orahome/oradata/PHYSTDBY/ts_test.dbf

物理備庫庫二(vmthree):
$ sqlplus '/as sysdba'
SQL> select * from v$dbfile;
     FILE# NAME
---------- ------------------------------------------------------------
         1 /orahome/oradata/LOGSTDBY/system.dbf
         2 /orahome/oradata/LOGSTDBY/undotbs1.dbf
         3 /orahome/oradata/LOGSTDBY/sysaux.dbf
         4 /orahome/oradata/LOGSTDBY/users01.dbf
         5 /orahome/oradata/LOGSTDBY/ts_test.dbf

可以看到對應的資料檔案都建立了,且自動轉換到了對應的位置。

7.2 新建資料庫使用者和表測試

主庫(vmone):
$ sqlplus '/as sysdba'
SQL> create user u_test identified by iamwangnc default tablespace ts_test;
SQL> grant dba to u_test;
SQL> create table u_test.t_test as select * from dba_tables;
SQL> select count(*) from u_test.t_test;
COUNT(*)
----------
      1207
SQL> alter system archive log current;

備庫恢復需要點時間,透過檢視備庫alert日誌檔案,確認完成了媒體恢復後,檢查備庫是否也建立了同樣的使用者和表。

物理備庫庫一(vmtwo):
$ sqlplus '/as sysdba'
--到只讀模式下檢視剛剛建立的使用者和表
SQL> recover managed standby database finish;
SQL> alter database open read only;
SQL> select count(*) from u_test.t_test;
COUNT(*)
----------
      1207
--再回到恢復管理模式
SQL> recover managed standby database disconnect;

物理備庫庫二(vmthree):
同上。

可以看到新建的使用者和表在兩個備庫上都同步了。

八、更改物理備庫為最大可用或最大保護模式

前面建立的備庫預設是最大效能模式,一般都設定成最大可用性模式,如果備庫發生問題,主庫會自動降級為最大效能模式,對主庫不會有影響。

8.1 備庫配置standby redolog(vmtwo)

SQL> recover managed standby database cancel;
SQL> alter database add standby logfile
group 4 ('/orahome/oradata/PHYSTDBY/stdby_redo04.log') size 50m,
group 5 ('/orahome/oradata/PHYSTDBY/stdby_redo05.log') size 50m,
group 6 ('/orahome/oradata/PHYSTDBY/stdby_redo06.log') size 50m,
group 7 ('/orahome/oradata/PHYSTDBY/stdby_redo07.log') size 50m;
standby redolog的組數參考公式:(online redolog組數 + 1) * 資料庫執行緒數;單機執行緒數為1,RAC一般為2。
standby redolog的組成員數和大小也儘量和online redolog一樣。
SQL> recover managed standby database disconnect;

8.2 備庫配置standby redolog(vmthree)

SQL> recover managed standby database cancel;
SQL> alter database add standby logfile
group 4 ('/orahome/oradata/LOGSTDBY/stdby_redo04.log') size 50m,
group 5 ('/orahome/oradata/LOGSTDBY/stdby_redo05.log') size 50m,
group 6 ('/orahome/oradata/LOGSTDBY/stdby_redo06.log') size 50m,
group 7 ('/orahome/oradata/LOGSTDBY/stdby_redo07.log') size 50m;
SQL> recover managed standby database disconnect;

8.3 修改主庫遠端歸檔目的地的屬性為同步傳送和同步寫磁碟(vmone)

需設定log_archive_dest_2/3為聯機日誌方式(LGWR)同步(SYNC)傳送日誌,並且同步寫磁碟(AFFIRM),為了防止備庫發生網路故障引發主庫掛起還設定每隔一小時重新傳送失敗的日誌(REOPEN=3600)。

SQL> alter system set log_archive_dest_2='SERVICE=db_phystdby LGWR SYNC AFFIRM REOPEN=1800 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PHYSTDBY' scope=both;
SQL> alter system set log_archive_dest_3='SERVICE=db_logstdby LGWR SYNC AFFIRM REOPEN=1800 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=LOGSTDBY' scope=both;

8.4 更改主庫為最大保護模式(vmone)

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database set standby database to maximize protection;
提示:maximize 後可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分別對應最大保護,最高可用性及最高效能。
SQL> alter database open;

8.5 更改後主備庫日誌應用測試

主庫一(vmone):
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PRIMARY          WENDING                        READ WRITE MAXIMUM PROTECTION   MAXIMUM PROTECTION   SESSIONS ACTIVE      NO NO
SQL> create table u_test.t_test2 as select * from dba_users;
此時發現消耗時間明顯加長,因為它要保證兩個備庫同時也提交了該操作才算完成了當前事務。

物理備庫一(vmtwo):
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PHYSICAL STANDBY PHYSTDBY                       MOUNTED    MAXIMUM PROTECTION   MAXIMUM PROTECTION   NOT ALLOWED          NO NO

物理備庫二(vmthree):
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PHYSICAL STANDBY LOGSTDBY                       MOUNTED    MAXIMUM PROTECTION    MAXIMUM PROTECTION NOT ALLOWED          NO NO

現在備庫不能shutdown資料庫,除非shutdown abort:
SQL> shutdown immediate;
ORA-01154: 資料庫忙。現在不允許開啟, 關閉, 裝載和解除安裝

後續再修改為maximize availability或maximize performance模式可以在資料庫open狀態下隨時修改,但修改為maximize protection模式則必需在mount狀態下修改。
SQL> alter database set standby database to maximize performance;
SQL> alter database set standby database to maximize availability;
最終測試發現,是可以隨時修改,但是沒有得到想要的效果,暈!!!

九、轉物理備庫二為邏輯備庫(主機vmthree)

9.1 主庫檢查(vmone)

以下sql可以確定哪些表不支援(不被支援的表通常是由於列的定義包含了不支援的資料型別):
SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
WHERE (OWNER, TABLE_NAME) NOT IN (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)
AND BAD_COLUMN = 'Y';
假設某張表沒有主鍵或唯一約束,可以透過以下方式來給表增加唯一特徵:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;

檢視主庫是否啟用了supplemental logging特性:
SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
SUP SUP
--- ---
NO NO
如果未啟動,可以這樣開啟:
SQL> alter database add supplemental log data (PRIMARY KEY,unique INDEX) columns;

9.2 備庫停止redo apply

SQL> RECOVER MANAGED STANDBY DATABASE CANCEL;

9.3 在主庫生成LogMiner字典到redo,並歸檔(vmone)

build過程會等到所有事務都完成,這個步驟需要使用閃回查詢技術對資料字典資訊執行一致性讀,故undo_retention需要設定時間長一些,3600以上,不然可能碰到ora-1555。

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
SQL> alter system archive log current;

9.4 轉換物理備庫為邏輯備庫,同時會將db_name設定為LOGDB,會自動更新spfile

SQL> RECOVER TO LOGICAL STANDBY LOGDB;
SQL> exit
此時會自動應用未曾應用的日誌。

9.5 由於修改了db_name,邏輯備庫需重建密碼檔案,一定是要用orapw,密碼和主庫一樣

$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=iamwangnc force=y

9.6 現在是一個全新的新庫了,可以修改一些初始化引數,然後關閉並mount上

$ sqlplus '/as sysdba'
邏輯備庫不支援以下引數,可以忽略掉。
--SQL> alter system set db_file_name_convert='' scope=both;
--SQL> alter system set log_file_name_convert='' scope=both;
SQL> shutdown immediate
SQL> STARTUP MOUNT;

9.7 開啟邏輯備庫,由於此時和主庫事務不一致,需RESETLOGS

SQL> ALTER DATABASE OPEN RESETLOGS;

9.8 啟動sql apply

SQL> alter database start logical standby apply immediate;

9.9 邏輯備庫資訊查詢

SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
LOGDB    LOGICAL STANDBY LOGSTDBY                       READ WRITE MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY NOT ALLOWED          YES YES
SQL> archive log list;
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            /orahome/arch/LOGSTDBY
最早的聯機日誌序列     0
下一個存檔日誌序列   1
當前日誌序列           1
SQL> select * from v$dataguard_status;

到此主庫+物理備庫+邏輯備庫建立完畢!!!

九、轉物理備庫二為邏輯備庫(主機vmthree)

9.1 主庫檢查(vmone)

以下sql可以確定哪些表不支援(不被支援的表通常是由於列的定義包含了不支援的資料型別):
SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
WHERE (OWNER, TABLE_NAME) NOT IN (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)
AND BAD_COLUMN = 'Y';
假設某張表沒有主鍵或唯一約束,可以透過以下方式來給表增加唯一特徵:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;

檢視主庫是否啟用了supplemental logging特性:
SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
SUP SUP
--- ---
NO NO
如果未啟動,可以這樣開啟:
SQL> alter database add supplemental log data (PRIMARY KEY,unique INDEX) columns;

9.2 備庫停止redo apply

SQL> RECOVER MANAGED STANDBY DATABASE CANCEL;

9.3 在主庫生成LogMiner字典到redo,並歸檔(vmone)

build過程會等到所有事務都完成,這個步驟需要使用閃回查詢技術對資料字典資訊執行一致性讀,故undo_retention需要設定時間長一些,3600以上,不然可能碰到ora-1555。

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
SQL> alter system archive log current;

9.4 轉換物理備庫為邏輯備庫,同時會將db_name設定為LOGDB,會自動更新spfile

SQL> RECOVER TO LOGICAL STANDBY LOGDB;
SQL> exit
此時會自動應用未曾應用的日誌。

9.5 由於修改了db_name,邏輯備庫需重建密碼檔案,一定是要用orapw,密碼和主庫一樣

$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=iamwangnc force=y

9.6 現在是一個全新的新庫了,可以修改一些初始化引數,然後關閉並mount上

$ sqlplus '/as sysdba'
邏輯備庫不支援以下引數,可以忽略掉。
--SQL> alter system set db_file_name_convert='' scope=both;
--SQL> alter system set log_file_name_convert='' scope=both;
SQL> shutdown immediate
SQL> STARTUP MOUNT;

9.7 開啟邏輯備庫,由於此時和主庫事務不一致,需RESETLOGS

SQL> ALTER DATABASE OPEN RESETLOGS;

9.8 啟動sql apply

SQL> alter database start logical standby apply immediate;

9.9 邏輯備庫資訊查詢

SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
LOGDB    LOGICAL STANDBY LOGSTDBY                       READ WRITE MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY NOT ALLOWED          YES YES
SQL> archive log list;
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            /orahome/arch/LOGSTDBY
最早的聯機日誌序列     0
下一個存檔日誌序列   1
當前日誌序列           1
SQL> select * from v$dataguard_status;

到此主庫+物理備庫+邏輯備庫建立完畢!!!

十、邏輯備庫同步資料測試

10.1 同步資料測試

主庫(vmone):
$ sqlplus '/as sysdba'
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;
NAME     DATABASE_ROLE    DB_UNIQUE_NAME                 OPEN_MODE PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS    SUP SUP
-------- ---------------- ------------------------------ ---------- -------------------- -------------------- -------------------- --- ---
ORCLDB   PRIMARY          WENDING                        READ WRITE MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY SESSIONS ACTIVE      YES YES
SQL> select dest_name,error from v$archive_dest;
此時提示LOG_ARCHIVE_DEST_3有ORA-03135錯誤,最後把主庫重啟後解決,也許等一段時間,會自動好。

SQL> create table u_test.t_test4 as select * from dba_indexes;
SQL> select count(*) from u_test.t_test4;
COUNT(*)
----------
      1490
SQL> alter system archive log current;

邏輯備庫(vmthree):
$ sqlplus '/as sysdba'
SQL> select count(*) from u_test.t_test4;
COUNT(*)
----------
      1490
可以看到主庫的改變已經同步到了邏輯備庫了。如果還未同步,檢視alert日誌檔案,確認完成了LOGMINER。

10.2 邏輯備庫讀寫測試

SQL> archive log list;
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            /orahome/arch/LOGSTDBY
最早的聯機日誌序列     0
下一個存檔日誌序列   1
當前日誌序列           1
SQL> create table u_test.t_test888 as select * from dba_users;
SQL> alter system archive log current;
SQL> archive log list;
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            /orahome/arch/LOGSTDBY
最早的聯機日誌序列     1
下一個存檔日誌序列   2
當前日誌序列           2

10.3 邏輯備庫除了表、序列、job外的其它特殊操作

除了表、序列、job,如果在主庫增加其它物件,那麼邏輯備庫也得做同樣的操作,比如主庫增加了表空間ts_test2,那麼邏輯備庫要做類似操作。

主庫(vmone):
$ sqlplus '/as sysdba'
SQL> create tablespace ts_test1 datafile '/orahome/oradata/WENDING/ts_test1.dbf' size 10m reuse;
--SQL> drop tablespace ts_test1 including contents and datafiles cascade constraints;
SQL> alter system archive log current;
SQL> select * from v$dbfile;
     FILE# NAME
---------- ------------------------------------------------------------
         1 /orahome/oradata/WENDING/system.dbf
         2 /orahome/oradata/WENDING/undotbs1.dbf
         3 /orahome/oradata/WENDING/sysaux.dbf
         4 /orahome/oradata/WENDING/users01.dbf
         5 /orahome/oradata/WENDING/ts_test.dbf
         6 /orahome/oradata/WENDING/ts_test1.dbf

物理備庫(vmtwo):
$ sqlplus '/as sysdba'
SQL> select * from v$dbfile;
     FILE# NAME
---------- ------------------------------------------------------------
         1 /orahome/oradata/PHYSTDBY/system.dbf
         2 /orahome/oradata/PHYSTDBY/undotbs1.dbf
         3 /orahome/oradata/PHYSTDBY/sysaux.dbf
         4 /orahome/oradata/PHYSTDBY/users01.dbf
         5 /orahome/oradata/PHYSTDBY/ts_test.dbf
         6 /orahome/oradata/PHYSTDBY/ts_test1.dbf

邏輯備庫(vmthree):
$ sqlplus '/as sysdba'
SQL> select * from v$dbfile;
     FILE# NAME
---------- ------------------------------------------------------------
         1 /orahome/oradata/LOGSTDBY/system.dbf
         2 /orahome/oradata/LOGSTDBY/undotbs1.dbf
         3 /orahome/oradata/LOGSTDBY/sysaux.dbf
         4 /orahome/oradata/LOGSTDBY/users01.dbf
         5 /orahome/oradata/LOGSTDBY/ts_test.dbf
可以看到新建的表空間ts_test1未傳過來,因為邏輯備庫裡db_file_name_convert引數是無用的,需要手工做一下:
SQL> alter database stop logical standby apply;
SQL> alter session disable guard;
SQL> create tablespace ts_test1 datafile '/orahome/oradata/LOGSTDBY/ts_test1.dbf' size 10m reuse;
--SQL> drop tablespace ts_test1 including contents and datafiles cascade constraints;
SQL> alter session enable guard;
SQL> alter database start logical standby apply immediate;

SQL> alter database start logical standby apply immediate skip failed transaction;
SQL> select * from v$dbfile;
     FILE# NAME
---------- --------------------------------------------------
         1 /orahome/oradata/LOGSTDBY/system.dbf
         2 /orahome/oradata/LOGSTDBY/undotbs1.dbf
         3 /orahome/oradata/LOGSTDBY/sysaux.dbf
         4 /orahome/oradata/LOGSTDBY/users01.dbf
         5 /orahome/oradata/LOGSTDBY/ts_test.dbf
         6 /orahome/oradata/LOGSTDBY/ts_test1.dbf

10.4 在新表空間上新建表測試

主庫(vmone):
SQL> create table u_test.ts_test5 tablespace ts_test1 as select * from dba_users;
SQL> alter system archive log current;
SQL> select count(*) from u_test.ts_test5;
COUNT(*)
----------
        10

邏輯備庫(vmthree):
SQL> select count(*) from u_test.ts_test5;
COUNT(*)
----------
        10

十一、主備庫的起停和維護

10.1 Dataguard關閉(建議先關主庫再關備庫)
主庫:
$ sqlplus '/as sysdba'
SQL> alter system archive log current;
SQL> shutdown immediate;
物理備庫:
$ sqlplus '/as sysdba'
SQL> alter database recover managed standby database cancel;
SQL> shutdown immediate;
邏輯備庫:
$ sqlplus '/as sysdba'
SQL> ALTER DATABASE stop LOGICAL STANDBY APPLY;
SQL> shutdown immediate;

10.2 Dataguard開啟(先開備庫再開主庫)
邏輯備庫:
$ lsnrctl start
$ sqlplus '/as sysdba'
SQL> startup;
SQL> alter database start logical standby apply immediate;
物理備庫:
$ lsnrctl start
$ sqlplus '/as sysdba'
SQL> startup mount;
SQL> recover managed standby database disconnect;
如果需要做資料庫查詢可以將備庫從redo apply狀態切換到只讀狀態:
SQL> recover managed standby database cancel;
SQL> alter database open read only;
物理備庫在只讀模式下可以增加臨時檔案:
SQL> alter database temp add tempfile '/orahome/oradata/PHYSTDBY/temp02.dbf' size 100m reuse;
如果備庫本來就處於關閉狀態,則可以直接startup而進入只讀狀態:
SQL> startup;
主庫:
$ lsnrctl start
$ sqlplus '/as sysdba'
SQL> startup;

10.3 主庫和物理備庫維護

查詢當前庫的角色和保護模式:
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;

顯示那些被自動觸發寫入alert.log或伺服器trace檔案的事件:
SQL> select * from v$dataguard_status;

如果備庫沒有接受到主庫的redo資料,在主庫上確認錯誤資訊:
SQL> SELECT DEST_ID, dest_name,STATUS, DESTINATION, ERROR FROM V$ARCHIVE_DEST;

在主庫上,查詢待轉換備庫的歸檔檔案是否連線:
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

如過上面查到存在不連續的歸檔,那查詢sequence 對應的歸檔檔案:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;

複製上面查到的歸檔檔案到備庫,如果是RAC 的話,要找對機器,然後將這些檔案重新註冊一下:
SQL> ALTER DATABASE REGISTER LOGFILE '/orahome/arch/PHYSTDBY/1_12_669837011.dbf';
最後重啟redo 應用即可。

在備庫上,察看備庫已經歸檔的redolog:
SQL> SELECT name, applied, REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#, first_time, next_time FROM V$ARCHIVED_LOG order by SEQUENCE#;

在備庫上,察看備庫已經應用的redolog:
SQL> SELECT THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#, FIRST_TIME FROM V$LOG_HISTORY;
備庫已經應用的日誌,需要定時刪除。

在主庫上,察看哪些歸檔日誌沒有歸檔到備庫(假設local歸檔目錄的ID為1,remote的歸檔目錄為2):
SQL> SELECT name, applied, REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#
FROM (SELECT * FROM V$ARCHIVED_LOG WHERE DEST_ID = 1) a
WHERE a.SEQUENCE# NOT IN (SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID = 2 AND THREAD# = a.THREAD#);

物理備庫啟用實時應用透過下列語句(前提是已經在備庫建了standby redologs):
SQL> RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE disconnect;
物理備庫取消延遲應用可以透過下列語句:
SQL> RECOVER MANAGED STANDBY DATABASE NODELAY;

如果要強制主庫每10分種歸檔一次,那麼設定主庫初始化引數ARCHIVE_LAG_TARGET:
SQL> alter system set ARCHIVE_LAG_TARGET=600 scope=both;

物理備庫中已經應用的歸檔日誌需定時刪除,採用rman會只能判斷刪除,而邏輯備庫會自動刪除:
RMAN> DELETE ARCHIVELOG ALL COMPLETED AFTER 'SYSDATE - 30';

為了減輕主庫的壓力,考慮在備庫上進行rman備份:
SQL> recover managed standby database cancel;
RMAN> backup database format '';
SQL> 'alter database backup controlfile to '';

10.4 主庫和邏輯備庫維護

如果說,某些表或者資料不需要dataguard 保護(比如一些在邏輯standby 端生成的統計表),這個時候就需要DBMS_LOGSTDBY.SKIP。
SQL> alter database stop logical standby apply;
SQL> execute dbms_logstdby.skip('SCHEMA_DDL','U_TEST','T_TEST%'); --跳過物件的ddl 操作,可用萬用字元
SQL> execute dbms_logstdby.skip('DML','U_TEST','T_TEST%'); --跳過物件的dml 操作
如果說某些表某個時候取消了同步,現在希望再恢復同步:
SQL> execute DBMS_LOGSTDBY.UNSKIP('DML','U_TEST','T_TEST%');
最後再啟動sql應用:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

查詢當前庫的角色和保護模式:
SQL> select name,database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status,supplemental_log_data_pk,supplemental_log_data_ui from v$database;

顯示那些被自動觸發寫入alert.log或伺服器trace檔案的事件:
SQL> select * from v$dataguard_status;

查詢邏輯備庫事件:
SQL> select event_time,event,status from DBA_LOGSTDBY_EVENTS;
預設情況下,該檢視保留100 條事件的記錄,不過可以透過DBMS_LOGSTDBY.APPLY_SET()過程修改該引數。

檢視備庫日誌應用狀態(等同於物理備庫中的v$archived_log):
SQL> select sequence#,first_change#,next_change#,timestamp,applied from dba_logstdby_log;

檢視備庫LogMiner的統計資訊及狀態:
SQL> select *from v$logstdby_stats;

顯示當前log 應用服務的相關資訊,常用於診斷歸檔日誌邏輯應用的效能問題:
SQL> select sid,serial#,spid,type,status,high_scn from v$logstdby_process;

顯示sql 應用的大致狀態:
SQL> select * from v$Logstdby_state;
注意state 列,該列可能有下述的幾種狀態:
INITIALIZING: LogMiner session 已建立並初始化
LOADING DICTIONARY: SQL 應用呼叫LogMiner 字典
WAITING ON GAP: SQL 應用正等待日誌檔案,可能有中斷
APPLYING: SQL 應用正在工作
WAITING FOR DICTIONARY LOGS: SQL 應用等待LogMiner 字典資訊
IDLE: SQL 應用工作非常出色,已經乾的沒什麼可幹了:)

邏輯備庫有不連續的歸檔,怎麼辦?
因為邏輯standby 沒有提供型別v$archive_gap之類的檢視,因此在主庫上透過下列的語句識別是否存在丟失的情況:
SQL> select thread#,sequence#,file_name from dba_logstdby_log l
where next_change# not in ( select first_change# from dba_logstdby_log where l.thread# = thread#)
order by thread#,sequence#;

然後複製對應的歸檔檔案到standby,如果是RAC 的話,要找對機器,然後將這些檔案重新註冊一下:
SQL> ALTER DATABASE REGISTER LOGFILE '/orahome/arch/PHYSTDBY/1_12_669837011.dbf';
最後重啟sql 應用即可。

10.5 注意事項

如果在主庫執行 alter database clear unarchived logfile或alter database open resetlogs,則dataguard要重建。
在連續恢復模式下工作之前,需要保證之前所有的歸檔日誌己經應用到備用庫上。因為在連續恢復模式的情況下,oracle不會應用之前的歸檔日誌,而只會應用後面陸續到來的歸檔日誌。
新建表、表空間、datafile都能透過日誌應用到備庫,但新建一個臨時表空間和rename datafile 均不能應用到備庫上。
出現歸檔日誌gap時,需要找出相應的歸檔日誌,然後將這些歸檔日誌copy到備用節點的standby_archive_dest和log_archive_dest目錄下面。需要注意的是 log_archive_dest目錄下也需要copy。然後ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;
應當實時察看standby庫的alert檔案,就能清晰明瞭地知道主備更新的情況。這也是排錯的重要方法。

10.6 相關檢視

V$ARCHIVE_DEST
V$ARCHIVE_DEST_STATUS
V$ARCHIVE_GAP
V$ARCHIVED_LOG
V$DATABASE
V$DATAFILE
V$DATAGUARD_STATUS
V$LOG
V$LOGFILE
V$LOG_HISTORY
V$STANDBY_LOG

Logical Standby Databases Only:
DBA_LOGSTDBY_EVENTS
DBA_LOGSTDBY_LOG
DBA_LOGSTDBY_NOT_UNIQUE
DBA_LOGSTDBY_PARAMETERS
DBA_LOGSTDBY_PROGRESS
DBA_LOGSTDBY_SKIP
DBA_LOGSTDBY_SKIP_TRANSACTION
DBA_LOGSTDBY_UNSUPPORTED
V$LOGSTDBY
V$LOGSTDBY_STATS
V$MANAGED_STANDBY

 

 轉:http://hi.baidu.com/edeed/blog/item/6e8e7bcb7077e818be09e619.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1444312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章