Oracle10G Dataguard 多个备库 - 主库和物理备库的切换

一、规划

平台: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/11417069/viewspace-684347/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11417069/viewspace-684347/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值