1.3 dg-broker切换(switchover) 15
9.standby_file_management 参数维护 23
一、原理介绍
Oracle DataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。 DataGuard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。在生产数据库的保证"事务一致性"时,使用生产库的物理全备份创建备库,备库会通过生产库传输过来的归档日志或重做条目自动维护备用数据库。
DataGuard数据同步技术有以下优势:
1) Oracle数据库自身内置的功能,与每个Oracle新版本的新特性都完全兼容,且不需要另外付费。
2) 配置管理较简单,不需要熟悉其他第三方的软件产品。
3) 物理Standby数据库支持任何类型的数据对象和数据类型;
4) 逻辑Standby数据库处于打开状态,可以在保持数据同步的同时执行查询等操作。
5) 在最大保护模式下,可确保数据的零丢失。
1、DG架构
Oracle DataGuard由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成。组成Data Guard的数据库通过Oracle Net连接,并且有可以分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制。
1.Primary 数据库
DataGuard包含一个primary数据库即被大部分应用访问的生产数据库,该库既可以是 单实例数据库,也可以是RAC。
2.Standby 数据库
Standby数据库是primary数据库的复制(事务上一致)。在同一个Data Guard中可以最多创建9个standby数据库。一旦创建完成,Data Guard通过应用primary数据库的redo自动维护每一个standby数据库。Standby数据库同样即可以是单实例数据库,也可以是RAC结构。
2、备库类型
Standby数据库通常分两类:逻辑standby和物理standby
逻辑standby是通过接收primary数据库的redo log并转换成sql语句,然后在standby数据库上执行SQL语句实现同步。
物理standby是通过接收并应用primary数据库的redo log以介质恢复的方式实现同步,不仅文件的物理结构相同,连块在磁盘上的存储位置都是一模一样的。
3、DG服务
重做传输服务(Redo Transport Services)
控制redo数据的传输到一个或多个归档目的地。日志应用服务(Log Apply Services)
应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可以从standby数据库的归档文件读取,也可直接应用备用日志文件读取。
角色转换服务(Role Transitions)
DataGuard中有两种角色:primary和standby。角色转换就是让数据库在这两个角色中切换, 切换分两种:switchover和failover
1)switchover:转换primary数据库与standby数据库。switchover可以确保不会丢失数据。
2)failover:当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。
4、保护模式
1、最大保护模式
最大保护模式为主数据库提供了最高水平的数据保护,从而确保了一个全面的零数据丢失灾难恢复解决方案。当在最大保护模式下运行时,重做记录由日志写入进程从主数据库同步地传输到备用数据库,并且直到确认事务数据在至少一个备用服务器上的磁盘上可用时,才在主数据库上提交事务。该模式下,主库和备库完全一致,在主库事务提交前,备库必须收到全部日志数据,如果因网络等原因导致日志无法传送时,将引起严重的性能问题,导致主节点宕机。此时备库不能正常关闭,必须保持和主库一致的模式,如果强行采用abort方式关闭备用数据库,可能引发主库挂起。推荐配置至少2个备库,因为如果其中一个不能从主库接收日志,主库还可继续运行。要保证备库的监听正常,保证主库到备库的连接正常。
2、最大可用模式:
10g时该模式利用LNSn进程传送日志,备库必须添加Standby Redo Log。最高可用性模式拥有仅次于主数据库数据可用性,并提供零数据丢失和防止单组件故障。如同最大保护模式一样,重做数据由日志写入进程从主数据库同步地传输到备用数据库,直到确认事务数据在备用服务器的磁盘上可用时,事务才在主数据库上完成。不过,在这种模式下(与最大保护模式不同),如果最后参与的备用数据库变为不可用,例如由于网络连接问题,处理将在主数据库上继续进行。备用数据库与主数据库相比,可能暂时落在后面,但当它再次变为可用时,备用数据库将自动同步,而不会丢失数据。由于同步重做传输,这种保护模式可潜在地影响响应时间和吞吐量。可以通过配置一个低延迟网络,并为它分配足够应付高峰事务负载的带宽来将这种影响减到最小。最高可用性模式适用于想要在生产站点上出现严重中断时(假定没有其他故障)确保获得零数据丢失保护,但不想让生产数据库受网络/备用服务器故障影响的企业。与最大保护模式一样,采用LGWR方式传送,并且必须有standby redo log。为防止备用库发生网络故障,最好设置reopen参数,即使出现网络故障,也不会引发主库挂起,这时主库将从最大可用模式切换到最大性能模式。该模式下,允许数据分歧,允许异步传送。正常情况运行在最大保护模式下,在主库和备库之间网络断开或连接不正常时,自动切换到最大性能模式,主节点的操作继续,但这种自动切换是否及时是否高效,当前行内并无实际检验,因此在网络不好的情况下,也可能会有较大的性能影响。
3、最大性能模式:
最高性能模式是默认的保护模式。它与最高可用性模式相比,提供了稍微少一些的主数据库数据保护,但提供了更高的性能。在这种模式下,当主数据库处理事务时,重做数据由日志写入进程异步传输到备用数据库上。另外,也可以将主数据库上的归档进程配置为在这种模式下传输重做数据。在任何情况下,均先完成主数据库上的写操作,主数据库的提交操作不等待备用数据库确认接收。如果任意备用目标数据库变为不可用,则处理将在主数据库上继续进行,这对性能只有很小的影响或没有影响。不过在这种情况下,数据库告警日志将记录错误消息,并可以通过 Enterprise Manager 相应地设置告警。在主数据库出现故障的情况下,可能有一些在主数据库上提交了的事务没有传输到备用数据库中。如果网络有足够的吞吐量来跟上重做流量高峰,则丢失的事务将非常少或者为零。当主数据库上的可用性和性能比丢失少量数据的风险更重要时,应该使用最高性能模式。这种模式还适合于 WAN 上的 Data Guard 部署,在 WAN 中,网络的内在延迟可能限制同步重做传输的适用性。在创建Data Guard时,默认创建的是最大性能模式,需要使用其他模式时必须再进行切换。该模式下,利用ARCn进程异步传送日志,无数据同步检查,可能丢失数据,但是能获得主库的最佳性能。
二、搭建环境
1.环境介绍
序号 | 角色 | 操作系统 | 数据库版本 | 主机名 | 实例名 | tnsnames | 备注 |
1 | 主库节点1 | Redhat6.8 | 11.2.0.4 | rac1 | pdb1 | pdb | |
2 | 主库节点2 | Redhat6.8 | 11.2.0.4 | rac2 | pdb2 | pdb | |
1 | 备库节点1 | Redhat6.8 | 11.2.0.4 | node1 | sdb1 | sdb | |
2 | 备库节点2 | Redhat6.8 | 11.2.0.4 | node2 | sdb2 | sdb |
注:oracle data guard 是要求主备环境同架构的技术,确保主备操作系统和数据库软件是相同的
2.主库配置
2.1配置监听listener.ora
修改监听,配置静态监听,因为后面要用到的dg broker,所以静态监听中添加GLOBAL_DBNAME = pdb_DGMGRL 这一个监听,或者调用netmgr 添加database service name来修改静态监听
节点1:添加以下内容
[oracle@rac1 admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC11521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = pdb_ DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
(SID_NAME =pdb1)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
节点2:
[oracle@rac2 admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC11521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = pdb_ DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
(SID_NAME =pdb2)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
2.2配置tnsnames.ora
配置主库tnsnames.ora
PDB=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb)
)
)
SDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1)(PORT = 11521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sdb)
)
)
2.3修改初始化参数
参数1:alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(pdb,sdb)' scope=both sid='*';
参数2:alter system set LOG_ARCHIVE_DEST_1='LOCATION=+ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pdb' scope=both sid='*';
参数4:alter system set LOG_ARCHIVE_DEST_2='SERVICE=sdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sdb' scope=both sid='*';
参数5:alter system set log_archive_format='%t_%s_%r.arc' scope=spfile sid='*';
参数6:alter system set fal_server=sdb scope=both sid='*';
参数7:alter system set db_file_name_convert='+data/pdb/datafile','+data/sdb/datafile' scope=spfile sid='*';
参数8:alter system set log_file_name_convert='+DATA/pdb/onlinelog','+REDO/sdb/onlinelog' scope=spfile sid='*';
参数9:alter system set standby_file_management=AUTO scope=both sid='*';
注:如果是RAC集群且用asm管理的的情况下,对于db_file_name_convert和log_file_name_convert写类似 磁盘组的格式,举例说明如下:
主库单个asm磁盘组
db_file_name_convert='+DATA/pdb‘,’+DATA/sdb‘
主库多个asm磁盘组
db_file_name_convert='+DATA/pdb‘,’+DATA/sdb‘,’+DATA1/pdb’,’+DATA/sdb’
log_file_name_convert同理
2.4强制归档
alter database force logging;
2.5开启闪回
为了之后有可能开启snapshot standby,这种方式可用来临时打开备库做测试。
数据库配置:开启闪回功能
alter system set db_recovery_file_dest_size =10G ;
alter system set db_recovery_file_dest='+DATA';
alter system set db_flashback_retention_target =600;
alter database flashback on;
2.6 添加standby redo log
因为需要做switchover的切换,所以需要配置standby redo log,这个的组数是(redo的个数+1)*每组成员数,这个测试环境是2组redo log,所以就建立6组standby redo log就可以了。注意日志大小参照redo log的大小,保持一致。
alter database add standby logfile thread 1 group 11 '+DATA/pdb/standby11.log' size 1G;
alter database add standby logfile thread 1 group 12 '+DATA/pdb/standby12.log' size 1G;
alter database add standby logfile thread 1 group 13 '+DATA/pdb/standby13.log' size 1G;
alter database add standby logfile thread 2 group 14 '+DATA/pdb/standby14.log' size 1G;
alter database add standby logfile thread 2 group 15 '+DATA/pdb/standby15.log' size 1G;
alter database add standby logfile thread 2 group 16 '+DATA/pdb/standby16.log' size 1G;
2.7创建pfile的备份
create pfile=’/home/oracle/pfile.bak’ from spfile;
2.8创建standby control file
alter database create standby controlfile as '/home/oracle/standby.ctl';
2.9传递相关文件到备库
传递pfile.bak到备库
传递密码文件到备库,并修改密码文件的名字为备库的实例
传递standby control file到备库
3.备库配置
3.1配置备库监听
修改监听,配置静态监听,因为后面要用到的dg broker,所以静态监听中添加GLOBAL_DBNAME = pdb_DGMGRL 这一个监听,或者调用netmgr 添加database service name来修改静态监听
节点1:添加以下内容
[oracle@rac1 admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC11521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = pdb_ DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
(SID_NAME =sdb1)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
节点2:
[oracle@rac2 admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC11521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = pdb_ DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)
(SID_NAME =sdb2)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
3.2配置tnsnames.ora
配置主库tnsnames.ora
PDB=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 11521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb)
)
)
SDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1)(PORT = 11521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sdb)
)
)
3.3修改pfile文件
主要注意几个参数必需要修改:
序号 | 修改参数 | 说明 |
1 | *.db_name | 保持和主库的一致,只有一致了,物理standby才能正确配置 参考值:PDB |
*.db_unique_name | 写备库的实例名,要区别主库的实例名 参考值:SDB | |
2 | log_archive_dest_1 | 写本地的归档路径,参考值: 'LOCATION=+ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sdb' |
3 | log_archive_dest_2 | 写主库的归档路径,参考值: ‘service=pdb LGWR ASYNC valid_for=(all_logfiles,primary_role)' 备注:service对应的名字写的tnsnames的名字,而非实例名 |
4 | db_file_name_convert | 参考值: db_file_name_convert='+DATA/pdb’,’+DATA/sdb’ |
5 | log_file_name_convert | log_file_name_convert=’+ARCH’,’+REDO’ |
6 | audit_file_dest | /u01/app/oracle/admin/sdb/adump |
7 | fal_server | 日志来源 参考值:PDB |
3.4创建相应的目录
备库有些目录是没有建立好的,需要提前建立,参考如下
mkdir -p /u01/app/oracle/admin/sdb/adump
3.5开启闪回
为做测试临时打开备库,后期做dg-broker failover功能验证也需要打开。
alter system set db_recovery_file_dest_size =10G ;
alter system set db_recovery_file_dest='+DATA';
alter system set db_flashback_retention_target =600;
alter database flashback on;
4.恢复备库
两种方式恢复备库
1、采用常规的rman备份恢复。适用情形:主库数据量大/主备带宽较低
2、采用数据库复制技术恢复备库。适用情形:数据库体量小/带宽高
4.1数据库复制技术
4.1.1 启动实例到nomount
startup pfile=’/home/oracle/pfile.bak’ nomount
在这一步也可以顺便检查之前的目录有没有创建正确
启动完成无异常后,创建spfile,再以spfile的方式启动到nomount状态
SQL>create spfile=’+DATA/SDB/PARAMETER/spfilesdb.ora’ from pfile=’/home/oracle/pfile.bak’;
SQL>shutdown immediate
SQL>startup nomount
4.1.2 开始数据库复制
使用duplicate 直接复制主库,命令如下:
备库启动到nomount状态后
rman target sys/密码@pdb auxiliary sys/密码@sdb nocatalog
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
duplicate target database for standby from active database nofilenamecheck;
release channel c1;
release channel c2;
}
这种方法节省备份空间,但对带宽和数据量有要求。
注:之后的操作同4.2.6
4.2rman恢复技术
4.2.1启动实例到nomount
startup pfile=’/home/oracle/pfile.bak’ nomount
在这一步也可以顺便检查之前的目录有没有创建正确
启动完成无异常后,创建spfile,再以spfile的方式启动到nomount状态
SQL>create spfile=’+DATA/SDB/PARAMETER/spfilesdb.ora’ from pfile=’/home/oracle/pfile.bak’;
SQL>shutdown immediate
SQL>startup nomount
4.2.2 恢复standby控制文件
rman > restore controlfile from '/home/oracle/standby.ctl';
这一步可以检查control放置的路径是否正确创建了的,如果有报错请troubleshooting
4.2.3 启动备库到mount状态
alter database mount;
注:只有在mount状态了,才可以利用rman进行数据库的恢复,来达到初始化的目的
4.2.4 主库全备,将备份传递到备库
对主库进行全备,参考脚本如下:
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
backup database format '/home/oracle/rman/FULL_%U.bak' ;
backup archivelog all format '/home/oracle/rman/ARC_%U.bak';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
注:主备库创建了/home/oracle/rman目录,所有的备份文件都放在这个目录中。对于分配的channel,可以根据实际的情况来进行增删。另外,需要注意的是准备足够的磁盘空间进行rman的全备。
4.2.5 恢复备库
进入到备份的目录,然后进行备库恢复,参考脚本如下:
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
restore database ;
restore archivelog all;
recover database;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
注:restore会将主库数据库文件和日志恢复到备库,所以务必保证初始化参数db_file_name_convert和log_file_name_convert的正确性。
4.2.6 备库开启redo apply
在保证恢复正常之后,在备库开始redo apply
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.
4.2.7 将数据库资源添加到集群管理中
指定参数文件启动位置
节点1:
vi $ORACLE_HOME/dbs/initsdb1.ora
SPFILE='+DATA/SDB/spfilesdb.ora'
节点2:
vi $ORACLE_HOME/dbs/initsdb2.ora
SPFILE='+DATA/SDB/spfilesdb.ora'
添加集群信息
srvctl add database -d sdb -n node1 -o /oracle/app/oracle/product/11.2.0/db -p +DATA/sdb/parameterfile/spfilesdb.ora
srvctl add instance -d sdb -i sdb1 -n node1
srvctl add instance -d sdb -i sdb2 -n node2
srvctl start database -d sdb
srvctl modify database -d sdb -o open
5.dg-broker配置
5.1 配置dg-broker
所有的dg broker配置均在主库进行
alter system set dg_broker_start=true;
$ dgmgrl sys/密码
5.2添加备库信息
DGMGRL> CREATE CONFIGURATION 'dg_broker' AS PRIMARY DATABASE IS 'pdb' CONNECT IDENTIFIER IS 'pdb';
Configuration "pdb" created with primary database "pdb"
ADD DATABASE 'pdb' AS CONNECT IDENTIFIER IS 'pdb';
DGMGRL> ADD DATABASE sdb AS CONNECT IDENTIFIER IS sdb;
Database "sdb" added
5.3启动配置
这一步是真正的使得配置生效
DGMGRL> ENABLE CONFIGURATION;
注:这个时候,最好将主库和备库的alert日志都打开进行跟踪
5.4查看配置信息
DGMGRL> show CONFIGURATION;
Configuration
Name: dg_broker
Enabled: YES
Protection Mode: MaxPerformance
Databases:
pdb - Primary database
sdb - Physical standby database
Fast-Start Failover: DISABLED
Current status for "dg_broker":
SUCCESS
DGMGRL> exit
至此,关于配置的工作结束
5.5 查看备库dg-broker配置
在主库进行测试表的创建,看在备库上是否能看到。
$dgmgrl>show configuration
三、切换操作(手动和dg-broker)
1、数据库切换
1.1 手动切换(switchover)
检查切换前状态:
sql>select switchover_status ,database_role,open_mode from v$database;
${grid}>srvctl stop listener
${oracle}>ps -ef |grep “LOCAL=NO” |grep pdb |grep -v grep |awk ‘{print $2}’ |xargs kill -9
主:srvctl stop instance -d pdb -i pdb2
备:srvctl stop instance -d sdb -i sdb2
主:alter database commit to switchover to physical standby with session shutdown;
备: recover managed standby database cancel;
备:alter database commit to switchover to primary with session shutdown;
原主:recover managed standby database using current logfile disconnect from sesson;
1.2 手动切换(failover)
如果主库出现突发故障,主备库不能正常做切换,只能使用failover将备库转为主库,操作如下:
备: recover managed standby database cancel;
备:alter database commit to switchover to primary with session shutdown;
或者alter database activate physical database;
这样原主备关系断开,原主库未传输的redo丢失。
1.3 dg-broker切换(switchover)
通过broker可以很容易的坐到切换snapshot db,switchover切换,failover切换。
在以前通过命令切换的时候,首先要检查状态,然后在主库和备库都要敲命令才能实现以上说的切换。
而通过dg broker来进行切换,只需要一条命令:
例如切换到备库sdb
DGMGRL> help switchover
Switch roles between the primary database and a standby database
Syntax:
SWITCHOVER TO <standby database name>;
DGMGRL> SWITCHOVER TO sdb;
切换完成后记得查看配置信息
DGMGRL> show configuration
注:有相关的测试报告
1.4dg-broker切换(failover)
场景:如果配置了dg-broker的failover功能,可以实现主库发生故障时,自发failover,使得备库快速接管业务,过程可实现数据的零丢失,配置如下:
数据库配置:开启闪回功能 主库: alter system set db_recovery_file_dest_size =10G ; alter system set db_recovery_file_dest='+DATA'; alter system set db_flashback_retention_target =600; alter database flashback on; 备库: alter system set db_recovery_file_dest_size =10G ; alter system set db_recovery_file_dest='+DATA'; alter system set db_flashback_retention_target =600; alter database flashback on; DG-BROKER配置: DGMGRL>edit database pdb set property FastStartFailoverTarget=sdb; DGMGRL>edit database sdb set property FastStartFailoverTarget=pdb; DGMGRL>enable fast_start failover; 启用守护进程 nohup dgmgrl -silent sys/*****@sdb "start observer" & |
当主库发生通信故障或者宕机故障,触发主库failover 到备库,过程中数据零丢失。
注:用sqlplus 和dg-broker两种方式都可以对dg进行管理,但两者管理方式冲突,不可同时管理,在选择管理方式时须慎重。
1.5 临时打开备库
临时打开备库并不是是主备库做failover操作,而是在保证主备库关系不断的情况下,利用闪回技术临时打开备库,使备库处理读写状态,之后通过闪回还原备库的技术。适用用备库测试的情况,验证数据一致性等操作,具体操作如下:
1.物理standby配置闪回日志
SQL>alter system set db_recovery_file_dest_size=10G;
SQL>alter system set db_recovery_file_dest='+DATA/SDB/FALSHDATA;
2.物理standby停止应用日志
SQL>alter database recover managed standby database cancel;
3.物理standby转换为snapshot standby,并且open snapshot standby
SQL>alter database convert to snapshot standby;
SQL>alter database open;
4.等测试结束后,还原备库
SQL>alter database convert to physical standby;
5.开启实时应用
SQL>alter database recover managed standby database using current logfile disconnect from session;
2、网络层切换
网络切换意思是保证业务端不做任何修改,对网络调整,包含数据库地址变更,网关调整,防火墙策略调整等。下面主要是数据库地址的变更
2.1修改公有ip
备份原/etc/hosts 文件 cp /etc/hosts /etc/hosts_bak,将新的ip写入hosts文件
查看当前地址设定
# /u01/app/11.2.0/grid/bin/oifcfg getif
bond0 50.60.107.0 global public
bond1 192.168.33.0 global cluster_interconnect
修改主机bond0 ip地址(两个节点都修改)
节点1:
vi /etc/sysconfig/network-scripts/ifc-bond0
IPADDR=10.90.20.134
GATWAY=10.90.20.254
------------------------------------------
节点2:
vi /etc/sysconfig/network-scripts/ifc-bond0
IPADDR=10.90.20.134
GATWAY=10.90.20.254
--删除旧值并设定新值
# /u01/app/11.2.0/grid/bin/oifcfg delif -global bond0
# /u01/app/11.2.0/grid/bin/oifcfg setif -global bond0/10.90.20.0:public
验证
# /u01/app/11.2.0/grid/bin/oifcfg getif
重启网卡
#service network restart
注:修改完网卡地址重启网卡后,网络需要调整vlan,以便可以远程连接
2.2修改虚拟ip
一般而言,只有 10.2.0.3 之前的版本需要完全的停机。从 10.2.0.3 开始,ASM 和数据库实例对 VIP 资源的依赖关系已经被删除,所以修改 VIP 不需要停止 ASM 和数据库实例,只有当修改 VIP 时产生的客户端连接会受影响。如果修改只涉及到特定的节点,那么只有连接到对应节点的客户端链接在修改时会受影响。
查看当前设定
[grid@rac1 ~]$ srvctl config vip -n rac1
VIP exists: /rac1-vip/50.60.107.3/50.60.107.0/255.255.255.0/bond0, hosting node rac1
[grid@rac2 ~]$ srvctl config vip -n rac2
VIP exists: /rac2-vip/50.60.107.4/50.60.107.0/255.255.255.0/bond0, hosting node rac2
停止vip服务
[grid@rac1 ~]$ srvctl stop vip -n rac1 -f
[grid@rac2 ~]$ srvctl stop vip -n rac2 -f
root修改VIP设置:
# /u01/app/11.2.0/grid/bin/srvctl modify nodeapps -n rac1 -A 10.90.20.3/255.255.255.0/bond0
# /u01/app/11.2.0/grid/bin/srvctl modify nodeapps -n rac1 -A 10.90.20.4/255.255.255.0/bond0
再次验证VIP修改完成:
[grid@rac1 ~]$ srvctl config vip -n rac1
[grid@rac2 ~]$ srvctl config vip -n rac2
启动vip
[grid@rac1 ~]$ srvctl start vip -n rac1
[grid@rac1 ~]$ srvctl start vip -n rac2
修改监听相关参数
两个节点分别确认:
show parameter local_listener
修改asm实例以及数据库实例参数:
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.90.20.3)(PORT=11521))' sid='+ASM1';
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.90.20.4)(PORT=11521))' sid='+ASM2';
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.90.20.3)(PORT=11521))' sid='pdb1';
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=10.90.20.4)(PORT=11521))' sid='pdb2';
2.3修改scanip
查看SCAN VIP当前设置:
[grid@rac1 ~]$ srvctl config scan
SCAN name: pdb-scan, Network: 1/50.60.107.0 /255.255.255.0/bond0
SCAN VIP name: scan1, IP: /pdb-scan/50.60.107.5
停止scan_listener和scan资源
[grid@rac1 ~]$ srvctl stop scan_listener
[grid@rac1 ~]$ srvctl stop scan
确认已停止
[grid@rac1 ~]$ srvctl status scan_listener
SCAN Listener LISTENER_SCAN1 is enabled
SCAN listener LISTENER_SCAN1 is not running
[grid@rac1 ~]$ srvctl status scan
SCAN VIP scan1 is enabled
SCAN VIP scan1 is not running
使用root用户修改SCANIP
#/u01/app/11.2.0/grid/bin/srvctl modify scan -n pdb-scan
注意:root用户执行修改,且确认/etc/hosts映射关系已修改为新的scan。
修改并启动资源
[grid@rac1 ~]$ srvctl modify scan_listener -u
[grid@rac1 ~]$ srvctl start scan_listener
注意:执行后确认scan_listener和scan都已经启动。
2.4修改私有ip
从Oracle 11.2 GI开始,私有网络配置不仅仅存在ocr中,还存在gpnp profile中,所以首先需要备份profile.xml
MOS上的说明:
Please take a backup of profile.xml on all cluster nodes before proceeding, as grid user:
$ cd $GRID_HOME/gpnp/
节点1备份:
[grid@rac1 ~]$ cd /u01/app/11.2.0/grid/gpnp/rac1/profiles/peer/
[grid@rac1 peer]$ cp -p profile.xml profile.xml.bk
节点2备份:
[grid@rac2 ~]$ cd / u01/app/11.2.0/grid/gpnp/rac2/profiles/peer/
[grid@rac2 peer]$ cp -p profile.xml profile.xml.bk
确认CRS集群在各节点启动:
[grid@rac1 ~]$ olsnodes -s
rac1 Active
rac2 Active
设定新的私网信息
oifcfg getif
oifcfg setif -global
[root@rac1 ~]# /opt/app/11.2.0/grid/bin/oifcfg getif
bond1 192.168.33.0 global cluster_interconnect
bond0 10.90.20.0 global public
节点1:
修改网卡物理ip,重启网卡
$oifcfg setif -global bond1/10.10.10.0:cluster_interconnect
$oifcfg getif
$ oifcfg delif -global bond1/192.168.33.0:cluster_interconnect
节点2:
修改网卡物理ip,重启网卡
$oifcfg setif -global bond1/10.10.10.0:cluster_interconnect
$oifcfg getif
$ oifcfg delif -global bond1/192.168.33.0:cluster_interconnect
重启集群验证
crsctl stop cluster -all
crsctl start cluster -all
四、常见问题及处理方法
在dg的部署过程中,一些注意事项及解决方法如下:
问题一:在适用duplicate 复制数据库提示cant’t create controlfile.. not found asmgroup ‘+DATA’
处理方法1:可能controlfile文件创建路径有问题
处理方法2:在$ORACLE_HOME/bin/ 查看oracle文件的权限,如果异常修改为
Chown oracle.asmadmin oracle
Chmod 6751 oracle
问题二:DG 采用lwgr同步,是同步redo,需要在备库创建standby-redo,如果再做主备切换,则需要在主库也创建。如果主备采用arch 同步,则不需要新建redo
处理方法:在备库创建standby_log
问题三:DG在恢复过程中,虽然做了db_file_name_convert 参数调整,但是对于tempfile是不同步的,所以需要单独对tempfile 创建或者修改
处理方法1:在备库新建temp 替换
create temporary tablespace temp_new tempfile ‘+data’ size 10G;
alter database default temporary tablespace temp_new;
drop tablespace old_temp_tablespace including contents and datafiles;
处理方法2:如果temp路径不一致,修改路径
$rman target sys/密码@pdb auxiliary sys/密码@sdb nocatalog
rman>run {
set newname for tempfile 1 to ‘+data’;
set newname for tempfile 2 to ‘+data’;
switch clone tempfile all;
}
问题四:如果使用rman进行恢复的时候,没有进入到备份的目录,那么需要在rman中指定路径catalog start with '/备份文件存放路径/'; ,注意最后要以“/”来结尾,再进行restore恢复
处理方法:catalog start with ‘/’
问题五:注意listener.ora中要有broker的静态监听,注册新的服务名
处理方法:GLOBAL_DBNAME=pdb_DGMGRL
GLOBAL_DBNAME=sdb_DGMGRL
问题六:在show configuration的时候,可能主备库会出现ora-16792的报错
Warning: ORA-16792: configurable property value is inconsistent with database setting
处理方法:这个指的是主备库的某些参数不一致造成的。可以show database dbname statusreport 来进行troubleshooting
问题七:主库创建数据文件未同步到备库(Recovery was unable to create the file as a new OMF file)
处理方法:alter system set standby_file_management=manual;
alter database create datafile '+DATA/PDB/datafile/tbs_test.124353' as '+DATA/SDB/datafile/tbs_test.353212';
alter system set standby_file_management=AUTO;
重新启动mrp
五、常用维护操作
1.查看主备库时延
SQL> select * from v$dataguard_status;
- apply lag,该值表示在通过在备库上应用主库传递过来的重做日志与出库同步所延迟的时间。APPLY LAG: Amount of time that the application of redo data on the standby database lags behind the primary database.例如从查询中看到第1个延迟15秒,第2个延迟0秒。说明该11g的备库应用重做日志已经与该主库完全同步了。
- transport lag,该值表示在单位时间内主库上产生的重做日志还没有传输到备库上
- estimated startup time,该值表示启动和打开物理备库所需要的时间,该字段不是适用于逻辑备库。 An estimate of the time needed to start and open the database.
- standby has been open,该值表示物理备库自从上次启动以来,是否以OPEN READ ONLY方式打开过?该参数值如果是Y,现在需要做FAILOVER,那么就需要先将该物理备库shutdown然后以OPEN READ WRITE方式打开。比如从第1个查询中,看到该物理备库如果做FAILOVER,那么就需要shutdown--->startup open read write;第2个查询中则没有该记录,因为11g的dataguard可以一边OPEN READ ONLY,一边执行redo apply,也就是11g 的ACTIVE Dataguard。
2.开启备库日志应用
SQL> alter database open;
Database altered.
再应用redo日志
SQL> alter database recover managed standby database using current logfile disconnect ;
3.查看数据库的保护模式
在主数据库上:
sql>select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
在备用数据库上:
sql>select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
4.查看备库日志应用状态
Sql>select sequence#,applied from v$archived_log where applied=’YES’;
5.查询主库日志与备库是否一致
SQL> select sequence# from v$archived_log where recid = (select max(recid) from v$archived_log) and applied = 'YES';
SQL> select sequence# from v$archived_log where recid = (select max(recid) from v$archived_log);
6.查看主库的·归档日志的状态
SQL> select dest_name,status,error from v$archive_dest where rownum<3;
DEST_NAME STATUS ERROR
-------------------- --------- -------------------------------
LOG_ARCHIVE_DEST_1 VALID
LOG_ARCHIVE_DEST_2 ERROR ORA-16191: Primary log shipping client not logged on standby
7.关于主备库gap处理
SQL>select * from v$archive_gap;
查询备库和主库是否有漏传的归档,也就是主备库的gap
传输漏传的归档至备库,在备库手动注册
SQL>alter database regiater archivelog ‘+arch/pdb/1_234_234324.arch’;
8.切换前的主备库状态检查
v$database视图中switchover_status
- SESSIONS ACTIVE
在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话。
- TO PRIMARY
该备用数据库可以转换为主数据库。
- TO STANDBY
该主数据库可以转换为备用数据库。
- TO LOGICAL STANDBY
主数据库已经收到了来自逻辑备用数据库的完整的字典。
- NOT ALLOWED
当前的数据库不是带有备用数据库的主数据库。
- PREPARING DICTIONARY
该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备。
- PREPARING SWITCHOVER
接受用于切换的重做数据时,逻辑备用配置会使用它。
- RECOVERY NEEDED备用数据库还没有接收到切换请求。
- SWITCHOVER PENDING
适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库。
- SWITCHOVER LATENT
切换没有完成并返回到主数据库。
9.standby_file_management 参数维护
在搭建DG过程中standby_file_management参数设置为自动,当主库创建数据文件,备库会自动创建,当发生切换后,或者主备做了failover后,将该参数修改为手动,如下:
SQL>alter system set standby_file_management=MANUAL scope=both;




