[20121227]dataguard下执行延迟recover的问题.txt

简介: [20121227]dataguard下执行recover managed standby database disconnect from session delay 720.txtrecover managed standby database disconnect from session delay 720 ;alter database recover managed standby database disconnect from session delay 720 ;100.31机器,从网络流量看,出现一个很奇怪的情况,流量很大。
[20121227]dataguard下执行recover managed standby database disconnect from session delay 720.txt

recover managed standby database disconnect from session delay 720 ;
alter database recover managed standby database disconnect from session delay 720 ;

100.31机器,从网络流量看,出现一个很奇怪的情况,流量很大。也就是从IP 存储上有大量的物理读(前46week的流量)。
如图:
267265_201212280948211.jpg
(我监测的是服务器,绿色标识in bound,对于IP存储出,也就是从IP存储上读取信息)

如果执行alter  database open read only ;,流量下降下来。

我开始以为SGA设置不合理,检查发现:
SQL> show sga

Total System Global Area 2147483648 bytes
Fixed Size                  2085360 bytes
Variable Size             385879568 bytes
Database Buffers         1744830464 bytes
Redo Buffers               14688256 bytes

SQL> show parameter 32k
NAME                                 TYPE        VALUE
------------------------------------ ----------- -----
db_32k_cache_size                    big integer 256M

--应该是正常,也是db_32k_cache_size设置小一点,设置为512M。

recover managed standby database disconnect from session delay 720 ;

top -c 观察,隔一段时间出现在前面:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19628 oracle    15   0 2221m  37m  16m S  1.0  0.9   0:00.67 ora_mrp0_icarestd

