最近有一款3D游戏将要上线,数据库存储的都是验证资料,属于重中之重。所以近期也是我工作的重中之重。我的设计初衷是中心机房做Oracle RAC集群+磁盘阵列设备存储;然后异地做一组Data Guard 实时异地热备数据,中心机房故障,异地热备服务器可立即接管;数据的传输采用VPN加密、解密。
最近有记了几万字的笔记,还没时间全部整理。今天整理了一部分,先发到blog上,做个记录,分段发:
Oracle Data Guard 介绍和部署笔记一、Data Guard的特点(一)、三种保护模式1、 最大保护模式 -- 这种保护模式确保如果主数据库故障不会发生数据丢失。要提供这种级别的保护,恢复每个事务所需的重做数据必须在事务提交之前同时写到本地联机重做日志和至少一个备数据库上的备重做日志。要确保不发生数据丢失,如果故障导致主数据库无法写重做流到至少一个事务一致性备数据库的备重做日志时,主数据库会关闭。2、 最大可用性模式 -- 这种保护模式提供了可能的最高级别的数据保护,而不用与主数据库的可用性相折衷。与最大保护模式相同,在恢复事务所需的重做写到本地联机重做日志和至少一个事务一致性备数据库上的备重做日志之前,事务将不会提交。与最大保护模式不同的是,如果故障导致主数据库无法写重做流到异地备重做日志时,主数据库不会关闭。替代地,主数据库以最大性能模式运行直到故障消除,并且解决所有重做日志文件中的中断。当所有中断解决之后,主数据库自动继续以最大可用性模式运行。这种模式确保如果主数据库故障,但是只有当第二次故障没有阻止完整的重做数据集从主数据库发送到至少一个备数据库时,不发生数据丢失。3、 最大性能模式 -- 这种保护模式(默认)提供了可能的最高级别的数据保护,而不影响主数据库的性能。这是通过允许事务在恢复该事务所需重做数据在写到本地联机重做日志后立即提交而实现的。主数据库的重做数据流也写到至少一个备数据库,但是那个重做流相对于创建重做数据的事务是异步写的。当所用的网络连接有足够的带宽,这种模式提供了近似于最大可用性模式的数据保护级别,并且对主数据库性能的影响最小。最大保护和最大可用性模式需要备重做日志文件配置在配置中的至少一个备数据库上。所有三种保护模式需要在LOG_ARCHIVE_DEST_n 初始化参数上指定特定的日志传输属性以发送重做数据到至少一个备数据库。(二)、两种standby方式(11g 已经支持异构平台的physic standby):physic(物理)standby和logical(逻辑)standby的比较physical standby直接从主库接受archived log,然后直接做基于block的物理恢复,所以physical standby再物理文件一级完全都等同于主库。而logical standby则把从主库接受过来的archived log通过logmnr技术,解析为sql语句,直接在logical standby上作基于sql的同步,所以比较灵活,但是对性能有一定影响。在9i R2之前,data gauard的服务器只能运行再read only或者recover 模式, 一个physical standy database 在物理上完全等同主库,当physical standy database再做恢复的时候,不能打开用作其他用途。 而logical standby database只是在logical上等同需要恢复的schema, 所以在恢复的时候,可以同时打开做report,也可以用户和主库不一样的 数据对象等等,极大了提高了从库的利用率。物理STANDBY提供与主数据库完全一样的拷贝(块到块),数据库SCHEMA,包括索引都是一样的。它是直接应用REDO实现同步的。逻辑STANDBY则不是这样,在逻辑STANDBY中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,然后在STANDBY上执行SQL语句。逻辑STANDBY除灾难恢复外还有其它用途,比如用于用户进行查询和报表。DATAGUARD包含三个服务(日志传输、日志应用和角色转换)日志传输服务控制REDO数据的传输(传输日志,实施数据库保护模式)--------------STANDBY上通过起用RFS进程接收REDO数据。日志应用服务则一方面自动应用日志,另一方面自动检测STANDBY缺少的REDO,并从主数据库或其它STANDBY中自动查询出丢失的REDO。(三)、oracle 11g 的Data Guard方面新特点,分别从physic和logical standby的新特性来说明:1、物理(Physical)standby新特点(1)、Physical standby with Real Time Query11g以前的物理standby,可以是只读方式打开数据库,但是这时Media Recovery(Redo Apply)过程就停止了,如果standby数据库处于恢复的过程那么数据库就不能Open。11g解决了这个矛盾,恢复的同时可以只读打开数据库,这有点类似逻辑standby数据库的功能。这样可以更大发挥physical standby的作用(比如对于实时要求比较高的报表服务)。(2)、加快standby数据库备份的速度在oracle10g oracle引入了Block Tracking技术,来监控那些数据库是上次增量备份以来修改了的,这样可以加快增量备份的数度,但是这个功能只能在Primary数据库上有效,在standby数据库是不支持这个功能的。Oracle 11g解决了这个问题,standby数据库的备份也支持Block Tracking,这样用户可以在standby上面快速执行备份,减轻Primary上面负载。(3)、Snapshot Standby就是允许Physical standby数据库以读写模式打开,但是同时没有破坏它作为standby数据库的功能,这个特性可以用来在Physical standby上面执行某些测试,等测试完成,把数据库再置为Physical standby。当然在standby 以读写方式打开的时候,它只能接收Primary传过来的Redo,但是不能Apply这些Redo。实际上因为就是在standby使用了Flashback技术来实现这个功能。(4)、提高Redo Apply的性能Oracle11g可以利用并行技术来进行Redo Apply ,提高恢复的速度。(5)、11g 已经支持异构平台的physic standby2、逻辑(Logical)standby的新特点(1)、支持的数据类型更多了。现对Oracle10g,11g新增下列数据类型:XMLType data type (最为CLOB存储)(2)、支持下面oracle包和数据加密DBMS_FGA (Fine Grained Auditing)DBMS_RLS (Virtual Private Database)实际上就是支持在logical standby数据库上面支持精细的审计功能和虚拟数据库功能。Transparent Data Encryption (TDE)的支持standby上面支持并行DDL3、Fast-Start Failover更快速执行失败切换,更精细控制触发Failover的事件,比如:可以更具某个ORA的错误号来出发切换二、Oracle 11g DataGuard (物理standby)的部署:(一)、前提:1.采用 physic(物理) standby configuration 最大性能模式2.采用data guard的容灾方案。3.优点:在备机上做恢复,从主库上通过rman同步过来作,恢复速度快。Oracle11g一个重大的功能改进就是DATA GUARD可以在打开的情况下应用归档。这个功能使得STANDBY数据库可以轻松的替PRIMARY来分担查询的压力。4.缺点:不能还原到某一时刻。(二)、环境准备:1.主库也备库oracle版本一致,尽量运行在相同平台如linux,服务器硬件可以不一样。2.Primary 数据库必须运行于归档模式,并且务必确保在primary 数据库上打开FORCE LOGGING,以避免用户通过nologging 等方式避免写redo 造成对应的操作无法传输到standby 数据库。3.Primary 和standby 数据库均可应用于单实例或RAC 架构下,并且同一个data guard 配置可以混合使用逻辑standby 和物理standby.4.建议数据库必须采用相同的存储架构。比如存储采用ASM/OMF 的话,那不分primarty 或是standby也都需要采用ASM/OMF。5.standby库的环境和primary一致(三)、主机、实验IP、操作系统环境:Primary数据库:操作系统: CentOS5.5 64bitIP地址:192.168.45.91数据库SID:racdbDB_UNIQUE_NAME:racdb01Standby数据库:操作系统: CentOS5.5 64bitIP地址:192.168.45.92数据库SID:racdbDB_UNIQUE_NAME:racdb02(四). Primary 端的配置1. 主库设置为force logging 模式SQL> alter database force logging;2. 主库设为归档模式SQL> archive log list; SQL> shutdown immediate SQL> startup mount SQL> alter database archivelog; SQL> archive log list; 3. 添加redo log file添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员:SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M; 4. 创建备库的密码文件和控制文件创建备库的控制文件 SQL> alter database create standby controlfile as '/home/oracle/controlbak.ctl'; Database altered. 这样以上的主库已经配置完毕。scp /home/oracle/controlbak.ctl 192.168.45.92:/u01/app/oracle/oradata/racdb/controlguard01.ctl说明: 判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。[oracle@localhost dbs]$ orapwd file=/u01/app/oracle/11.2.0/oracle/dbs/orapwracdb password=admin如果已经存在,就不用创建了。 缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)5. 修改初始化参数文件SQL> create pfile='/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora' from spfile;在initorcl.ora 添加如下内容:*.DB_UNIQUE_NAME='racdb01' *.log_archive_dest_1='location=/u01/app/oracle/arch' *.log_archive_dest_2='SERVICE=racdb02' *.LOG_ARCHIVE_DEST_STATE_1=ENABLE *.LOG_ARCHIVE_DEST_STATE_2=ENABLE *.standby_file_management='AUTO'*.standby_archive_dest='/u01/archive'*.FAL_SERVER='racdb01' *.FAL_CLIENT='racdb02' 附:primary库的initracdb.ora文件内容racdb.__db_cache_size=92274688racdb.__java_pool_size=4194304racdb.__large_pool_size=4194304racdb.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environmentracdb.__pga_aggregate_target=146800640racdb.__sga_target=272629760racdb.__shared_io_pool_size=0racdb.__shared_pool_size=155189248racdb.__streams_pool_size=4194304*.audit_file_dest='/u01/app/oracle/admin/racdb/adump'*.audit_trail='db'*.compatible='11.2.0.0.0'*.control_files='/u01/app/oracle/oradata/racdb/control01.ctl','/u01/app/oracle/flash_recovery_area/racdb/control02.ctl'*.db_block_size=8192*.db_domain=''*.db_name='racdb'*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'*.db_recovery_file_dest_size=4070572032*.DB_UNIQUE_NAME='racdb01'*.diagnostic_dest='/u01/app/oracle'*.dispatchers='(PROTOCOL=TCP) (SERVICE=racdbXDB)'*.FAL_CLIENT='racdb02'*.FAL_SERVER='racdb01'*.log_archive_dest_1='location=/u01/app/oracle/arch'*.log_archive_dest_2='SERVICE=racdb02'*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'*.memory_target=419430400*.nls_language='SIMPLIFIED CHINESE'*.nls_territory='CHINA'*.open_cursors=300*.processes=150*.remote_login_passwordfile='EXCLUSIVE'*.standby_archive_dest='/u01/app/oracle/arch'*.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1'如果主库和备库的数据文件位置不同,还需要加如下2个参数:*.log_file_name_convert='/u02/oradata/racdb/','/u03/oradata/racdb/'*.db_file_name_convert='/u02/oradata/racdb/','/u03/oradata/racdb/'注意:racdb01,racdb02是在tnsnames文件中配置的。用'/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora' 这个pfile 启动数据库,并生成spfile。SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup pfile='/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora';ORACLE instance started.Total System Global Area 167772160 bytesFixed Size 1218316 bytesVariable Size 79694068 bytesDatabase Buffers 83886080 bytesRedo Buffers 2973696 bytesDatabase mounted.Database opened.SQL> create spfile from pfile='/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora';File created.6. 修改listener.ora 和tnsnames.ora 文件Listener.ora 文件:SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = PLSExtProc)(ORACLE_HOME = /u01/app/oracle/11.2.0/oracle)(PROGRAM = extproc))(SID_DESC =(SID_NAME = racdb)(ORACLE_HOME = /u01/app/oracle/11.2.0/oracle))) LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.91)(PORT = 1521))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))注意:SID_LIST_LISTENER 配置的是静态注册,如果没有该参数,而且Data Guard 启动顺序又不正确,那么在主库可能会报 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 错误,导致归档无法完成。Oracle Listener 动态注册 与 静态注册http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspxTnsnames.ora 文件racdb01 =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.91)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = racdb)))racdb02 =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.92)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = racdb)))(五). Standby 端配置1. 创建备库存放数据文件和后台跟踪目录, 这个目录可以和主库相同, 如果不同,就需要在主库的初始化文件中进行转换。 如:*.log_file_name_convert='/u02/oradata/racdb/','/u03/oradata/racdb/'*.db_file_name_convert='/u02/oradata/racdb/','/u03/oradata/racdb/'2. 将主库的密码文件,控制文件,数据文件,参数文件,日志文件copy到备库。 控制文件是我们自己创建的standby 控制文件。将copy过来的控制文件再复制三份就可以了。 主备的控制文件是不一样的。这里除了采用直接copy 文件之外,还可以采用Rman 恢复来做。 直接copy 需要停数据库,如果采用RMAN 的话,就不需要停机了。 [oracle@localhost orcl]$ pwd/u01/app/oracle/oradata/racdb[oracle@localhost orcl]$ lscontrol01.ctl redo01.log redo04.log redo07.log temp01.dbfcontrol02.ctl redo02.log redo05.log sysaux01.dbf undotbs01.dbfcontrol03.ctl redo03.log redo06.log system01.dbf users01.dbf[oracle@localhost racdb]$ scp *.dbf *.ctl *.log 192.168.45.92:/u01/app/oracle/oradata/racdb[oracle@localhost dbs]$ cd /u01/app/oracle/11.2.0/oracle/dbs/[oracle@localhost dbs]$ scp orapwracdb initracdb.ora 192.168.45.92:/u01/app/oracle/11.2.0/oracle/dbs/3. 修改初始化参数文件注意:控制文件位置也需要修改:vi /u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora#修改本行为下行的状态 *.control_files='/u01/app/oracle/oradata/racdb/control01.ctl','/u01/app/oracle/flash_recovery_area/racdb/control02.ctl'*.control_files='/u01/app/oracle/oradata/racdb/control01.ctl','/u01/app/oracle/oradata/racdb/control02.ctl','/u01/app/oracle/oradata/racdb/control03.ctl'否则会报错,ORA-00205修改之后如下:*.DB_UNIQUE_NAME='racdb02' *.log_archive_dest_1='location=/u01/app/oracle/arch' *.log_archive_dest_2='SERVICE=racdb01' *.LOG_ARCHIVE_DEST_STATE_1=ENABLE *.LOG_ARCHIVE_DEST_STATE_2=ENABLE *.FAL_SERVER='racdb02' *.FAL_CLIENT='racdb01' *.standby_file_management='AUTO'*.standby_archive_dest='/u01/app/oracle/arch'对比主库的配置文件如下:*.DB_UNIQUE_NAME='racdb01' *.log_archive_dest_1='location=/u01/app/oracle/arch' *.log_archive_dest_2='SERVICE=racdb02' *.LOG_ARCHIVE_DEST_STATE_1=ENABLE *.LOG_ARCHIVE_DEST_STATE_2=ENABLE *.standby_file_management='AUTO'*.standby_archive_dest='/u01/archive'*.FAL_SERVER='racdb01' *.FAL_CLIENT='racdb02' 4. 修改listener.ora 和 tnsnames.ora 文件,如果不存在,就从主库上copy 过去。tnsnames.oraracdb01 =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.91)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = racdb)))racdb02 =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.92)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = racdb)))listener.oraSID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = PLSExtProc)(ORACLE_HOME = /u01/app/oracle/11.2.0/oracle)(PROGRAM = extproc))(SID_DESC =(SID_NAME = racdb)(ORACLE_HOME = /u01/app/oracle/11.2.0/oracle))) LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.92)(PORT = 1521))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))5. 在备库添加redo log file如果主库没有添加redo log file,可以先用copy 过来的初始化文件将数据库启动到mount 状态。在创建个spfile,最后添加redo log。SQL> startup mount pfile='/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora'ORACLE instance started.SQL> create spfile from pfile='/u01/app/oracle/11.2.0/oracle/dbs/initracdb.ora';添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员:SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/racdb/redo04.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/racdb/redo05.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/racdb/redo06.log') size 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/racdb/redo07.log') size 50M; 提示,由于从Primary数据库复制文件时并没有复制Online Redologs,因此物理Standby数据库在第一次启动REDO应用时,会在Alert文件中报Online Redo Logfile文件不存在,没有关系,物理Standby会自动重建这批文件,同时你也不用担心会丢失数据,Online Redologs中的数据会以归档文件的形式从Primary端接收。至此,Data Guard的配置操作已经完成,下面来开始验证。有错可以按照log提示排除,log位置:/u01/app/oracle/diag/rdbms/racdb02/racdb/trace/alert_racdb.log注意Data Guard 启动顺序:启动顺序:先standby ,后primary;关闭顺序:先primary 后standby;在备库将实例启动到mount 状态:SQL> startup nomount;SQL>alter database mount standby database ; SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; #报错 ORA-16136SQL>alter database recover managed standby database disconnect from session; 在备库启动监听:$lsnrctl start在主库启动实例:SQL> startup;在主库启动监听:$lsnrctl start在主库验证归档目录是否有效:SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;如果有错误,要排查原因。SQL> alter system switch logfile;SQL> select max(sequence#) from v$archived_log;MAX(SEQUENCE#)--------------70主备查询结果一致,Data Guard 搭建+启动+检验结束。注意:如果在主库执行 alter database clear unarchived logfile或alter database open resetlogs , 则dataguard要重建。(六).其他操作、查询1. 首先查看当前的保护模式 ---primary数据库操作SQL> select protection_mode,protection_level from v$database;PROTECTION_MODE PROTECTION_LEVEL-------------------- --------------------MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE2. 设置新的数据保护模式并重启数据库 --primary数据库操作当保护模式更改顺序:maximize protection ---> maximize availability ----> maximize performance当在把dataguard的保护级别按这上面的顺序减低的时候,不需要primary库在mount状态,否则primary 必须在mount状态。 如:SQL> alter database set standby database to maximize availability;alter database set standby database to maximize availability*ERROR at line 1:ORA-01126: database must be mounted in this instance and not open in anyinstanceSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 167772160 bytesFixed Size 1218316 bytesVariable Size 79694068 bytesDatabase Buffers 83886080 bytesRedo Buffers 2973696 bytesDatabase mounted.SQL> alter database set standby database to maximize availability;Database altered.SQL> alter database open;alter database open*ERROR at line 1:ORA-03113: end-of-file on communication channel报错了,这是因为最大可用性需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open.Maximum protection/AVAILABILITY模式必须满足以下条件Redo Archival Process: LGWRNetwork Tranmission mode: SYNCDisk Write Option: AFFIRMStandby Redo Logs: Yesstandby database type: Physical OnlySQL> alter system set log_archive_dest_2='service=racdb02 lgwr sync AFFIRM';System altered.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 167772160 bytesFixed Size 1218316 bytesVariable Size 79694068 bytesDatabase Buffers 83886080 bytesRedo Buffers 2973696 bytesDatabase mounted.SQL> alter database set standby database to maximize availability;Database altered.SQL> alter database open;Database altered.SQL> select protection_mode,protection_level from v$database;PROTECTION_MODE PROTECTION_LEVEL-------------------- --------------------MAXIMUM AVAILABILITY MAXIMUM AVAILABILITYalter database set standby database to maximize performance;提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分别对应最大保护,最高可用性及最高性能。在最大保护模式下,直接关闭备库是不行的,如果在备库上关闭数据库,会有如下提示:SQL> shutdown immediateORA-01154: database busy. Open, close, mount, and dismount not allowed nowSQL>在最大保护模式下,备库是不允许关闭的,此时首先关闭主库,然后备库就可以顺利关闭了。注意: 主库的保护模式修改之后,备库的模式也会改变,和主库保持一致。 3. 查看日志归档情况主库进行日志切换: SQL>Alter system switch logfile; select max(sequence#) from v$archived_log; select max(sequence#) from v$log_history; select group#,sequence#,archived,status from v$log; select name,sequence#,applied from v$archived_log; select sequence#,applied from v$archived_log; 若不同步, 1) 看log日志, archive是否有丢失 2)可以在备库坐如下操作: alter database recover managed standby database cancel; alter database recover managed standby database disconnect from session; (七)、 主备库切换 (一)、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 状态 SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;SWITCHOVER_STATUS--------------------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时,在官方文档说转换会不成功,但是我测试的时候成功了。B.ora- 01153: an incompatible media recovery is active 运行下面sqlAlter database recover managed standby database finish; 或者Alter database recover managed standby database finish force;Alter database recover managed standby database disconnect from session; 2 切换成备库 SQL>Alter database commit to switchover to physical standby with session shutdown; 或者SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; Database altered. 3 启动到mount和应用日志状态 SQL> SHUTDOWN IMMEDIATE SQL> startup nomount; SQL> alter database mount standby database; SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; 4. 查看数据库模式 SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; SQL>select status,database_mode from v$archive_dest_status; 备库: 1.查看switchover状态 SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; TO PRIMARY 附:若不是用此语句切换:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown 补充:若出现:ORA-16139: media recovery required是因为没有执行:alter database recover managed standby database disconnect from session; 2. 切换成主库 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; Database altered. SQL> shutdown immediate; SQL> startup; SQL> alter system switch logfile; 3. 查看数据库模式 SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; SQL>select status,database_mode from v$archive_dest_status; 验证同步:SQL> select max(sequence#) from v$archived_log;MAX(SEQUENCE#)--------------78(二)、Failovers: FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATA GUARD环境会被破坏。 由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。 1. 查看是否有日志GAP,没有应用的日志: SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG; SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; 如果有,则拷贝过来并且注册 SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路径'; 重复查看直到没有应用的日志: 2. 然后停止应用归档: SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Database altered. 3. 下面将STANDBY数据库切换为PRIMARY数据库: SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; 或 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; Database altered. SQL> SELECT DATABASE_ROLE FROM V$DATABASE; DATABASE_ROLE ---------------- PHYSICAL STANDBY SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; Database altered. SQL> ALTER DATABASE OPEN; 或者 shutdown immediate+startup Database altered. 检查数据库是否已经切换成功: SQL> SELECT DATABASE_ROLE FROM V$DATABASE; DATABASE_ROLE ---------------- PRIMARY 至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。
