ORACLE Data Guard搭建
交流群:263992520 入群密码:csdn
初学者集中营:http://www.chuxuezhe.net
1、简介:
介绍如何进行DG(data guard)搭建,我们可以使用手工创建和EM或GC图形界面进行GC环境的搭建。本总结也非权威版,属于参考版物。如果有问题可以通过讨论解决:
个人邮箱:zyjj_530@163.com
QQ:86141725 (加好友时,请标注“环境问题”)
2、准备
熟悉ORACLE联机帮助,了解ORACLE基本架构。熟悉LINUX基本命令操作。
3、环境准备
1. 手工建立一个数据库作为PRIMARY DATABASE:PROD
2. 然后根据PROD创建备库STANDBY DATABASE:STANDBY
3. 先建立的备库类型是物理类型,然后在物理类型之上,创建逻辑类型的备库。
4、概念梳理
4.1、介绍
在DG环境中,至少有两个数据库,一个数据库处于Open状态,对外提供服务,该数据库就为Primary Database。另一个数据库处于恢复状态,该数据库为Standby Database。
Data Guard通过日志同步机制保证冗余数据和主数据之间的同步,这种同步可以实时、延时,同步、异步多种方式。
4.2、架构
按照功能分成3个部分:
a.日志发送(Redo Send)
b.日志接收(Redo Receive)
c.日志应用(Redo Apply)
注:Oracle官方文档中,将日志发送和日志接收合为Redo Transport Service。
4.3、日志发送
在DG中,Primary Database运行过程中,会源源不断的产生redo日志,这些日志会发送到Standby Database对应的目录下,进行存放。
那么Primary Database可以根据发送方式的不同,通过LGWR或ARCH进程完成日志的传输。
下面我们来介绍一下,几种日志发送的方式:
Ø 使用LGWR进程的SYNC(同步)方式
1. Primary Database产生的redo日志需要同时写入本地,并且还要通过本地的LNSn进程(Network Server Process),再由LNSn进程将日志通过网络发送给远端目的地(log_archive_dest_2中配置的service地址)。
2. Standby Database的RFS进程(Remote File Server)把接收到的日志写入到Standby redo logfile日志中。
3. 当Primary Database发生日志切换时,会出发Standby Database上的日志切换,即Primary Dtabase发生归档时,此时Standby Database对Standby redo logfile进行归档,然后出发MRP进程(Managed Recovery Process)或LSP进程(Logical Standby Process)恢复归档。
4. 对于LGWR的同步日志传送模式,LGWR必须等待写入本地日志文件操作和通过LNSn进程的网络传送都成功,Primary Database上的事务才能够提交。
5. 因为Primary Database的redo日志是实时传送的,于是Standby Database可以使用两种恢复方式:实时恢复(图4.1操作,即Real-Time Apply),只要RFS把日志写入到Standby Redo Logfile中就会立即恢复;归档时恢复(图4.2操作),在完成对Standby Redo Logfile进程归档才出发恢复。
Ø 使用LGWR进程的ASYNC(异步)方式
1. Primary Database产生Redo日志后,LGWR把日志写入到本地文件中,此时事务就会被提交,无需等待LNSn进程传输成功后,再提交,所以称为异步。
2. LNSn进程会异步的将日志内容发送到Standby Database。
3. 当Primary Database的redo日志写满后,发生日志切换,触发归档模式,也触发Standby Database侧对Standby Redo logfile的归档,然后出发MRP或LSP进程进行恢复归档日志。
Ø 使用ARCH进程
1. Primary Databse产生redo日志,LGWR进程写入到联机日志中,当一组redo日志写满时,发生日志切换,并触发本地归档,图中ARC0完成本地归档操作,本地归档的位置由Primary Database的参数:LOG_ARCHIVE_DEST_1=’location=/path’进行定义。
2. 完成本地归档后,redo日志可以继续进行重用。
3. ARC1进程通过Net把Primary Database的归档日志发送到Standby Database的RFS进程。
4. Standby Database的RFS进程将接受到的日志写入到归档日志中,位置由Standby Database的参数:LOG_ARCHIVE_DEST_1=’location=/path’进行定义。
5. Standby Database的MRP进程或LSP进程在Standby Database侧应用这些日志,进行同步数据。
注:由于ARCH进程传递,只有在Primary Database的归档时,才会发送日志到Standby Database。如果Primary异常宕机,那么redo日志就有可能丢失,导致数据丢失的问题。
4.4、日志接收
对于Standby Database日志接收的地址,也就是归档日志存放的位置,算法如下:
1. 如果配置了STANDBY_ARCHIVE_DEST参数,则使用该参数指定的目录。
2. 如果某个LOG_ARCHIVE_DEST_n参数定义了VALID_FOR=(STANDBY_LOGFILES,*),则使用这个参数指定目录。
3. 如果数据库的COMPATIBLE参数大于等于10.0,则任意选取一个LOG_ARCHIVE_DEST_n的值。
4. 如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n参数均未设置,则使用缺省的STANDBY_ARCHIVE_DEST参数,缺省值为$ORACLE_HOME/dbs/arch。
4.5、日志应用
1. Standby Database分为逻辑Standby Database和物理Standby Database
Ø 物理Standby Database:使用Media Recovery技术,在数据块级别进行恢复,块与块之间的恢复。这种方式没有数据类型的限制,可以保证两个数据库完全一致。物理Standby Database数据库只能在mount状态下进行恢复,也可以打开,但是只能以只读方式打开,并且打开时不能执行恢复操作。
Ø 逻辑Standby Database:使用Logminer技术,通过把日志内容还原成SQL语句,然后SQL引擎执行这些语句,逻辑Standby Database不支持的数据类型,我们可以通过视图dba_logstdby_unsupported中查看不支持的数据类型。逻辑Standby Database不能保证数据的一致性。
如果是物理Standby Database,使用下面命令启动Real-Time:
如果是逻辑Standby Database,使用下面命令启动Real-Time:
查看是否使用Real-Time Apply:
5、DATA GUARD环境(物理备库)
5.1、手工创建数据库PROD
5.1.1、创建相关文件目录
这里我将PROD和STANDBY库,即PRIMARY DATABASE和STANDBY DATABASE的文件日志创建成功。我建立的目录位置,都是ORACLE默认存放一些文件的默认路径,如果大家使用RAW或磁盘组进行管理的话,那么需要在初始化参数文件中进行指定。
5.1.2、生成密码文件
使用orapwd file=orapwPROD password=oracle entries=5命令进行创建
注:建议这步前面就创建,否则在创建数据库的时候,会提示错误,也会强行断开数据库连接。
5.1.3、生成spfile,编辑spfile参数信息
Ø 直接使用vi initPROD.ora,进行编辑,内容如下:
只需要设置这两个参数,其他参数等我们到nomount状态下,使用spfile文件进行设置即可。
Ø 登陆sqlplus,生成spfile,将数据库启动到nomount状态:
Ø 修改SPFILE参数:
修改完成后,重启数据库,然后将数据库启动到nomount状态:
Ø 创建数据库
Create DataBase例句,可以在ORACLE官方手册中找到:直接查询关键字:creating an oracle database,该文档下的Step7:Issue the CREATE DATABASE Statement,就能找到例句了:
CREATE DATABASEPROD
USER SYS IDENTIFIED BY oracle
USER SYSTEM IDENTIFIED BY manager
LOGFILE GROUP 1 ('/u01/app/oracle/oradata/PROD/redo01.log') SIZE 100M,
GROUP 2 ('/u01/app/oracle/oradata/PROD/redo02.log') SIZE 100M,
GROUP 3 ('/u01/app/oracle/oradata/PROD/redo03.log') SIZE 100M
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 100
MAXINSTANCES 1
DATAFILE '/u01/app/oracle/oradata/PROD/system01.dbf' SIZE 325M REUSE
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '/u01/app/oracle/oradata/PROD/sysaux01.dbf' SIZE 325M REUSE
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE '/u01/app/oracle/oradata/PROD/temp01.dbf' SIZE 20M REUSE
UNDO TABLESPACE undotbs
---该值一定要和init<SID>.ora里面定义的undo_tablespace名称一样,否则创建数据库时会提示错误,大小写也有关系
DATAFILE '/u01/app/oracle/oradata/PROD/undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
注:上述目录一定要事先存在,如果不存在在建库的时候,就会报错,提示无法找到相应的目录文件。
创建过程如下:创建过程中,需要等待一段时间,创建成功后如下图:
创建完数据库后,ORACLE会自动打开该数据库,即OPEN状态。
5.1.4、执行catalog.sql和catproc.sql文件
1. 执行catalog.sql创建数据库所需要使用的数据字典和相关存储过程:
提示以下,表示创建成功:
2. 执行catproc.sql创建各种PL/SQL块的声明,包括过程、函数、数据类型、常量定义、并不是实际的代码:
提示以下,表示创建成功:
需要等待一段时间,创建过程有点长。
做到这里,手工创建数据库就基本OK了,下面就是在该数据库上进行相关操作。
5.2、PRIMARY库参数信息
5.2.1、将PROD置为归档模式,开启force logging模式
Force logging模式,要求oracle无论做什么操作,都记录redolog,这样在DG中会减少数据的丢失。
5.2.2、设置standby_file_management参数
Standb_file_management=auto:该参数表示主库上表空间、数据文件的增加或者删除可以在从库上自动同步。一般建议设置为auto,如果是manual的话,如果主库上的数据文件发生变化,需要手动去在备库上进行对相应数据文件的操作。
5.2.3、设置log_archive_config参数
Log_archive_config:该参数用来控制从远端数据库接收或发送redo数据,通过dg_config属性罗列同一个DATA GUARD中所有DB_UNIQUE_NAME(含PRIMARY数据库和STANDBY数据库),SEND/NOSEND控制是否可以发送,RECEIVE/NORECEIVE属性控制是否能够接收。
5.2.4、设置db_file_name_convert / log_file_name_convert参数
Db_file_name_convert:Standby数据库的数据文件路径与Primary数据库数据文件路径不一致时,可以通过设置该参数的方式,让其自动转换。该参数值是成对出现的,前面是转换前的形式,后面是转换后的形式。
Log_file_name_convert:与上面参数一样使用,只不过这个参数是控制日志文件的。
注:因为这里设置的是PRIMARY数据库的参数,如果是STANDBY数据库,那么这两个参数的值应该是对调的,在后面会列出。
5.2.5、设置fal_server / fal_client参数
Fal_server:指定一个Net服务名,该参数值对应的数据库应为PRIMARY角色,当本地数据库为STANDBY角色时,如果发现存在归档中断的情况,该参数用来指定获取中断的归档文件的服务器。
Fal_client:指定一个Net服务名,该参数值对应的数据库应为STANDBY角色,当本地数据库为PRIMARY角色时,如果发现存在归档中断的情况,该参数用来指定获取中断的归档文件的服务器。
注:PRIMARY数据库的参数,如果是STANDBY数据库,那么这两个参数的值应该是对调的,在后面会列出。
5.2.6、设置log_archive_dest_n参数
Log_archive_dest_n:归档文件的生成路径。Location属性指定的是本地保存归档日志的路径,service属性指定主库中归档日志传送到备库的相应位置。
Valid_for子属性参数:用来指定传输的内容,即发送指定角色生成的指定类型的日志文件,该参数为了确保,一旦发生角色切换操作后,数据库的正常运转。参数两个选项如下:
Rede_log_type:online_logfiles、standby_logfiles、all_logfiles
Database_role:primary_role、standby_role、all_roles
注:因为这里设置的是PRIMARY数据库的参数,如果是STANDBY数据库,那么这两个参数会有一定区别,在后面会列出。
修改以上参数以后,将PROD数据库进行重启,将参数信息写入到spfile,然后生成initPROD.ora文件:
5.2.7、创建备库的controlfile文件
我们可以通过跟踪主库和备库的control信息,来比较主库的control和standby control的区别:
主库控制文件:
< Control Seq=132=0x84, File size=416=0x1a0
< File Number=0, Blksiz=16384, File Type=1CONTROL
---
备库控制文件:
> Control Seq=151=0x97, File size=416=0x1a0
> File Number=0, Blksiz=16384, File Type=4BACKUP CONTROL
这里最大的区别是File Type的不同。
所以备库是物理库,打开的时候数据库是只读状态:
当在主库下创建备库的控制文件后,我们要将备库的控制文件先重新命名,因为我们要用冷备的方式创建备库,具体操作如下:
5.2.8、根据主库SPFILE,创建备库的initSTANDBY.ora
使用PRIMARY的初始化参数文件,创建STANDBY的初始化参数问题
设置STANDBY初始化参数文件,文件最好信息如下:
上面是STANDBY最终的初始化参数问题,红框的和原来PRIMARY的不一样,需要注意。
5.2.9、根据主库密码文件,创建备库的密码文件
这里我们只需要将主库的密码文件进行复制就行,如果主库和备库的密码文件不一致,可能会造成日志传输过程中,被禁止。
5.2.10、将主库数据文件拷贝到备库下,并替换控制文件
首先将主库关闭,然后拷贝数据文件到备库下:
将刚才创建的standby controlfile进行重命名:先要删除原先从主库COPY过来的控制文件
5.2.11、配置TNSNAMES.ORA文件
由于我们是在一台机器上配置DG,为了主备数据库能够正常通信,所以需要在tnsnames.ora中增加上述。然后使用lsnrctl start启动监听。
5.2.12、启动备库,将备库置为恢复模式
备库启动成功。
将备库设置为恢复模式:
在/u01/app/oracle/admin/STANDBY/bdump,使用tail –f alert_STANDBY.log查看告警日志信息:
此时备库已经变为只读模式了。下面我们只要将主库启动,然后进行日志切换,跟踪两边的告警日志,我们就可以知道日志传输是否成功。
5.2.13、启动主库,进行日志切换,跟踪告警日志
主库信息如下:
主库告警日志:
备库信息:
备库告警日志:
红色部分是,当主库进行日志切换时,备库告警日志中,会记录相应信息。
这样手工配置DG就基本结束了!
只要主库不断的切换日志,备库就会根据归档信息,进行数据同步。