OGG复制进程延迟高,优化方法一(使用索引)
日常运维过程中,可能发现OGG同步进程延迟很高;
本篇介绍其中的一种方式。
OGG复制进程,或者说同步进程及通过解析ogg trail文件,输出dml语句,在目标库执行dml操作,那么延迟高可能性其一、执行dml操作效率太低。 本篇不考虑并发过高或其它原因。 本次只考虑是执行update or delete的时候SQL效率执行太差!
导致OGG复制进程延迟很高。
GGSCI > info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING REPLICAT RUNNING RP10 :: ::
延迟说明参考
https://www.onekbit.com/ViewBlog/blog/BID20200408100342
一 、Time Since Checkpoint 过高
指ogg的extract或replicat进程产生最近的一个检查点,再从这个检查点到目前为止有多长时间没有更新了,即最近一个检查点与当前系统时间的时间差。该值可以通过info看到是在不断变化(特别是当处理长会话时,会持续增长,直到处理完该长会话)。
对于复制进程来说,如果Time Since Chkpt 延迟有2个小时,说明这个进程存在2个小时检查点未更新,也就说明有一个或多个组合成的大事务,执行了2个小时,并未执行成功???
正常情况下,OGG遇到异常报错,导致OGG进程中断Time Since Chkpt 50个小时后,解决报错后,启动该进程,一般来说2分内,会执行成功最少一个事务,会写入新的检查点,延迟的50个小时,会自动转换为lag at chkpt 50小时延迟。
异常情况或者说需要优化调整的情况是,启动进程,发现time since chkpt 延迟一直递增,不减少。说明存在事务未执行完毕。
实际遇到的情况1,进程同步4个表,其中一个表很大10G,并且目标端无主键!!!
因此目标端执行一条update sql执行效率非常低。 如何处理???
1.表存在主键
select * from user_cons_columns
where constraint_name = (select constraint_name from user_constraints
where table_name = 'BST_FAVORITE' and constraint_type ='P');
2.对OGG复制进程添加参数指定主键列
map source_owner.table_name target target_owner.table_name;
添加参数
map source_owner.table_name target target_owner.table_name,keycols(primary_column_name);
3.对于不存在主键的表呢???
select count(*) from xxx; 得到表的数量,如果表很大,不执行最好。
通过dba_tab_columns 根据NUM_DISTINCT 得到最多distinct的列,及选择性好的列。
SQL> select COLUMN_NAME,NUM_NULLS,NUM_DISTINCT,to_char(LAST_ANALYZED,'yyyy-mm-dd') as "date" from dba_tab_columns where owner='cc' and table_name='cc' order by ;
结合表的索引列select
a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段
from
user_indexes a ,user_ind_columns b
where
a.table_name=b.table_name
and
a.index_name = b.index_name
and
a.table_owner=
upper
(
'SAPSR3'
)
and
a.table_name=
'ANLU'
order
by
a.uniqueness
desc
;
二、Lag at Chkpt
lag是复制进程处理最后一条记录的操作系统时间和此条记录在trail文件中记录的时间戳的差值,这里需要注意的是lag延迟只有在检查点更新时才会更新,所以这个值不是实时更新的,具有一定的离散性,实际上应该理解成最后一个检查点的最后一条记录与当前系统时间的时间差。
借鉴
Replicat负责数据的入库,一般速度相对于主extract和data pump较慢,容易产生较大延迟。当replicat出现延迟后,需要对进程进行调优或者拆分,具体步骤参照本文档上一节。一般调优完成后,在日常业务状态下应当不存在较大延迟(一般几秒到一分钟以内);
当出现批处理时,可以允许一定的延迟,一般以不影响第二天的正常业务为准 – 例如,如果批处理每天早上4点前结束,可以控制延迟在2小时以内。 因此,首先需要确定OGG复制所允许的最大延迟在日常业务和批处理时的目标是什么,然后一旦达不到此目标就要依据上上面介绍的方法进行性能的调优。
自我理解: 按照我们实际运维的情况,OGG同步数据也是根据业务要求分级别的。
例如OGG链路1,是用于数据报表生成,那么必须保证业务每天在8点~10点之间是OGG无延迟,否则延迟高哪怕是10分钟,也可能导致报表不准确,因此这种OGG链路的复制 不允许在7~10点存在明显延迟。
例如OGG链路2,用于OGG灾备环境,重要性没那么重要,因此保证OGG复制进程1天内或者3天内数据同步即可。
站在运维的角度,需要结合实际情况考虑OGG重要程度,进行评估。 如果不影响业务,纯粹的延迟可以忽略。
实际遇到延迟50小时。
本次讲述通过索引加快OGG同步方式;
2.1 定位OGG复制进程在oracle数据库中的Session
$ps -ef|grep RP10
PID
20 RP10 ······
$ps -ef|grep 20
PID
60864 LOCAL=NO [OGG Session process]
SQL> select s.sid,s.serial#,sql_id,p.program from v$process p,v$session s where p.addr=s.paddr and p.spid=; SID SERIAL# SQL_ID PROGRAM
------------------------------------------------
2j664 oracle@cc (TNS V1-V3)
2.2 定位造成OGG复制进程延迟过高的SQL
通过ash视图,查询1天内这个OGG进程 session ,都在执行什么sql ,event信息。 ash视图间隔1s采样 active session 1次。因此捕捉到的次数越多,说明消耗花费的时间越多。
select sql_id,event,BLOCKING_SESSION,CURRENT_OBJ#,count(*) from v$active_session_history where SAMPLE_TIME>sysdate- and SESSION_ID= and SESSION_SERIAL#=37851
group by sql_id,event,BLOCKING_SESSION,CURRENT_OBJ# order by ,;
SQL_ID EVENT BLOCKING_SESSION CURRENT_OBJ# COUNT(*)
------------- ---------------------------------------------------------------- ---------------- ------------ ----------
1n7zz8wb86jpw
088mh1tws6wtm -
2jt8ttg6b42b4
9y2087cvvr4r9
1n7zz8wb86jpw -
2cc4 -
9y2087ccc9 -
rows selected. select * from table(dbms_xplan.display_cursor('2ccb4'));
SQL> select * from table(dbms_xplan.display_cursor('9ycc'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID xx, child number
-------------------------------------
DELETE FROM "W"."DT" WHERE "U_ID"
= :b0 AND 多个列 ······ AND "C_SORT"
= :b18 AND ROWNUM =
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value:
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| | DELETE STATEMENT | | | | ()| |
| | DELETE | DT | | | | |
|* | COUNT STOPKEY | | | | | |
|* | TABLE ACCESS FULL| DT | | | ()| :: |
----------------------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
- filter(ROWNUM=)
- filter(("U_ID"=:B0 AND 多个列······ "O_SORT"=TO_NUMBER(:B18))) rows selected. 距离,两个SQL 同一个表,都是delete操作,几乎相同。 执行几乎全表扫描,表10G,当然慢了,对吧? 执行删除1条记录,需要访问10G的数据。。。不慢才怪。
2.3 创建索引,加快OGG进程同步速度。
查询表相关索引,不存在。
select index_owner,index_name,table_name,column_name,column_position from dba_ind_columns where table_name='DT' order by index_name,column_position;
null 查询列的选择性
select * from dba_tab_col_statistics where table_name='DT' order by column_name;
```````
OWNER TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE
------------------------------ ------------------------------ ------------------------------ ------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE GLO USE AVG_COL_LEN HISTOGRAM
---------------------------------------------------------------- ---------- ---------- ----------- --------- ----------- --- --- ----------- ---------------
W DT U_ID
-JUL- YES NO NONE
······
rows selected. SQL> select count(*) from "W"."DT";
COUNT(*)
----------
724643
GGSCI > stop Ogg_process
!注意,本次知道OGG对应是灾备,不存在大量相关业务,慎用no_invalidate>false
exec dbms_stats.gather_table_stats(ownname=>'W',tabname=>'DT',cascade=>true,degree=>,estimate_percent=>,no_invalidate=>false) ;
再次查询
OWNER TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE
------------------------------ ------------------------------ ------------------------------ ------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE GLO USE AVG_COL_LEN HISTOGRAM
---------------------------------------------------------------- ---------- ---------- ----------- --------- ----------- --- --- ----------- ---------------
W DT U_ID 59346 . -AUG- YES NO NONE
rows selected.
exec dbms_stats.gather_table_stats(ownname=>'W',tabname=>'DT',cascade=>true,degree=>8,estimate_percent=>10,no_invalidate=>false) ; 查询列的选择性
select OWNER,TABLE_NAME,COLUMN_NAME,NUM_DISTINCT,NUM_NULLS,LAST_ANALYZED from dba_tab_col_statistics where table_name='DT' order by NUM_DISTINCT;
OWNER TABLE_NAME COLUMN_NAME NUM_DISTINCT NUM_NULLS LAST_ANAL ------------------------------ ------------------------------ ------------------------------ ------------ ----------
xx O_SORT -AUG-20
xx U_ID -AUG-
rows selected. select count(*) from ( select distinct U_ID,O_SORT from xx.xx);
COUNT(*)
---------- create index xx.xxon xx.cc(U_ID,O_SORT) parallel ;
alter index xx.xx parallel ;
exec dbms_stats.gather_table_stats(ownname=>'W',tabname=>'DT',cascade=>true,degree=>8,estimate_percent=>10,no_invalidate=>false) ; GGSCI (obcdb36) > start ogg_process
SQL> select * from table(dbms_xplan.display_cursor('2jt8ttg6b42b4'));
----------------------------------------------------------------------------------
Plan hash value:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------
| | DELETE STATEMENT | | | | ()| |
| | DELETE | cc| | | | |
|* | COUNT STOPKEY | | | | | |
|* | TABLE ACCESS BY INDEX ROWID| cc| | | ()| :: |
|* | INDEX RANGE SCAN | IND_ID_SORT | | | ()| :: 至此,OGG使用索引加快了数据同步delete速度。
OGG复制进程延迟高,优化方法一(使用索引)的更多相关文章
- OGG复制进程延迟高,优化方法二(存在索引),SQL选择不好的索引
https://www.cnblogs.com/lvcha001/p/13469500.html 接前序,本次场景中有索引,但是OGG复制进程使用了低效率的索引? 类似SQL使用低效索引,如何让Or ...
- OGG复制进程延迟不断增长
1.注意通过进程查找sql_id时,进程号要查询两次 2.杀进程的连接 https://www.cnblogs.com/kerrycode/p/4034231.html 参考资料 1.https:// ...
- MySQL性能优化方法三:索引优化
原文链接:http://isky000.com/database/mysql-performance-tuning-index 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引可以提高数据 ...
- OGG投递进程报错无法open文件,无法正常投递
1.1现象 之前有个客户遇到一个问题,OGG同步数据链路,突然有一天网络出现问题,导致OGG投递进程无法正常投递,无法写入目标端的该文件. 猜测是由于网络丢包等原因导致文件损坏,无法正常open,re ...
- OGG复制同步,提示字段长度不够ORA-01704
日常运维OGG的环境中,如果遇到复制进程报错,提示字段长度不足如何处理??? 正常情况下,字段长度不足,但是未达到Oracle的限制时,可以对字段进行扩大限制满足目的. 实际环境中,遇到源端GBK,目 ...
- Linux下java进程CPU占用率高分析方法
Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...
- php-fpm进程数优化方法
原文地址:https://www.douban.com/note/315222037/ 背景最近将Wordpress迁移至阿里云.由于自己的服务器是云服务器,硬盘和内存都比较小,所以内存经常不够使,通 ...
- mysql优化连接数防止访问量过高的方法
这篇文章主要介绍了mysql优化连接数防止访问量过高的方法,需要的朋友可以参考下 很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成 ...
- (转)Linux下java进程CPU占用率高-分析方法
Linux下java进程CPU占用率高-分析方法 原文:http://itindex.net/detail/47420-linux-java-%E8%BF%9B%E7%A8%8B?utm_source ...
随机推荐
- python+requests实现接口自动化
1. 前言 今年2月调去支持项目接口测试,测试过程中使用过postman.jmeter工具,基本能满足使用,但是部分情况下使用较为麻烦.比如:部分字段存在唯一性校验或字段间有业务性校验,每次请求均需手 ...
- 不吹不擂,315 道 Python 面试题,欢迎挑战!
各位大佬暂时先来315道题尝尝吧,后面有时间再继续补充. 有缘人如果看到这些题,不妨留言一下答案,来证明下你到底有多水,哈哈哈哈哈刀哈哈哈哈哈哈 第一部分 Python基础篇(80题) 1.为什么学习 ...
- 做软件测试要月入20k?听听腾讯大牛怎么说
作者:兰色链接:https://www.zhihu.com/question/373819487/answer/1183309514来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- springboot(12)Redis作为SpringBoot项目数据缓存
简介: 在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果我们的项目访问量过大或者访问过于频繁,将会对我们的数据库带来很大的压力.为了解决这个问题从而redis数据 ...
- NoSQL和SQL怎么选用?
NoSQL 有分很多种,其中key-value NoSQL (Redis, MemcacheD, etc) 的选用相对比较清楚些,大多是当后端Data storage的cache层来用.这篇主要想请教 ...
- 如何消灭飞机的“黑色十分钟”,AI来帮忙
近年来,“AI的应用和落地”逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的“化学反应”.例如,在日常生活中,AI可以推送我们喜欢的新闻或视频,可以在拍照的时候识别场景提升照片的美感 ...
- 《Python编程快速上手 —让繁琐工作自动化》|百度网盘免费下载|Python自动化办公
Python编程快速上手—让繁琐工作自动化 提取码:u8vj 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过 P ...
- 第三章 Java面向对象(上)
3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...
- Ionic 警告框
<html ng-app="mySuperApp"> <head> <meta charset="utf-8"> <m ...
- Django学习路18_F对象和Q对象
F 对象: 可以使用模型的 A 属性和 B 属性进行比较 写法: 需要的数据对象 = 数据表(类名).objects.filter(列名__条件=F('列名2')) 需求: 查看男生数量比女生少 的公 ...