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/INDEX2、判断数据泵进度
这时有人问你导出/导入进度,你和他说的太专业,他也听不懂,可以这样来判断。
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';



