概述
很多时候我们在对数据库做delete操作时,如何想知道目前delete的大概进度可以怎么知道呢?毕竟delete过程中没有提交不能简单的通过表数量来做判断。
1、删除一个大表
测试环境模拟删除一张1亿数据表中7000万条记录,命令如下:
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方面的内容,感兴趣的朋友可以关注下!