专业编程基础技术教程

网站首页 > 基础教程 正文

delete一张表花了2个小时?应如何观察delete目前的进度?

ccvgpt 2024-08-03 12:27:01 基础教程 21 ℃

概述

很多时候我们在对数据库做delete操作时,如何想知道目前delete的大概进度可以怎么知道呢?毕竟delete过程中没有提交不能简单的通过表数量来做判断。


1、删除一个大表

测试环境模拟删除一张1亿数据表中7000万条记录,命令如下:

delete一张表花了2个小时?应如何观察delete目前的进度?

alter table xx nologging;
delete /*+parallel(t 8)*/ xxxT t where insert_time<=to_date('20180630 00:00:00','yyyymmdd hh24:mi:ss');
commit;
alter table xxx logging;

这里一定要注意观察UNDO表空间使用率(观察连接的是哪个实例,然后看对应的UNDO空间,假设UDNOTBS1使用了比较多空间,就需要连接到RFDB2实例,充分利用UNDO空间),归档空间情况(虽然已经nologging,但归档日志还是有发生切换,需要注意)及数据库服务器负载和告警日志。


2、查看UNDO使用情况

删除过程中观察UNDO使用了72%


3、查看删除进度

我们可以通过观察v$transaction来获得delete过程的情况。

select start_time,start_scnb,used_ublk,used_urec,log_io,phy_io from v$transaction;

说明:

  • start_time --> start_time
  • start_scnb --> 开始的scn
  • used_ublk --> 占用的undo block
  • used_urec --> undo 记录的行数
  • log_io --> 逻辑io 注意并非Consistent gets,有专门一列:CR_GET
  • phy_io --> 物理io

4、查询正运行事务

用如下SQL查询到正在运行的事务,如其used_urec字段不断增加,说明该事务正在继续,如果该字段不断下降,说明该事物正在回滚。

SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk from v$session a, v$transaction b WHERE a.saddr = b.ses_addr;

5、补充说明

v$transaction字段说明:


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!

Tags:

最近发表
标签列表