一、搭建操作
alter databaes recover managed standby database disconnect from session
此时备库是归档日志传输,所以需要在主库进行alter system switch logfile
若再执行一次alter database recover managed standby database disconnect from session.此时数据库的状态为read only with apply.主库传输文件时只需要commit就可以在备库更新数据。因为commit触发写日志LGWR进程,会将操作记录到日志文件。于是触发备库接受日志流文件,备库获取sql文件后,将数据文件进行更新。此时,因为传输的不是归档文件,所以不需要切归档,commit之后就可以在备库更新数据。
alter database recover managed standby database cancel;
二、物理备库与逻辑备库
物理备库
redo apply:将传过来的redo应用到备库的数据块进行更新数据
逻辑备库
sql apply:将传过来的redo转化为SQL语句,备库执行sql进行更新数据
三、三种保护模式
最大保护:保证主备完全一样。zero data loss.事务两边提交完成,才算任务完成。sync 同步
最大可用:和从库连接正常,运行方式等同最大保护模式;和从库失去联系时,切到最大性能,保证主库最大可用 sync
最大性能:主库把归档日志通过arch进程传递给从库,在这种方式下,主库性能最高,但不能保证数据不丢失。可通过手工切换日志的方式减小数据丢失 async
四、备库pfile参数详解
1.与角色无关的参数
1.1
db_unique_name:数据库唯一名。对于物理standby,db_name必须相同,对于逻辑standby,db_name可以不同,在10g中引入db_unique_name参数来区分DG配置中的每个数据库,
1.2
log_archive_config:定义DG配置中包含的DB_UNIQUE_NAME,它为DG提供安全检查:数据库之间的连接时允许的。前后顺序是没有区别的。
例子:
log_archive_config='dg_config=(stephen,standby)'
1.3
log_archive_max_processes:最大归档进程数。默认为2,最大可调为10.若太大,会影响归档切换速度和一致性关闭数据库。遇到归档传输瓶颈,最大建议值,最佳实践值
2 角色相关参数
2.1 log_archive_dest_n
log_archive_dest_n:DG传输redo data的主要参数,还用于指定online redo和standby redo的归档日志文件存储位置。一般用log_archive_dest_1指定本地归档目录,log_archive_dest_2指定DG传输redo data存储目录.
例子:
*.log_archive_dest_1='location=+data/vddb/archivelogfile valid_for=(all_logfiles,all_roles) db_unique_name=vddb' scope=both sid='*';
*.log_archive_dest_2='SERVICE=vddb_st LGWR async valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=vddb_st' scope=both sid='*';
location | 指定归档目录。如location=/u01 |
service | tnsnames.ora文件中设定的指向备端的TNS-Alias |
sync | 同步传输redo。lgwr进程等待来自LNS的确认信息,然后告知客户端事务已经提交。对最大保护模式和高可用模式的DG至少一个standby配置该参数 |
async | 异步传输redo。默认 |
valid_for | 定义何时使用log_archive_dest_n以及作用域重做日志文件的类型。 这个属性有以下值: online_logfile:仅归档online log file时有效 syandby_logfile:仅归档standby log file时有效 all_logfiles:对所有类型的重做日志都有效 primary_role:仅对主角色的数据库有效 standby_role:仅对备角色的数据库有效 all_roles:对任何角色的数据库有效 |
db_unique_name | 数据库唯一名。该值必须同时存在于log_archive_config与log_archive_dest_n参数中,DG间才能互相通信 |
net_timeout | 指定LGWR进程等待LNS进程响应的时间,如果超出时间,将因故障放弃备用,稍后LNS进程发起重新连接,默认30s |
reopen | 控制DG尝试重连备库前的等待时间。默认300s |
compression | 启用redo data压缩 例:log_archive_dest_2='service=standby compression=enable valid_for=(online_logfiles,primary_roles) db_unique_name=standby' |
noaffirm | async默认方式 |
delay | standby接受redo data后,延迟指定秒数再应用 |
alternate | 重定向归档目录。当location中指定的归档满时,用此属性指定的目录代替 |
mandatory | 要求redo data必须传到standby,若无法传输,primary就无法重用redo,若主备断连,当primary遍历完所有的redo log,就会挂起。切勿设置这个属性 |
noregister | standby默认注册传输过来的归档日志,DG无需设置 |
template | 指定archivelog的路径名或者文件名模板。覆盖log_archive_format设定值,若不设置,默认采用log_archive_format。该属性仅对remote归档目标生效 %t:实例线程号 %T实例线程号,填充0 %s:logfile序列号 %T:logfile序列号,填充0 %r:resetlogs ID $R:resetlogs ID,填充0 |
q1:alter system set LOG_ARCHIVE_DEST_1='LOCATION=/arch/db70a VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both sid='*';
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/arch/db70a';
这两个有什么区别?
上面两个参数结果是一样的,valid_for的默认值是(ALL_LOGFILES,ALL_ROLES),scope的默认值是both,sid的默认值是*
q2:alter system set LOG_ARCHIVE_DEST_2='SERVICE=db70b LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db70b' scope=both sid='*';
SERVICE=db70b
主备切换后不起作用
主备库指向
valid for是参数生效条件。service是目标端,通过tnsnames.ora连接到备库,还需要看db_unique_name是否一致。
lgwr是一般情况是一定要写的。
async异步模式。sync同步模式。
noaffirm。不需要在备库确认,主库传输过去就好了。
2.2 log_archive_dest_state_n
与log_archive_dest_n参数配合使用
参数值:
enable:启用log_archive_dest_n
deffer:禁用log_archive_dest_n
ALTERNATE(备用)
|RESET(不用)
alternate:替代参数,指定的归档路径在主目录连接失败后启用。
3 备角色参数
3.1 db_file_name_convert
转换主库的数据文件存储目录到备库指定的目录。若主备库数据存储目录不一致,则必须设置该参数。若有多个目录需要转换,可以此设置。
例子:
DB_FILE_NAME_CONVERT='/oradata/stephen', '/oradata/standby'
DB_FILE_NAME_CONVERT='/oradata/stephen','/oradata/standby','/oradata/primary','/oradata/standby'
DB_FILE_NAME_CONVERT='+DATA/STEPHEN','+DATA/STANDBY'
3.2 log_file_name_convert
转换主库的日志文件存储目录到备库指定的目录。若是主备库日志文件存储目录不一致,必须设置
3.3 fal server 和 fal_client
fal指获取归档日志
值为oracle net service name,即tnsnames.ora中的服务名。
一旦产生gap,fal_client会向fal_server请求gap的archivelog
一般情况下,是备库向主库请求gap的archivelog。故而 fal server设置为主库net service name,fal client设置为备库的net service name. fal server设置为远端数据库的service name, fal client设置为自己的service name
3.5 standby_file_management;该参数仅作用于standby
auto:如primary端添加删除数据文件时,standby会执行相应更改
manual:standby不会自动创建删除数据文件,需要手工执行
standby端更改online redo log时,需要设定参数manual
四、相关进程
1.RFS进程
remotefile server。
standby库接受来自primary库的redo信息并写入standbyredo log中。redo信息有lgwr进程触发。RFS进程是传输的进程,需要和其他进程配合。触发同步有两个方向,一是arch,二是lgwr。若是lgwr触发,是由LNSn(10g前是LGWR进程)进程负责传输redo信息,rfs进程负责接收redo信息写入standby redo log中。若是arch进程触发,即传输归档日志,就是arch进程负责传输,rfs进程负责接收,然后写入指定的归档位置,然后再应用。这里的不同设置决定了参数log_archive_dest_n的不同设置。
2.LNSn进程
lgwr触发以后真正负责传输的进程,包括初始化网络io等功能
3.LGWR进程
主库中将redo buffer中的日志写入redo log中
4.MRP进程
这个进程负责协调介质恢复管理工作,整个Physical Standby就是建立在介质恢复技术上的。
5.LSP进程
逻辑standby,与上面一致,但是多了一步将redo信息转化为sql语句再恢复。
6.arch进程/arcn进程
redo log日志满了,将会触发arch进程将redo log中的数据写入到archive log中
7.PR0x(Parallel Recover Process)进程
这是进行具体恢复工作的进程,如果是Real-Time Apply模式下,这些进程会从Standby Redo Log(SRL)文件中读日志,而在其他模式下,是从归档日志中读取日志然后再进行日志应用工作
五、传输过程详解
主要提供服务一下2种
1)redo传输服务:把primary端的redo日志传输到一个或者多个standby目的地
2)redo应用服务:在standby端应用从primary端传过来的redo日志。
1.使用arcn传输redo
默认情况下使用arcn传输redo日志,
大致过程如下:
1)primary端arc0一旦完成日志切换,arc1就将新生成的归档日志传输到standby端
2)standby端又RFS接受日志,若配置了standby redo log,记录至standby redo log,等standby redo log做log switch形成归档,再应用归档日志做恢复;若没有配置standby redo log,rfs进程接收到日之后,放到standby端归档目录下,standby在应用归档日志做恢复。
2.使用lgwr传输redo日志
使用lgwr和arcn很不一样。它不需要等primary完成日志切换后再传输。
大致过程如下:
1)一旦primary有redo日志产生,lgwr将触发lnsn进程传输redo至standby redo log;这里不能由lgwr直接传输,因为整个数据库实例只有一个lgwr,为了保证主要性能不受影响,不能直接lgwr传输
2)网络传输模式可选择sync和async。sync指primary提交时,必须等redo传输至standby成功后,才返回结果成功。若设置为同步传输,需要设置net_timeout参数,超时无响应,则返回结果错误
async是指primary提交是否成功和日志是否传输成功没有关系,对primary的性能影响最小。
3)standby端的rfs进程把redo写入standby redo log,若是开启了实时应用,就将redo应用至standby数据库,如果没有开始实时应用,等standby redo log归档后再应用到standby数据库。
六、为什么主库要创建standby redo文件,standby redo文件在dataguard中是怎么起作用的
standby redo在备库中的作用是接受主库传输过来的日志文件,以便被rfs进程或者lsp进程应用。
主库中的作用?
主库中standby redo没有作用,standby redo只有在备库中起在线日志文件的作用。主库中·同时创建standby redo是为了做主备切换时主库变被库,日志文件由主库redo变成standby redo文件
七、监控DG试图v$managed_standby字段注解
用于监控各进程的状态,以及归档应用情况
下为主库中v$managed_standby示例
SQL> select process,status,thread#,sequence# from v$managed_standby;
SQL> select process,status,thread#,sequence# from v$managed_standby;
PROCESS STATUS THREAD# SEQUENCE#
------------------ ------------------------ ---------- ----------
DGRD ALLOCATED 0 0
DGRD ALLOCATED 0 0
ARCH CLOSING 1 67
ARCH CLOSING 1 79
ARCH CLOSING 1 68
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CLOSING 1 70
ARCH CONNECTED 0 0
PROCESS STATUS THREAD# SEQUENCE#
------------------ ------------------------ ---------- ----------
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CLOSING 1 72
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CLOSING 1 75
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
PROCESS STATUS THREAD# SEQUENCE#
------------------ ------------------------ ---------- ----------
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CONNECTED 0 0
ARCH CLOSING 1 77
ARCH CLOSING 1 78
ARCH CONNECTED 0 0
ARCH OPENING 1 67
ARCH CONNECTED 0 0
LNS OPENING 1 68
PROCESS STATUS THREAD# SEQUENCE#
------------------ ------------------------ ---------- ----------
DGRD ALLOCATED 0 0
LNS WRITING 1 80
process,进程名,具体详细可见目录四相关进程
sequence#为归档日志序列号
thread区分不同节点
status的参数比较重要
allocated | 正在准备但还未连接到主库 |
attached | 正在连接到主库 |
connected | 已经连接到主库 |
idle | 空闲 |
error | 失败的进程,需要关注 |
receiving | 归档日志接受中 |
opening | 归档日志处理中(上面的例子中arch和lns进程都在处理,说明归档日志和redo日志都在传输与处理) |
closing | 归档日志处理完,正在收尾中 |
writing | 进程在将redo数据写向归档文件中 |
wait_for_log | 等待新的redo归档数据中 |
wait_for_gap | 归档有中断,正在等待中断的那部分redo数据 |
applying_log | 正在应用redo归档数据到备库 |
一般情况下,主库存在lns进程,状态为writing,表明数据正在传输,或者状态为connect,均说明数据发送正常;
备库存在 rfs进程写数据到redo日志,存在mrp进程运用数据,则说明数据库接受数据正常,同时应用数据正常。
八、archive_log试图
本试图包含了归档重做日志文件的信息,如归档文件的名称、归档路径等。
该视图数据来自于控制文件,
一般当一个Online Redologs完成归档后,就会在控制文件中插入一条记录,如果归档目录有多个,则同时插入对应数量的记录,
另外当通过rman恢复归档文件或复制归档文件时,也会插入对应的记录。
通常需要关注的字段有:
name | 记录归档文件路径或名称 | ||||||||||
thread# | 归档线程号,rac环境下适用 | ||||||||||
sequence# | 归档文件序号 | ||||||||||
first_time | 等同于创建时间 | ||||||||||
creator | 该条记录的创建者 creator有以下几种值
| ||||||||||
applied | 是否被应用,dataguard环境适用 | ||||||||||
status | 该条记录的状态 有以下几种值
|
九、dg相关语句试图
1.v$archived_log
可以通过v$archived_log查看归档日志是否一致
DG:
SQL> select thread#, max(sequence#) from v$archived_log where applied='YES' group by thread#;
THREAD# MAX(SEQUENCE#)
---------- --------------
1 79
2 59
RAC:
SQL> select thread#, max(sequence#) from v$archived_log group by thread#;
THREAD# MAX(SEQUENCE#)
---------- --------------
1 81
2 60
2.v$managed_standby
查询状态是否正常,详细见目录7
3.v$database
查询主库DG状态是否正常
SQL> select switchover_status from v$database ;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
4.standby_log
SQL> SELECT GROUP#,THREAD#,sequence#,STATUS,BYTES/1024/1024 M FROM V$STANDBY_LOG;
GROUP# THREAD# SEQUENCE# STATUS M
---------- ---------- ---------- ---------- ----------
4 1 66 ACTIVE 200
5 1 0 UNASSIGNED 200
6 1 0 UNASSIGNED 200
7 0 0 UNASSIGNED 200
十、dg搭建实例
1.a->b->c级联备库搭建
1.1.准备工作:a-b已经搭建完成
db_unique_name | single01_pri | single01_std | single01_std2 |
db_name | single01 | single01 | single01 |
ip | 192.168.1.31 | 192.168.1.32 | 192.168.1.30 |
1.2主库修改参数
alter system set log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)' scope=both;
1.3第一备库修改参数
alter system set log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)' scope=both;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=single01_std2 LGWR ASYNC VALID_FOR=(STNDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=single01_std2';
//这个参数非常重要,lgwr和async都需要写,否则lns进程不能从备库传输数据到级联库
1.4第二备库修改参数
*.DB_UNIQUE_NAME=single01_std2
*.FAL_SERVER=single01_std
*.log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u02/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=single01_std2'
*.LOG_ARCHIVE_DEST_state_1='enable'
1.5主备库创建tnsname.ora
SINGLE01_STD2=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.30)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = single01)
)
)
1.6 级联库rman duplicate复制数据库到级联库
2.主备切换
2.1 主库状态检查
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
2.2 主库将primary转换成standby角色
SQL> alter database commit to switchover to physical standby;
Database altered.
此时数据库由open状态变为关闭状态,若是集群,将会两节点都关闭
2.3 主库重启到mount状态
若是集群,只需要将一个节点mount,另一个节点不动,直到最后切换完成
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1660940984 bytes
Fixed Size 8897208 bytes
Variable Size 1426063360 bytes
Database Buffers 218103808 bytes
Redo Buffers 7876608 bytes
Database mounted.
此时检查数据库状态
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED
2.4 备库检查转换状态
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
2.5 备库更改备库角色为主库角色
SQL> alter database commit to switchover to primary;
Database altered.
此时备库状态为mounted
若是集群从备库切换到主库,则将两节点都为mount状态
SQL> alter database open;
Database altered.
并启动数据库
2.6 检查主库状态
SQL> select name,open_mode,database_role,protection_mode,SWITCHOVER_STATUS From v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
SWITCHOVER_STATUS
--------------------
SINGLE01 READ WRITE PRIMARY MAXIMUM PERFORMANCE
FAILED DESTINATION
2.7 修改主库参数
SQL> alter system set log_archive_dest_2='SERVICE=single01_pri LGWR ASYNC VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=single01_pri';
System altered.
2.8 open备库数据库
SQL> alter database recover managed standby database disconnect from session;
Database altered.
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database open;
Database altered.
应用在线日志文件,并open备库数据库
2.9 应用备库在线日志
SQL> alter database recover managed standby database disconnect from session;
Database altered.
2.10 检查备库状态
SQL> select name,open_mode,database_role,protection_mode,SWITCHOVER_STATUS From v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE SWITCHOVER_STATUS
--------- -------------------- ---------------- -------------------- --------------------
SINGLE01 READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE NOT ALLOWED
SQL> select process,thread#,status from v$managed_standby;
PROCESS THREAD# STATUS
--------- ---------- ------------
ARCH 0 CONNECTED
DGRD 0 ALLOCATED
DGRD 0 ALLOCATED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
PROCESS THREAD# STATUS
--------- ---------- ------------
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
PROCESS THREAD# STATUS
--------- ---------- ------------
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
ARCH 0 CONNECTED
MRP0 1 APPLYING_LOG #说明日志正在应用
PROCESS THREAD# STATUS
--------- ---------- ------------
RFS 1 IDLE
RFS 1 IDLE
RFS 0 IDLE
36 rows selected.
2.11 在主库中向test0728表中插入数据,并在备库中检查数据是否同步
#主库中
SQL> insert into test0728 values (18);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test0728;
X
----------
2
3
4
10
12
16
18
7 rows selected.
#备库1中
SQL> select * from test0728;
X
----------
2
3
4
10
12
16
18
7 rows selected.
#备库2中
SQL> select * from test0728;
X
----------
2
3
4
10
12
16
18
7 rows selected.
至此,主备库成功切换。
2.12 如果一主库,两备库情况下
若是备库指向了新的主库,需要更改db_file_name_convert和log_file_name_convert;
具体做法如下
主备库中检查如下数据
SQL> select member from v$logfile;
MEMBER
---------------------------------------------------------------------------------
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_3_jgzv66xc_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_3_jgzv68pl_.log
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_2_jgzv66wx_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_2_jgzv68pk_.log
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_1_jgzv66wb_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_1_jgzv68r5_.log
/u01/app/oracle/oradata/SINGLE01/standby/redo4_std1.log
/u01/app/oracle/oradata/SINGLE01/standby/redo5_std2.log
/u01/app/oracle/oradata/SINGLE01/standby/redo6_std3.log
/u01/app/oracle/oradata/SINGLE01/standby/redo7_std4.log
SQL> select name from v$datafile;
NAME
----------------------------------------------------------------------------
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_system_jgzv3tk7_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_sysaux_jgzv4mr3_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_undotbs1_jgzv52tf_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_users_jgzv53vx_.dbf
利用主备库中的上述参数,修改如下参数
SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/SINGLE01','/u01/app/oracle/oradata/SINGLE01_STD2' scope=spfile;
System altered.
用相同的方法在备库中修改log_file_name_convert,并重启备库到mount状态,应用日志恢复数据,启到open状态,并再次应用日志恢复数据,到adg状态
2.13 切换总结
重点:
修改主备库角色,重点语句为
alter database commit to switchover to primary;
alter database commit to switchover to physical standby;
修改主库的log_archive_dest_n参数,修改standby_roles为primary_roles,否则数据同步将存在问题
来源:
oracle是arch还是arcn,Oracle]DataGuard之Redo传输详解_猫腻MX的博客-CSDN博客
dataguard中比较重要的进程_weixin_33729196的博客-CSDN博客