使用strace跟踪发现:
$ strace -p 19628 -t -e pread  -o /tmp/aa1
....
15:05:48 pread(17, "\25\302\0\0\260\3\0\0\35\312\23\0\377\377\1\4\212\245\0"..., 49152, 137101312) = 49152
15:05:48 pread(17, "\25\302\0\0\307\1\0\0\257\311\23\0\377\377\1\4\346\r\0"..., 16384, 126861312) = 16384
15:05:48 pread(18, "\25\302\0\0\310\1\0\0\260\311\23\0\377\377\1\4\303\r\0"..., 16384, 229507072) = 16384
15:05:53 pread(17, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\24\232\0\0\0\0\0\0"..., 16384, 125845504) = 16384
15:05:53 pread(17, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\24\232\0\0\0\0\0\0"..., 16384, 429932544) = 16384
--通过偏移确定读取什么有一些困难。
....
lrwx------  1 oracle oinstall 64 Dec 10 15:07 17 -> /dev/raw/raw1
lrwx------  1 oracle oinstall 64 Dec 10 15:07 18 -> /dev/raw/raw2

$ cut -f1 -d' ' /tmp/aa1 | uniq -c
    212 15:05:48
    164 15:05:53
     48 15:05:54
    212 15:05:59
    212 15:06:04
     69 15:06:09
    143 15:06:10
--基本上间隔5秒,读/dev/raw/raw[12].

--过滤^15:05:59。
$ grep '^15:05:59'  /tmp/aa1  | cut -f2 -d '=' > /tmp/aa2
$ wc -l /tmp/aa2
212 /tmp/aa2

--后面写入211个+,并且加入pq
$ cat /tmp/aa2 | dc
20267008

--读取了 20267008/1024/1024=19.328125M,分摊到5秒的时间内,确实正好4M上下。基本和流量图一致。

#  dstat -n -N eth1,eth0,total 1 100
--net/eth1----net/eth0---net/total-
 recv  send: recv  send: recv  send
   0     0 :   0     0 :   0     0
  20M 5043k:2545k   64k:  22M 5108k
   0     0 :   0     0 :   0     0
  19k   81k:  24k 2168B:  44k   83k
   0     0 :   0     0 :   0     0
5634B  108k:  60k 6982B:  66k  114k
   0     0 :   0     0 :   0     0
  20M  161k:  17k 2524B:  20M  164k
   0     0 :   0     0 :   0     0
  17k   37k: 958B  624B:  18k   38k
   0     0 :   0     0 :   0     0
  11M  109k:  29k 2232B:  11M  111k
   0     0 :   0     0 :   0     0
9227k   89k:4685B  962B:9231k   90k
   0     0 :   0     0 :   0     0
  27k  297k: 144k   12k: 172k  309k
   0     0 :   0     0 :   0     0
  20M  254k:  82k 3384B:  20M  257k
   0     0 :   0     0 :   0     0
  18k   43k:3890B  962B:  22k   43k
   0     0 :   0     0 :   0     0
--基本验证。注意查看eth1网卡的流量。

#  dstat -d -D sda,sdb,total 1 100
--dsk/sda-----dsk/sdb----dsk/total-
 read  writ: read  writ: read  writ
 252B   13k:6134B   11k:6387B   24k
   0     0 :   0    59k:   0    59k
   0     0 :  16k   37k:  16k   37k
   0     0 :   0     0 :   0     0
   0     0 :  19M  481k:  19M  481k
   0   168k:  16k   62k:  16k  230k
   0     0 :   0   108k:   0   108k
   0     0 :   0    18k:   0    18k
   0     0 :  16k   46k:  16k   46k
   0     0 :  16M 9216B:  16M 9216B
   0     0 :3568k   18k:3568k   18k
   0     0 :  16k   58k:  16k   58k
   0     0 :   0  4096B:   0  4096B
   0     0 :   0    14k:   0    14k
   0     0 :  16k   40k:  16k   40k
   0     0 :  19M 5120B:  19M 5120B
   0     0 :   0    40k:   0    40k
   0     0 :  16k   47k:  16k   47k
   0     0 :   0     0 :   0     0
   0     0 :  12M  132k:  12M  132k
   0     0 :  48M   32k:  48M   32k
   0     0 :   0   168k:   0   168k
   0     0 :   0    14k:   0    14k
   0     0 :  16k  180k:  16k  180k
   0    16k:   0  4096B:   0    20k
   0     0 :5776k  153k:5776k  153k
   0     0 :  14M   36k:  14M   36k
   0     0 :   0  5120B:   0  5120B
   0     0 :   0    78k:   0    78k
   0     0 :  16k   80k:  16k   80k
   0     0 :   0   176k:   0   176k

--问题是不知道mrp进程到底读取什么????

 
分析过程:
$ man pread
PREAD(2)  Linux Programmer's Manual                                PREAD(2)

NAME
       pread, pwrite - read from or write to a file descriptor at a given offset

SYNOPSIS
       #define _XOPEN_SOURCE 500

       #include

       ssize_t pread(int fd, void *buf, size_t count, off_t offset);

       ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);


--第1个是句柄,第2个参数缓存地址指针,第3个是读取长度,第4个是偏移量。

单独看两个:

15:05:48 pread(17, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\24\232\0\0\0\0\0\0"..., 16384, 125845504) = 16384
15:05:48 pread(17, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\24\232\0\0\0\0\0\0"..., 16384, 429932544) = 16384

125845504/1024/1024=120.015625
429932544/1024/1024=410.015625
0.015625*1024*1024=16384 --??

SQL> column path format a40
SQL> select DISK_NUMBER,GROUP_NUMBER,PATH from v$asm_disk where GROUP_NUMBER=1 and DISK_NUMBER in(1,0);

DISK_NUMBER GROUP_NUMBER PATH
----------- ------------ ----------------------------------------
          0            1 /dev/raw/raw1
          1            1 /dev/raw/raw2

--可以确定文件句柄对应的是17对应的DISK_NUMBER=0.

SQL> SELECT disk_kffxp, au_kffxp, xnum_kffxp,GROUP_KFFXP,NUMBER_KFFXP  FROM x$kffxp  WHERE (au_kffxp=120 or  au_kffxp=410) and disk_kffxp=0;

DISK_KFFXP   AU_KFFXP XNUM_KFFXP GROUP_KFFXP NUMBER_KFFXP
---------- ---------- ---------- ----------- ------------
         0        120          0           1         1805
         0        410          0           1         2011

asmcmd看:

ls -l
Type         Redund  Striped  Time             Sys  Name
CONTROLFILE  UNPROT  FINE     DEC 10 08:00:00  Y    current.1805.772818275
CONTROLFILE  UNPROT  FINE     DEC 10 08:00:00  Y    current.2011.772818275
--从这里也可以确定文件号1805,2011.
--做如下查询:

SQL> column type format a12
SQL> select * from v$asm_file where TYPE'ARCHIVELOG' and  TYPE'AUTOBACKUP' and TYPE='CONTROLFILE' order by type;

GROUP_NUMBER FILE_NUMBER COMPOUND_INDEX INCARNATION BLOCK_SIZE     BLOCKS      BYTES      SPACE TYPE         REDUNDANCY   STRIPED      CREATION_DATE       MODIFICATION_DATE   RE
------------ ----------- -------------- ----------- ---------- ---------- ---------- ---------- ------------ ------------ ------------ ------------------- ------------------- --
           1        1805       16779021   772818275      16384       3081   50479104   58720256 CONTROLFILE  UNPROT       FINE         2012-01-17 15:44:34 2012-12-10 08:00:00 U
           1        2011       16779227   772818275      16384       3081   50479104   58720256 CONTROLFILE  UNPROT       FINE         2012-01-17 15:44:35 2012-12-10 08:00:00 U

--再次证明读取的地方是控制文件。

--再拿这个来看看:
15:05:48 pread(18, "\25\302\0\0(\0\0\0)w\35\0\377\377\1\4Iz\0\0\0\0008\0\0"..., 16384, 233832448) = 16384
15:05:48 pread(18, "\25\302\0\0\304\3\0\0\351\310\23\0\377\377\1\4\2537\0\0"..., 16384, 237961216) = 16384

233832448/1024/1024=223
237961216/1024/1024=226.9375

SQL> SELECT disk_kffxp, au_kffxp, xnum_kffxp,GROUP_KFFXP,NUMBER_KFFXP  FROM x$kffxp  WHERE (au_kffxp=223 or  au_kffxp=226) and disk_kffxp=1;

DISK_KFFXP   AU_KFFXP XNUM_KFFXP GROUP_KFFXP NUMBER_KFFXP
---------- ---------- ---------- ----------- ------------
         1        223          5           1         1805
         1        226          8           1         1805

--可以再次确定读取的就是控制文件。

--如果拿一台使用文件系统做dataguard看,也很容易确定读取的就是控制文件。但是如果使用dstat -d -D观察,发现使用文件系统并没
--有读操作。这是由于使用文件系统有一定的缓存,dstat根本监测到磁盘读操作,基本在内存进行。而asm使用裸设备,没有文件系统的
--缓存,导致在这样延迟日志使用的模式下要每隔5秒读取控制文件,出现大量的磁盘读取操作(注:当然一些存储自身带有缓存,也许
--根本没有读取磁盘)。

总结:
可以看出在使用recover managed standby database disconnect from session delay 720 ,会每隔5秒读取控制文件,如果使用的是文件系统,
由于文件系统有一定的缓存。dstat,iostat几乎看不见磁盘读取操作,而使用asm的磁盘就不同了。由于没有文件系统的缓存,基本是直接读取磁
盘设备,读取的大小与congtrol文件保存的东西有关。我们的数据库每次多达19M,这样从cacti流量图看,几乎掩盖了其他磁盘操作,导致看到的
流量图会很平,而且流量很大。





 

fj.pngsnap.jpg

目录
相关文章
|
弹性计算 网络协议 容灾
PostgreSQL 时间点恢复(PITR)在异步流复制主从模式下,如何避免主备切换后PITR恢复(备库、容灾节点、只读节点)走错时间线(timeline , history , partial , restore_command , recovery.conf)
标签 PostgreSQL , 恢复 , 时间点恢复 , PITR , restore_command , recovery.conf , partial , history , 任意时间点恢复 , timeline , 时间线 背景 政治正确非常重要,对于数据库来说亦如此,一个基于流复制的HA架构的集群,如果还有一堆只读节点,当HA集群发生了主备切换后,这些只读节点能否与新的主节点保持
1653 0
|
弹性计算 容灾 关系型数据库
PostgreSQL PITR 任意时间点恢复过程中如何手工得到recovery需要的下一个WAL文件名 - 默认情况下restore_command自动获取
标签 PostgreSQL , recovery , recovery.conf , restore_command , timeline , 时间线 , next wal , PITR , 时间点恢复 背景 PostgreSQL数据库支持PITR时间点恢复。默认情况下,只需要配置目标是时间点,resotre_command即可,PG会自动调用resotre_command去找需要的WA
1360 0
|
数据库 SQL 关系型数据库
|
SQL Oracle 关系型数据库
|
SQL 关系型数据库 MySQL
|
Oracle 关系型数据库 数据库
|
Oracle 关系型数据库