暂无图片
暂无图片
10
暂无图片
暂无图片
暂无图片

Streams AQ: enqueue blocked on low memory等待事件导致数据泵导入异常缓慢

656

0、杂言

  Oracle数据库在导入的时候,因为某些原因,领导或者同事经常问Dba导入的进度,导出的进度,到哪了?还有多长时间这些问题,你和他说快了快了,他也不乐意,非要你预估个时间,这个时候可以通过以下办法来判断和预估。


1、数据泵步骤

Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/DB_LINK
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/AUDIT_OBJ
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/VIEW/AUDIT_OBJ
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
Processing object type SCHEMA_EXPORT/TABLE/POST_TABLE_ACTION
Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
Processing object type SCHEMA_EXPORT/TABLE/MATERIALIZED_VIEW_LOG


其中我们经常遇到卡顿的是,分别是表、表数据、索引。

Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX


2、判断数据泵进度

这时有人问你导出/导入进度,你和他说的太专业,他也听不懂,可以这样来判断。


2.1、SQL语句大略判断

SELECT sid, serial#, context, sofar, totalwork, ROUND(sofar/totalwork*100,2) "%_COMPLETE"
 FROM v$session_longops WHERE totalwork != 0 AND sofar <> totalwork;
SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE ---------- ---------- ---------- ---------- ---------- ---------- 2551 12389 0 26665 26666 100

这条sql判断导入的百分比,他是从大步骤来判断,而无法判断细节,比如说你到了创建索引这步,但是他没法告诉你创建了多少索引,还需要多少索引,你如果回答进度只能说 100%了,快了。但是真实的时间你还是不清楚。


2.2、attach判断

impdp system/Oracle12# attach=SYS_IMPORT_FULL_01
Import> status Job: SYS_IMPORT_FULL_01 Operation: IMPORT Mode: FULL State: EXECUTING Bytes Processed: 27,960,181,136 Percent Done: 99 Current Parallelism: 4 Job Error Count: 0 Dump File: /backup/expdp/AAAAAA.dmp Worker 1 Status: Process Name: DW00 State: EXECUTING Object Schema: CB13 Object Name: INX_3 Object Type: SCHEMA_EXPORT/TABLE/INDEX/INDEX Completed Objects: 52,292 Worker Parallelism: 4

可以看到更加具体的进度,99%(的确是比100%准一点),然后还能看到正在执行那部分操作,创建表的索引,还能看到用户名和表名。

还是只能看到大略,没法从这个部分的整体来看。我的意思是,创建完索引是整体索引的占比是多少?能否根据这个进行评估剩余的时间?


2.3、源库和导入日志的比对。

#########################源库表数量
select owner, count(*)
  from dba_tables
 where owner in ('用户A',
                 '用户B',
                 '用户C')
 group by owner
 order by owner;


#######################导入日志统计数量
cat AAAAA_20240905_import.log | grep 用户A | wc -l

cat AAAAA_20240905_import.log | grep 用户B | wc -l

cat AAAAA_20240905_import.log | grep 用户C | wc -l

做个excel的表格类似于这样


这样可以判断有多少表导入数据,可以估算一个进度。通过左边第三列 / 左边第二列 ≈ 创建完百分比



##源库索引个数select owner, count(*)
  from dba_indexes
 where owner in ('用户A',
                 '用户B',
                 '用户C')
 group by owner
 order by owner;
##目的库索引个数 select owner, count(*) from dba_indexes where owner in ('用户A', '用户B', '用户C') group by owner order by owner;


创建索引一直是个费时费力,而且不好估算的进度,每个索引会根据表的大小创建的时间不同,但是也可以根据以上的算法进行判断。

通过左边第三列 / 左边第二列 ≈ 创建完百分比。


3、导出缓慢现象

  Orcle 11GR2使用IMPDP导入,八个用户,一共 76125 张表,数据量在30G左右,需要导入到一个新的暂未投入使用的生产库,此前已经做过测试的迁移,消耗时间大概4个小时左右。此次申请一晚上的时间进行停机操作。

  在周四晚上21:30进行导入操作,和以往的命令没有差别,可是发现第二天早上8点多还没迁移完。


4、问题定位

查看数据库等待事件

SELECT instance_number, event, COUNT(*)
  FROM dba_hist_active_sess_history
 WHERE sample_time BETWEEN
       to_date('2024-09-06 06:30', 'yyyy-mm-dd hh24:mi') AND
       to_date('2024-09-06 08:30', 'yyyy-mm-dd hh24:mi')
 HAVING(COUNT(*)) > 50
 GROUP BY instance_number, event
 ORDER BY 3 desc;#############################################################################################INSTANCE_NUMBER EVENT								   COUNT(*)
--------------- ---------------------------------------------------------------- ----------
	      1 									729
	      1 Streams AQ: enqueue blocked on low memory				717



5、解决问题

根据Mos搜寻等待事件 Streams AQ: enqueue blocked on low memory,查找到文档Doc ID 2469587.1。

“1”。该值表示 streams pool 处于收缩阶段。当 streams pool 完成收缩时,该值应返回”0”,
SQL> select shrink_phase_knlasg from X$KNLASG;

SHRINK_PHASE_KNLASG
-------------------
		  1


####手动强制完成stream pool内存池空间收缩connect / as sysdba
alter system set events 'immediate trace name mman_create_def_request level 6';


6、涉及文档

https://blog.csdn.net/PWY13148/article/details/137065310

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=429558483410625&id=2469587.1&_afrWindowMode=0&_adf.ctrl-state=mopu2vn81_80


https://www.modb.pro/db/1796115460026093568

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论