1.什么是Data Guard(DG)?
备用数据库(Standby Database),从Oracle9i开始也叫做Data Guard,是Oracle推出的一种高可用性(High Available)数据库解决方案,其主要的目标是Oracle数据库层面的数据保护以及容灾方案。主要组成部分为一个在线的生产数据库(或者是RAC集群),我们一般叫做Primary;以及一个在线备用数据库(或者是RAC集群),我们一般叫做Standby。Primary与Standby之间通过日志同步来保证数据的同步和热备,备用节点是是一种随时处在database recovery的状态应用主节点传输过来的日志,并且随时保持active的状态以备随时切换与灾难恢复。从9i开始正式更名为Data Guard,开始支持三种不同的数据保护模式,并可以采用LGWR/LNSn而不仅仅是以往的ARCH对数据进行传送,并增加了一个叫做DMON的后台进程进行监控。支持多大9个standby同事复制。
2.保护模式有哪些分类?
A. maxmize protection,最大保护模式,没有数据丢失,没有数据分歧。LGWR/LNSn将同时传送到备用节点,在主节点事务提交之前,备用节点也必须收到全部日志数据。如果网络不好,没有传送到将会引起严重的性能问题,导致主节点宕机。
B. maxmize availability,最大可用模式,没有数据丢失,允许数据分歧,允许异步传送。正常情况一般运行在该模式下,主节点与被节点由于网络原因不能够通信时候,将自动切换到最大性能模式运行,主节点的操作继续。
C. maxmize performance,最大性能模式。异步传送日志,无数据同步检查,可能丢失数据,但是能够获得主节点的最佳性能。9i的默认模式。
3.物理架构以及功能分布是?
在DG方案中,理论上至少需要两台主机,两套存储。用于搭建逻辑上和物理上完全一致的DB,如果不是接管需要,standby可以比primary配置低一些。与RAC不同的是DG一般只有一个节点是active的,只有当主机发生故障的时候,才考虑切换到备用服务器。备用服务器一般不提供读写操作(因为通常状况下都是recover standby状态,该状态是没有open的)。只有需要的时候才提供只读的报表查询服务,或者档主站点出现故障的时候,经过一定的切换条件,才转变为主数据库,提供正常服务。
4.DG的内部实现原理是?
物理standby其实就是采用的oracle备份恢复的原理实现的,不过是把很多操作封装起来并且做成自动化处理过程而已。可以把standby数据库看成是一个在不断恢复中的数据库,因为他不知道归档日志什么时候结束。因为运行中的primary永远没有结束业务,所以会不断的长生日志,所以standby就会会永远在apply log和waiting for log这两个状态来回切换。因为primary、standby是物理上面两个完全独立的数据库,所以远没有RAC那么复杂,理论上面只要两个库能够相互tnsping通,再加上一些配置就可以了。
从9i开始,既可以传送归档日志,也可以直接传送联机日志,如果是传输的归档日志则有ARCn进程负责,如果是连接日志,Oracle10g以前是由LGWR负责传送,Oracle10g以后是完全由LNSn进程负责传送。日志的接受工作由standby端的RFS进程完成。standby的log apply工作可以手工完成,或者是物理standby的MRP进程完成的,逻辑standby的log apply是有LSP进程完成的。
DG using archived log
DG using online redo
如果采用联机日志的方式传送,那么建议在standby创建一组备用日志(standby log),并保持与primary的日志组大小一致。如果采用联机日志方法传送,但是不在standby创建standby log的话,联机日志将会自动写到standby的归档日志中,如果在创建standby 控制文件的时候,maxlogfiles参数指定过小的话,会影响到standby log的创建,这种情况下必须重新创建控制文件。
5.决定standby的一些参数是哪些?
- db_file_name_convert (primary,standby数据文件的转换目录映射关系,如果目录结构一致就可以省略。)
- 应用举例:*.db_file_name_convert='/opt/oracle/oradata/dwapp_primary','/opt/oracle/oradata/dwapp_standby'
- log_file_name_convert (primary,standby日志文件的转换目录映射关系,如果目录结构一致就可以省略。)
- 应用举例:*.log_file_name_conver='/opt/oracle/oradata/dwapp_primary','/opt/oracle/oradata/dwapp_standby'
- log_archive_dest_n (备用数据库归档的存放路径,primary端和standby端的配置有所不同,这个参数比较重要。)
- 应用举例(主):*.log_archive_dest_1='location=/oracle/arch/dwapp valid_for=(all_logfiles,all_roles) db_unique_name=dwapp_p'
- 应用举例(备):*.log_archive_dest_2='service=dwapp_s lgwr sync net_timeout=50 valid_for=(online_logfiles,primary_role) db_unique_name=dwapp_s'
- compatible(Oracle兼容版本,standby的版本号必须大于或者等于primary,如果想要来回切换,两者必须一致)
- 应用举例:compatible=10.2.0.3.0
- fal_server(指明自动日志同步的源头库的tnsname) fal_server = dwapp_p
- fal_client (指明自动日志同步的目标库的tnsname) fal_client = dwapp_s
- standby_file_management(可以自动同步数据文件,在auto模式下,primary创建数据文件的时候,standby也会自动创建,如果设置manual模式,则不会,可以动态修改)
- 应用举例standby_file_management=auto|manual
- db_unique_name(指定数据库的唯一全局名称,每个单独的物理库一个。如primary= dwapp_p,standby=dwapp_s)
- db_name(指定数据库全局统称,primary,standby对外界而言都是同一个)
- log_archive_config(主备库的tnsname配置列表)
- 应用举例:log_archive_config='DG_CONFIG(dwapp_p,dwapp_s)'
6.实战完整搭建过程?
1. 首先是检查主库的环境,比如datafile目录,onlineredo、archivedredo目录,controlfile目录,pfile目录,dump目录以及spfile目录并且在standby库创建完全一致的或者类似的目录。为搭建环境做好环境准备。检查主备环境的rdbms软件是否一致,或者是备库的是否高于主库。
2.切换到primary库,检查是否是forcelogging模式,归档是否开启。如果没有通过alter database force logging; 来启动设置。
3. dump出来启动参数:create pfile from spfile; 然后添加DG相关信息(注意primary,standby的配置刚好相反):
4.在primary库创建standby control file,standby redo(一般和onlineredo一样的大小):
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/oracle/oradata/onlinelog/stdlog04_1.redo','/oracle/oradata/onlinelog/stdlog04_2.redo') size 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oracle/oradata/onlinelog/stdlog05_1.redo','/oracle/oradata/onlinelog/stdlog05_2.redo') size 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oracle/oradata/onlinelog/stdlog06_1.redo','/oracle/oradata/onlinelog/stdlog06_2.redo') size 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oracle/oradata/onlinelog/stdlog07_1.redo','/oracle/oradata/onlinelog/stdlog07_2.redo') size 50M;
可以通过如下sql查看standbylog是否创建成功:
SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
创建standby log:
shutdown immediate;
startup mount;
create spfile from pfile; (应用刚才修改的DG参数)
alter database create standby controlfile as '/tmp/standby.ctl'; (scn无限大,因此standby db才会一致保持recover状态)
alter database open;
5.将primary库切换到热备份模式: alter database begin backup; 使用scp或者是ftp拷贝datafile,pfile,passwordfile,onlineredo,archiveredo. standby control到standby库对应目录
6.切换到standby,按照第3点修改完成standby的pfile,然后更新spfile启动standby 实例:
create spfile from pfile;(如果有参数设置不当,会提示,更具体是修改就是了,一般是写作了参数名字之类的,如果有参数值写错了,那就只有后续启动的时候才能够检验到了。)
startup nomount;
alter database mount standby database;
7.在主库和备库上面分别穿件自己和对方的访问的专有端口服务,以及配置监听(注意配置的监听需要手工启动:lsnrctl start [newly_listener_name] ):
primary database:
dwapp_p =
(DESCRIPTION =
(SDU=32767)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary_ip)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = dwapp)
)
)
dwapp_s =
(DESCRIPTION =
(SDU=32767)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby_ip)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = dwapp)
)
)
standby database:
dwapp_p =
(DESCRIPTION =
(SDU=32767)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary_ip)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = dwapp)
)
)
dwapp_s =
(DESCRIPTION =
(SDU=32767)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby_ip)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = dwapp)
)
)
8.在保证primary和standby能够相互tnsping通的情况下(tnsping [service_name])进行standby database启动:
alter database recover managed standby database disconnect from session;
9.切换到主库:ALTER SYSTEM SWITCH LOGFILE; 再看备库的alert_log,检查问题,调试网络,如果收到如下信息,则DG搭建完成:
Standby controlfile consistent with primary
RFS[3]: Successfully opened standby log 5: '/oracle/oradata/dwapp/onlinelog/sredo05.log'
Wed Jun 22 11:37:11 CST 2011
Media Recovery Log /oracle/arch/dwapp/1_6984_737923390.dbf
Media Recovery Waiting for thread 1 sequence 6985 (in transit)
7.迁移过程中遇到的问题有哪些?
1.迁移过程中由于源库RDBMS版本是10.2.0.4,而目标库RDBMS版本是10.2.0.5所以文件直接拷过去之后不能够直接打开数据库。而是需要迁移升级,升级步骤如下:
1.重建数据字典,如果有事归档状态的话,强烈建议首先关闭归档:
SQL> SPOOL path.log (路径默认在oracle主目录下 /opt/oracle/,这个日志会有点大30多M,可以查看.)
SQL> @$ORACLE_HOME/rdbms/admin/catupgrd.sql
SQL> SPOOL OFF
这个过程要等很长,我等了40分钟,如果这一步顺利执行,升级已经完成了大半。
2.执行完重建数据字典,重启数据库。
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
3.编译无效对象。
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
4.编译完了通过以下sql查看有否编译失败的记录,并且解决之。
SQL> select * from utl_recomp_errors;