redo传输&进程
一.arcn传送redo数据
primary这样的设置:
*.log_archive_dest_1='location=G:\archivelog valid_for=(all_logfiles,all_roles) db_unique_name=xh'
*.log_archive_dest_2='service=standby1 valid_for=(online_logfiles,primary_role) db_unique_name=standby1'
这是一种默认设置表示使用arcn进程来归档日志文件并传输到standby(只支持最大性能模式)
SQL> select PROTECTION_MODE from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PERFORMANCE
具体使用arcn 进程的过程为:
1.primary 事务产生redo 写在log buffer里,由lgwr写入 online log file
2.primary的 arc0进程在发生归档时,将归档数据写到log_archive_dest_1这个本地归档位置
3.primary的 arc1进程同时将归档数据写到log_archive_dest_2这个远程归档位置
4.standby rfs进程将redo写到 standby redo logfile中
6.standby的 arch进程将standby redo logfile中 数据归档
7.standby的 mrp(重做应用) or lsp(sql应用)进程应用这些归档中那个redo到 standby database
SQL> select program from v$process where program like '%ARC%';(primary)
PROGRAM
----------------------------------------------------------------
ORACLE.EXE (ARC0)
ORACLE.EXE (ARC1)
SQL> select process,client_process from v$managed_standby;(standby)
PROCESS CLIENT_P
--------- --------
ARCH ARCH
ARCH ARCH
MRP0 N/A~*********************负责应用redo的进程
RFS UNKNOWN~~~~~~~~~~负责接收primary arc1进程传输数据的进程
rfs对应的 client_process 为unknown表示用的arch (log_archive_dest_n='service=xx arch) lgwr,表示用的LGRW
二.lgwr来传送redo数据
primary中设*.log_archive_dest_2='service=standby1 lgwr valid_for=(online_logfiles,primary_role) db_unique_name=standby1'
LGWR中又分sync(默认),async
lgwr sync情况过程:
1.primary 事务产生redo lgwr将log buffer中数据 写入online log file 然后由primary arcn归档到log_archive_dest_1,另外lgwr写 online log file同时 将redo数据发给primary 中LNSN进程(LGWR Network Server process)
2.lnsn通过oracle net 将redo传给 standby 的rfs进程,rfs进程 将redo 写入 standby redo log files
3.primary 中事务会一直处于未提交状态直到standby全部接收完毕
4.primary switch logfile,将触发standby log file切换(启动 standby arcn 进程)
5.此时允许实时应用,LSP(SQL应用)或mrp(重做应用)去执行.
lgwr async情况过程
1.primary 事务产生redo lgwr将log buffer中数据 写入online log file 然后由primary arcn归档到log_archive_dest_1
2.当primary online log file 收到redo后 lnsn进程启动
3.lnsn通过oracle net 将redo传给 standby 的rfs进程,rfs进程 将redo 写入 standby redo log files
4.primary 中事务会一直处于未提交状态直到standby全部接收完毕
5.primary switch logfile,将触发standby log file切换(启动 standby arcn 进程)
6.此时允许实时应用,LSP(SQL应用)或mrp(重做应用)去执行.
关于日志传输中断
自动解决:
当由于网络问题,造成日志传不到standby,不用手动干涉,oracle primary database会每分钟都检查standby 查看archive log 是否有中断(通过sequence#判断),若发现有中断oracle使用 FAL(fetch archive log)来解决这个问题
处理机制
1.fal自动检查并获取在primary生成的archive log
2.当standby接受archive log有问题时候,fal 能解决当standby还没应用时,但存在standby的archive log被删除,standby 存archive log的disk不能用,standby 收到的archive log被替换
SQL> select count(*) from v$archived_log;(primary)
COUNT(*)
----------
77
SQL> select count(*) from v$archived_log;(standby)
COUNT(*)
----------
37
SQL> shutdown immediate; (standby)
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> / (primary)
系统已更改。
SQL> select count(*) from v$archived_log;(primary)
COUNT(*)
----------
79
SQL> startup (standby)
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 79692480 bytes
Database Buffers 201326592 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> / (primary) 过一会primary自动有产生了archived log
COUNT(*)
----------
84
SQL> / (standby)的fal机制自动都补上了
COUNT(*)
----------
42
standby archive log 物理丢失
SQL> alter database recover managed standby database cancel;
数据库已更改。
SQL> select name,applied from v$archived_log;
E:\STANDBY\ARCHIVE\ARC00045_0701872237.001 YES
E:\STANDBY\ARCHIVE\ARC00046_0701872237.001 YES
已选择46行。 (standby的情况 都应用了)
SQL> select * from t1;(primary)
A
----------
1
2
3
9999
6666
8888
5555
7777
已选择8行。
SQL> select current_scn from v$database;(primary)
CURRENT_SCN
-----------
962213
SQL> insert into t1 values(4444);(primary)
已创建 1 行。
SQL> commit;(primary)
提交完成。
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> select name from v$archived_log where 962213 between FIRST_CHANGE# and NEXT (primary)
_CHANGE# ;
NAME
--------------------------------------------------------------------------------
G:\ARCHIVELOG\ARC00047_0701872237.001
standby1
SQL> select current_scn from v$database; (primary)
CURRENT_SCN
-----------
962324
SQL> insert into t1 values(123456); (primary)
已创建 1 行。
SQL> commit; (primary)
提交完成。
SQL> alter system switch logfile; (primary)
系统已更改。
SQL> select name from v$archived_log where 962324 between FIRST_CHANGE# and NEXT (primary)
_CHANGE# ;
NAME
--------------------------------------------------------------------------------
G:\ARCHIVELOG\ARC00048_0701872237.001
standby1
可以看到insert 4444在 ARC00047_0701872237.001 ,123456在ARC00048_0701872237.001
SQL> select name,applied from v$archived_log; (standby)
E:\STANDBY\ARCHIVE\ARC00047_0701872237.001 NO
E:\STANDBY\ARCHIVE\ARC00048_0701872237.001 NO
已选择48行。
SQL> host del E:\STANDBY\ARCHIVE\ARC00047_0701872237.001 (standby)
SQL>
SQL> alter database recover managed standby database disconnect from session; (standby)
数据库已更改。
SQL> select name,applied from v$archived_log; (standby)
E:\STANDBY\ARCHIVE\ARC00047_0701872237.001 NO
E:\STANDBY\ARCHIVE\ARC00048_0701872237.001 YES
E:\STANDBY\ARCHIVE2\ARC00047_0701872237.001 YES*****重新复制了一个 损坏的archive log
已选择49行。
看下standby 的archive log信息 (standby)
Media Recovery Log E:\STANDBY\ARCHIVE\ARC00047_0701872237.001
Error opening E:\STANDBY\ARCHIVE\ARC00047_0701872237.001
Attempting refetch
Media Recovery Waiting for thread 1 sequence 47
Fetching gap sequence in thread 1, gap sequence 47-47
可以看到standby 的fal机制,对这个损坏的archived log进行 media recovery
SQL>
SQL> show parameter standby_archive_ (standby)
NAME TYPE VALUE
------------------------------------ ----------- ----------------------------
standby_archive_dest string e:\standby\archive2
SQL> alter database recover managed standby database cancel; (standby)
数据库已更改。
SQL> alter database open; (standby)
数据库已更改。
SQL> select * from t1;(standby)
A
----------
1
2
3
9999
6666
8888
5555
7777
4444
123456 *********************
已选择10行。
另外 采用alter database open (standby) 此时oracle判断是physical standby read only
standby alert.log中 出现大量
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:39:04 2009
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:40:07 2009
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:41:10 2009
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:42:13 2009
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:43:16 2009
ksvcreate: Process(m000) creation failed
Fri Nov 06 11:44:19 2009
ksvcreate: Process(m000) creation failed
查询是一个Bug 5583049
Doc ID: 418553.1
Applies to:
Oracle Server - Enterprise Edition - Version: 10.2 to 10.2
This problem can occur on any platform.
Symptoms
Switching a Physical Standby Database multiple to READ ONLY Mode will report the following Errors in the ALERT.LOG:
ksvcreate: Process(m000) creation failed
Changes
Switch Physical Standby from READ ONLY to apply and back to READ ONLY.
Cause
The Cause of this Problem has been identified in Bug 5583049.
Solution
There are two Workarounds available:
Restart the Instance..
or
Disable ADDM - Should be re-enabled if Standby takes up the Primary Role
* Set SGA_TARGET=0 and set shared_pool_size, db_cache_size, etc if using
Automatic SGA Memory Management (ASMM)
* Set STATISTICS_LEVEL=BASIC to disable statistics gathering
References
Bug 5583049 - 'KSVCREATE: PROCESS(M000) CREATION FAILED' AFTER STANDBY OPEN RO MULTIPLE TIMES
Keywords
READ-ONLY; STANDBY~DATABASE; PHYSICAL~STANDBY;
--------------------------------------------------------------------------------
Help us improve our service. Please email us your comments for this document. .
手动中断解决
SELECT * FROM V$ARCHIVE_GAP;(standby)
standby上进行查询 返回的话表示 存在中断
SQL> desc v$archive_gap;
名称 是否为空? 类型
----------------------------------------- -------- -------------------------
THREAD# NUMBER
LOW_SEQUENCE# NUMBER
HIGH_SEQUENCE# NUMBER
根据信息在primary v$archived_log中确定中断 的archived log
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=XX AND DEST_ID=XXX
2> AND SEQUENCE# BETWEEN XX AND XXX;
手动复制到standby achived log dest
ALTER DATABASE REGISTER LOGFILE 'xxxxxxxxx'进行手工注册
确定日志是否传送到standby
primary执行
1 SELECT LOCAL.THREAD#, LOCAL.SEQUENCE# FROM
2 (SELECT THREAD#, SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=1)
3 LOCAL WHERE
4 LOCAL.SEQUENCE# NOT IN
5 (SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=2 AND
6* THREAD# = LOCAL.THREAD#)
SQL> /
未选定行
以上可以查到 dest_1位置存在的归档 不再dest_2位置的,既 没有传送到standby的
SQL> col dest_name format a30
SQL> select dest_id ,dest_name,db_unique_name from v$archive_dest;(primary)
DEST_ID DEST_NAME DB_UNIQUE_NAME
---------- ------------------------------ ------------------------------
1 LOG_ARCHIVE_DEST_1 xh
2 LOG_ARCHIVE_DEST_2 standby1
3 LOG_ARCHIVE_DEST_3 NONE
4 LOG_ARCHIVE_DEST_4 NONE
5 LOG_ARCHIVE_DEST_5 NONE
6 LOG_ARCHIVE_DEST_6 NONE
7 LOG_ARCHIVE_DEST_7 NONE
8 LOG_ARCHIVE_DEST_8 NONE
9 LOG_ARCHIVE_DEST_9 NONE
10 LOG_ARCHIVE_DEST_10 NONE
已选择10行。
SQL> SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG GROUP BY (primary)
2 THREAD#;
MAX(SEQUENCE#) THREAD#
-------------- ----------
48 1
在 primary确定最新的 archived_log
***********************
standby archive log
设置一个归档延迟应用
log_archive_dest_n 中delay属性
SQL> show parameter log_archive_dest_2(primary)
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string service=standby1 valid_for=(on
line_logfiles,primary_role) db
_unique_name=standby1
SQL> select status,database_mode,recovery_mode from v$archive_dest_status;(standby)
STATUS DATABASE_MODE RECOVERY_MODE
--------- --------------- -----------------------
VALID MOUNTED-STANDBY IDLE~~~~~~~~~~~~~~~~~~~~~~~~~可以看到 standby 目前为idle 未启动恢复
VALID MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
INACTIVE MOUNTED-STANDBY IDLE
VALID MOUNTED-STANDBY IDLE
已选择11行。
SQL> alter database recover managed standby database disconnect from session;(standby 开启恢复模式 收到archive log后就 马上应用)
SQL> select status,database_mode,recovery_mode from v$archive_dest_status;;(standby)
STATUS DATABASE_MODE RECOVERY_MODE
--------- --------------- -----------------------
VALID MOUNTED-STANDBY MANAGED~~~~~~~~~~~~~变为管理状态
VALID MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
INACTIVE MOUNTED-STANDBY MANAGED
VALID MOUNTED-STANDBY MANAGED
已选择11行。
SQL> insert into t1 values(9999);(primary)
已创建 1 行。
SQL> commit;(primary)
提交完成。
SQL> alter system switch logfile ;(primary)
系统已更改。
SQL> alter system checkpoint;(primary)
系统已更改。
SQL> select applied from v$archived_log;(standby)
YES
YES
YES
YES
YES~~~~~~~~~~~~~~~~~~~~~~~~应用了
已选择29行。
SQL> alter database recover managed standby database cancel;(standby)
数据库已更改。
SQL> alter database open(standby)
2 ;
数据库已更改。
OPEN_MODE
----------
READ ONLY~~~~~从这可以看出来 虽然 未使用alter database open read only,oracle自动判断是个physiacl standby只能read only打开
SQL> select * from t1;(standby)
A
----------
1
2
3
9999******************
可以看到standby现在收到archive log 就应用 这是由于primary log_archive_dest_2中 service=standby1 默认是nodelay属性
SQL> alter system set log_archive_dest_2='service=standby1 delay valid_for=(on (primary设置了delay默认 30分钟)
ne_logfiles,primary_role) db_unique_name=standby1';
系统已更改。
SQL> insert into t1 values(6666);(primary)
已创建 1 行。
SQL> commit;(primary)
提交完成。
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> alter database recover managed standby database disconnect from session;(standby)
数据库已更改。
SQL> select applied from v$archived_log;(standby)
YES
YES
YES
NO~~~~~没有应用这个最新的
已选择30行。
查看standby alert.log
Wed Nov 04 17:06:15 2009
idle dispatcher 'D000' terminated, pid = (13, 1)~~~~DBWN进程空闲的,没执行
SQL> alter database recover managed standby database disconnect from session nod (standby)
elay;
alter database recover managed standby database disconnect from session nodelay
*
第 1 行出现错误:
ORA-01153: 激活了不兼容的介质恢复
SQL> alter database recover managed standby database cancel;~~~要先推一下恢复模式
数据库已更改。
SQL> alter database recover managed standby database disconnect from session nod (standby 加nodelay进入)
elay;
数据库已更改。
SQL> select applied from v$archived_log;
YES
YES
YES
YES
YES
YES~~~~~~~~~~~~~~~~~~~~~`应用最新的archive log了
已选择30行。
SQL> alter database recover managed standby database cancel;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> select * from t1;
A
----------
1
2
3
9999
6666~~~~~~~~~~~~~~~~~~~~~~OK了
**********************************
关于standby上archived 生成存储问题
现在standby上 改下所有路径
SQL> show parameter log_archive_dest_1
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string location=e:\standby\archive va
lid_for=(all_logfiles,all_role
s) db_unique_name=standby1
SQL> show parameter standby_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_archive_dest string e:\standby\archive
SQL> show parameter db_rec
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string e:\standby\archive
SQL> host mkdir e:\standby\archive2
SQL> host mkdir e:\standby\archive3
SQL> alter system set standby_archive_dest='e:\standby\archive2';
系统已更改。
SQL> alter system set db_recovery_file_dest='e:\standby\archive3';
系统已更改。
SQL> select * from v$standby_log;(standby 上 没有 standby log file)
未选定行
SQL> select count(*) from v$archived_log;(standby ,现在有 33个归档)
COUNT(*)
----------
33
已选择33行。
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> select name,creator,applied from v$archived_log;(standby)
NAME CREATOR APP
------------------------------------------------------------ ------- ---
E:\STANDBY\ARCHIVE2\ARC00035_0701872237.001 ARCH NO
已选择34行。
可以看到最新的这个归档使用的是 standby_archive_dest的位置
SQL> alter system set standby_archive_dest='';
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> select name,creator,applied from v$archived_log;(standby)
NAME CREATOR APP
------------------------------------------------------------ ------- ---
E:\STANDBY\ARCHIVE2\ARC00035_0701872237.001 ARCH NO
已选择34行。
看下standby 的alter
Errors in file e:\standby\udump\standby1_rfs_2412.trc:
ORA-16032: parameter STANDBY_ARCHIVE_DEST destination string cannot be translated
过了几分钟再查询
/
E:\STANDBY\ARCHIVE\ARC00036_0701872237.001 ARCH NO 收到最新的archive log了,位置在 standby 的 log_archive_dest_1
已选择35行。
看下standby alert.log
Using STANDBY_ARCHIVE_DEST parameter default value as e:\standby\archive
Redo Shipping Client Connected as PUBLIC
-- Connected User is Valid
RFS[2]: Assigned to RFS process 780
RFS[2]: Identified database type as 'physical standby'
RFS[2]: Archived Log: 'E:\STANDBY\ARCHIVE\ARC00036_0701872237.001
从上面可以看 到 oracle自己尝试将standby_archive_dest目录 改为log_archive_dest_1中目录
SQL> alter system set log_archive_dest_1='' scope=spfile;(standby)
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 79692480 bytes
Database Buffers 201326592 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> select name,creator,applied from v$archived_log;(standby)
E:\STANDBY\ARCHIVE3\STANDBY1\ARCHIVELOG\2009_11_05\O1_MF_1_3 ARCH NO
7_5H4JCJDP_.ARC
已选择36行。
可以发现建立在 闪回恢复区位置了
从standby alert.log看下oracle自己的操作过程
Using STANDBY_ARCHIVE_DEST parameter default value as USE_DB_RECOVERY_FILE_DEST
Redo Shipping Client Connected as PUBLIC
-- Connected User is Valid
RFS[1]: Assigned to RFS process 2680
RFS[1]: Identified database type as 'physical standby'
Thu Nov 05 11:04:02 2009
RFS LogMiner: Client disabled from further notification
Thu Nov 05 11:07:28 2009
RFS[1]: No standby redo logfiles created
RFS[1]: Archived Log: 'E:\STANDBY\ARCHIVE3\STANDBY1\ARCHIVELOG\2009_11_05\O1_MF_1_37_5H4JCJDP_.ARC'
简单总结no standby redo logfile时 archive log存standby_file_dest如果没有 则尝试存log_file_archive_dest_n,如果没有则尝试存db_recover_file_dest
有standby redo logfile时情况
SQL> alter system set standby_archive_dest= 'e:\standby\archive2'; (standby)
系统已更改。
SQL> alter system set log_archive_dest_1='location=e:\standby\archive valid_for= (standby)
(all_logfiles,all_roles) db_unique_name=standby1' scope=spfile;
系统已更改。
SQL> alter database add standby logfile group 4 'e:\standby\datafile\redo04.log' (standby)
size 10m;
数据库已更改。
SQL> col member format a30
SQL> select group#,member from v$logfile; (standby)
GROUP# MEMBER
---------- ------------------------------
3 E:\STANDBY\DATAFILE\REDO03.LOG
2 E:\STANDBY\DATAFILE\REDO02.LOG
1 E:\STANDBY\DATAFILE\REDO01.LOG
4 E:\STANDBY\DATAFILE\REDO04.LOG
SQL> select group#,status from v$log;(standby)
GROUP# STATUS
---------- ----------------
1 CLEARING
2 CLEARING_CURRENT
3 CLEARING
SQL> select group#,dbid,thread#,status from v$standby_log; (standby)
GROUP# DBID THREAD# STATUS
---------- ---------------------------------------- ---------- ----------
4 UNASSIGNED 0 UNASSIGNED
shutdown immediate;(standby)
startup ;(standby)
SQL> alter system switch logfile;(primary)
系统已更改。
SQL> select name,creator,applied from v$archived_log;(standby)
E:\STANDBY\ARCHIVE\ARC00038_0701872237.001 ARCH NO
已选择37行。
添加standby log file后 归档位置为 standby 的 log_archive_dest_1,表示到了本地归档位置, 表示STANDBY的 RFS进程将redo(来自primary)写入standby log file,再有standby 的arcn进程 归档到本地位置
,如果没有standby logfile那么将 RFS进程 直接写入standby_archive_dest
从standby的alert.log可以看到上面的过程
standby 的alert.log信息
Fri Nov 06 10:50:17 2009
RFS[1]: Allowing overwrite of partial archivelog for thread 1 sequence 42
RFS[1]: Archived Log: 'E:\STANDBY\ARCHIVE2\ARC00042_0701872237.001'~~~~~~~~没有standby log file时候
...................................
Sun Nov 08 13:01:12 2009
RFS[1]: Successfully opened standby log 4: 'E:\STANDBY\DATAFILE\REDO04.LOG'~~~~~有standby log file时
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12020513/viewspace-619713/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12020513/viewspace-619713/