dataguard搭建过程
物理Standby和逻辑Standby
1. 物理Standby
Redo Apply: 通过oracle的恢复机制,基于数据库级别应用redo数据,要求数据库在mount状态,不能open。
Read Only: 可以以read only模式打开,以便在standby执行查询等操作,此时虽然还可以接收redo,但无法应用,直到切换回redo apply状态才可以再应用。
Read Write: 可临时性的以read write模式打开,此时日志不传输也不应用,如果设置了flashback area,闪回恢复至read write前状态后,又可以进行redo apply了。
优点:
1) 可保证standby和primary物理级别上的完全一致性。
2) 效率高,因为是使用最底层的块级别上的复制。
缺点:
1) 在与primary同步时,standby不能open,无法分担primary上的负载。
2. 逻辑Standby
SQL Apply: 从redo 日志中提取SQL语句应用,数据库处于open(read write)模式下。
优点:
1) 在与primary同步时,standby处于open状态,可分担primary上部分的查询和报表服务。
缺点:
1) standby和primary的物理结构不一致,且对某些数据和SQL语句有限制。
2) 效率较低,因为是执行SQL语句。
===========================
以上写的都是10中的特性,在11g中,dataguard有了新特性:
物理standby在以read only模式打开的同时,还可以做redo apply,类似于逻辑standby的特点。
下面开始搭建过程:
Oracle Dataguard step by step
1、将DB服务器设置为归档模式,使用以下命令:
Shutdown immediate
Startup mount
Alter database archivelog;
Alter database open;
Archive log list;(查看归档状态)
2、设置DB服务器为force logging模式,使用如下命令;
alter database force logging;
select force_logging from v$database;(查看设置状态)
3、同步密码文件;
Orapwd file=D:\oracle\1120\database\pwdorcl.ora password=orcl10g entries=10
并把新生产的密码文件复制到备库D:\oracle\1020\database\下
4、编辑DB服务器上的D:\oracle\admin\pfile\initorcl.ora文件,添加以下内容:
#Primary Database Primary role Parameters
db_unique_name=production
log_archive_dest_1 = 'location=d:\oracle\admin\archive valid_for=(all_logfiles,all_roles)'
log_archive_dest_2='SERVICE=standby LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=standbydb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=enable
#log_archive_dest_state_2=defer
log_archive_format = %%ORACLE_SID%%T_%TS%S%R.ARC
remote_login_passwordfile=exclusive
#Primary Database Standby role Parameters
fal_server=standby
fal_client=production
#standby_archive_dest='D:\oracle\admin\archive\standby'
standby_file_management=auto
log_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
db_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
注意:归档日志文件(ARC文件)与数据文件(DBF文件)不能存放在同一物理设备上。
5、备份DB服务器上的D:\oracle\1020\network\admin\tnsnames.ora文件
6、编辑DB服务器上的D:\oracle\1020\network\admin\tnsnames.ora文件,添加以下内容:
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = Standby服务器名或IP地址 )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
7、在DB服务器上建立standby日志文件,使用以下命令;
ALTER DATABASE ADD STANDBY LOGFILE 'd\oracle\oradata\stby_redo1.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo2.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo3.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo4.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo5.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo6.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo7.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo8.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo9.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo10.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo11.rdo' SIZE 104857600;
注意:Standby日志文件应建立11组。(要比主库上的redo日志多一组)
以下命令为查看日志状态及数据库状态:
Select member, group# from v$logfile;
Select controlfile_type,open_mode from v$database;
8、在DB服务器上建立standby服务器的控制文件,使用以下命令:
Alter database create standby controlfile as ‘d:\control01.ctl’;
9、在DB服务器及Standby服务器上停止Oracle Service;
shutdown immediate;
10、将DB服务器上的数据库文件拷贝到Standby服务器上;
复制DB服务器数据文件 d:\oracle\oradata 到Standby d:\oracle\oradata
这里采用的是冷备的方式,也可以用rman的duplicate 在线复制
rman target sys/oracle@production auxiliary sys/oracle@standby nocatalog
duplicate target database for standby from active database nofilenamecheck;
11、复制第9步建立的控制文件到Standby服务器
Copy D:\control01.ctl to Standby Server d:\oracle\oradata\control01.ctl
Copy D:\control01.ctl to Standby Server d:\oracle\oradata\control02.ctl
12、在DB服务器上启动oracle
13、备份Standby服务器上的D:\oracle\1020\database\initorcl.ora文件;
14、在Standby服务器编辑D:\oracle\1020\database\initorcl.ora文件,增加以下内容;
#Standby Database standby role parameters
db_unique_name=standby
fal_server=production
fal_client=standby
log_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
db_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
standby_archive_dest='D:\ORACLE\admin\archive\standby' ------该参数在11g中弃用,
standby_file_management=AUTO
# Standby database primary role parameters
log_archive_dest_1 = 'location=d:\oracle\admin\archive valid_for=(all_logfiles,all_roles)'
log_archive_dest_2='SERVICE=production LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=prodb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=defer
#log_archive_dest_state_2=ENABLE
log_archive_format = %%ORACLE_SID%%T_%TS%S%R.ARC
remote_login_passwordfile=exclusive
15、备份Standby服务器上的D:\oracle\1020\network\admin\tnsnames.ora文件
16、在Standby服务器编辑D:\oracle\1020\network\admin\tnsnames.ora文件,增加以下内容:
production =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ‘DB服务器名或IP地址’)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
)
)
17、将Standby服务器上的Oracle用NOMOUNT状态启动;
Shutdown immediate;
Startup nomount;
18、激活Managed recovery Process (MRP),用以下命令: 取消mrp: alter database recover managed standby database cancel;
Alter database mount standby database;
Alter database recover managed standby database disconnect from session;
19、验证tnsname
Tnsping production (在Standby服务器上执行)
Tnsping standby(在DB服务器上执行)
20、在DB服务器和Standby服务器上验证角色状态
Select controlfile_type,open_mode from v$database;
DB 服务器显示如下内容:
Standby显示如下内容:
21、检查日志的传输及应用
在DB服务器上执行如下命令:
Alter system switch logfile;
Archive log list;(注意归档日志序列号)
在Standby服务器上执行如下命令;
Select sequence#,name,applied from v$archived_log;(注意归档日志是否全部应用,归档日志序列是否最后一个)
dataguard --swithover 和failover的说明:
SWITCHOVER
Switchover是有计划的将primary切换为standby,standby切换为primary.在主库结束生产后,备库应用完所有主库archivelog或者redo log后进行切换,不丢失数据。
常用场景:
(1) 有计划的灾备切换演练,如测试灾备站点的可用性,客户端连接等,确保主库发生重大意外时,可以切换至备库正常运转。
(2) 主库长时间的维护升级,如OS升级,DB滚动升级,更换存储,更换OS硬件设备等。
(3) 切换有风险,一般不做切换。
FAILOVER
Failover通常在主库突发故障,短时间无法解决,考虑到备库的可用性,数据丢失的容忍度,迫切需要向外提供数据库服务时进行Failover.
Failover前,如果数据库没有操作在最大保护模式,可能发生数据丢失。
Failover前,需要将准备Failover的备库置于最大性能模式。
Failover前,尽量应用所有的主库重做数据,减少数据丢失。
Failover后,原主库将从DG配置中删除,如果原主库启用了Flashback,则在修复故障后,故障的数据库可恢复为新的standby数据库。
Oracle11.2之前,可以拷贝primary的online redo log到standby做recover,从Oracle11.2开始,Oracle提供了flush redo到standby的功能,当primary不能OPEN时,启动到mount状态,standby redo apply处于激活状态,执行以下语句flush redo到standby,以此来减少数据丢失:
SQL> alter system flush redo to target_db_name;
具体切换过程
①switchover-----无损转换
1、检查primary数据库是否支持切换成standby
SQL>Select switchover_status from v$database;
如果支持则status状态为 To standby 或session active(当前有用户连接)
2、启动switchover
SQL>alter database commit to switchover to standby/physical standby with session shutdown;
3、SQL>shutdown immediate
SQL>startup mount
4、检查standby库是否支持切换
SQL>Select switchover_status from v$database;
如果支持则status状态为 To primary或session active(当前有用户连接)或switchover pending (standby库没有启用redo应用)
如果为switchover pending状态则需要执行启用redo日志应用:
SQL>alter database recover managed standby database disconnect from session;
5、转换角色到primary
SQL>alter database commit to switchover to primary with session shutdown;
SQL>alter database open;
②failover-----会丢失数据
执行failover后原primary库将不再是dataguard中的一部分,所以在执行failover之前,尽可能将原primary库中的redo文件(含联机重做日志文件和归档日志文件)都复制到standby库
1、如果待转换的standby库处于maximum protection模式,需要切换到maximum performence模式
SQL>alter database set standby database to maximum performence;
2、检查归档日志是否连续
查询待转换standby库(原primary)的v$archive_gap,确认归档文件是否连续
SQL>select thread#,low_sequence#,high_sequence# from v$archive_gap;
如果有返回记录,则按照列出的记录号复制对应的归档日志到待转换的standby服务器
文件复制过去后在待转换的standby服务器上执行:
SQL>alter database register physical logfile ‘filespec1’;
3、检查归档文件是否完整
分别在两台服务器上执行:
SQL>select distinct thread#,max(sequence#) over(partition by thread#) a from v$archive_log;
4、启动failover
SQL>alter database recover managed standby database finish force;
5、切换物理standby为primary
SQL>alter database commit to switchover to primary;
6、启动新的primary
如果当前库为mount则直接open,如果为read only,则要先shutdown再open
完!
================================================================================
Standby Redo Log就是在Standby端应用传递Redo Log过程中,逐步执行的online redo log。Standby端虽然也有online redo log,但是在redo apply应用的过程中,是不使用online redo log的。即使是11g Active Data Guard支持apply中读取standby数据,这个操作也是read-only的,并不涉及当前实例redo log的生成(注意是生成)。所以,如果一直是在Standby角色,online redo log是不需要的。
Primary传递过来的redo log信息,是存放在standby redo log组内进行apply的。并且随着主库Primary日志的切换动作而切换。这也就是为什么推荐standby redo log的大小和Primary online redo log的大小保持一致的原因。
Oracle Dataguard提供了三种数据保护模式,上述采用的最大性能模式。
1.最大保护模式
1)这种模式提供了最高级别的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库会自动关闭,防止未受保护的数据出现;
优点:该模式可以保证备库没有数据丢失;
缺点:主库的自动关闭会影响到主库的可用性,同时需要备库恢复后才能提交,对网络等客观条件要求非常的高,主库的性能会因此受到非常大的冲击。
2.最大可用性模式
1)该模式提供了仅次于“最大保护模式”的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库不会关闭,而是临时降低到“最大性能模式”模式,直到问题得到处理;
优点:该模式可以在没有问题出现的情况下,保证备库没有数据丢失,是一种折中的方法;
缺点:在正常运行的过程中缺点是主库的性能受到诸多因素的影响。
3.最大性能模式
1)该模式是默认模式,可以保证主数据库的最高可用性;
2)保证主库运行过程中不受备库的影响,主库事务正常提交,不因备库的任何问题影响到主库的运行;
优点:避免了备库对主数据库的性能和可用性影响;
缺点:如果与主库提交的事务相关的恢复数据没有发送到备库,这些事务数据将被丢失,不能保证数据无损失;
最大保护 | 最大可用 | 最大性能 | |
对主数据库性能影响 | 较高 | 较高 | 低 |
对网络链路要求 | 极高 | 高 | 低 |
备份数据库发生故障 | 主数据库不可用 | 无影响 | 无影响 |
数据保护 | 无数据丢失 | 基本无数据丢失 | 少量数据丢失 |
修改数据保护模式步骤
1)关闭数据库,重启到Mount 状态,如果是RAC,需要关闭所有实例,然后只启动一个实例到mount状态。
2)修改模式:
语法:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE};
如:SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
3) 打开数据库: alter database open;
4) 确认修改数据保护模式:
SQL>select protection_mode,protection_level from v$database;