记一次数据库重启后归档急剧增加的问题(98天)
发布日期:2021-06-30 13:28:42 浏览次数:2 分类:技术文章

本文共 4276 字,大约阅读时间需要 14 分钟。

在本地的环境中测试外部表的性能,由于空间有限,不一会儿归档的空间就爆了。然后文件貌似出现了系统级的问题,刚刚rm掉的归档日志文件。隔了几秒钟再ls,就出现了。怎么删都删不掉。尝试了多次之后,无奈尝试shutdown immediate结果等了好半天还是没反应,然后采用shutdown abort后重启,库直接起不来了。报了ora错误,然后库就起不来了。

查看日志显示,和之前碰到的归档空间不足导致的问题一致。清除有问题的归档之后,重启库就起来了。可以参见日志:http://blog.itpub.net/23718752/viewspace-1167163/

SMON: enabling cache recovery ORACLE Instance TEST01 - Archival Error ORA-16038: log 3 sequence# 339 cannot be archived Error message: Linux-x86_64 Error: 28: No space left on device

然而这仅仅是个开始。我检查文件的使用情况,马上发现有一个目录下空间只剩下几百k了,排查空间的使用情况,最后定为是Undo的自增长造成的,本来500M左右的Undo现在涨到了900多M。

因为库是刚起来的,也没什么其他的操作,于是就做了Undo文件的resize,结果让我大跌眼镜。

SQL> alter database datafile '/u03/ora11g/oradata/TEST01/undotbs01.dbf' resize 500M; ORA-03297: file contains used data beyond requested RESIZE value

resize不行,再也没有其他的多余空间,而且目前遇到的情况更奇怪,归档生成的极为频繁。本来空间就紧张的虚拟机几乎不能做任何操作。

我最后尝试更改归档路径,把归档指到空间稍大的一个分区。然后再查查看到底是什么在后台消耗了这么多的资源,这个库自启动以来没做任何其他的操作。

先更改了归档路径,然后shutdown immediate还是没反应,尝试shutdown abort重启。这次重启没有其他的问题。库起来了,

但是在短时间内生成了相当多的归档文件。有很多已经被自己手工删除了。

rw-r----- 1 ora11g dba 99933184 Jun 8 01:04 1_358_837590339.dbf

查看系统级的进程。里面有好几个并行相关的进程,目前没有其他的操作,是在做后台的回滚吗?

我记得重启之前做数据加载测试的时候是用了并行。

top - 01:10:00 up 1:06, 3 users, load average: 3.52, 3.27, 2.99

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3176 ora11g 20 0 530m 76m 74m D 10.9 3.9 2:16.24 ora_p003_TEST01 3158 ora11g 20 0 531m 79m 77m D 9.6 4.0 2:11.00 ora_p001_TEST01 3174 ora11g 20 0 530m 73m 71m S 5.3 3.7 2:13.23 ora_p002_TEST01 3128 ora11g 20 0 549m 91m 71m D 3.6 4.6 0:50.43 ora_dbw0_TEST01

查看当前是否有session在操作

SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL "UBA filenum", t.UBABLK

no rows selected

查看undo的使用情况

SELECT

Tablespace Name TS Size(MB) UNDO Stat Used Extents Used Size(MB) Used Rate(%) UNDOTBS 933.125 ACTIVE 283 929.88 99.65

使用ash来查看一些到底在那几分钟里发生了什么。

Sid,Srl# (Inst) % Activity SQL ID Event % Event 243, 1(1) 75.35 wait for a undo record 21.62

db file sequential read 18.32

wait for stopper event to be 16.08

-------------------------------------------------------------

Top DB Objects DB/Inst: TEST01/TEST01 (Jun 08 01:04 to 01:09)

Object ID % Activity Event % Event 15390 7.00 db file sequential read 6.83 N1.T (TABLE) POOL_DATA

15391 3.92 db file sequential read 2.86 N1.SYS_C005621 (INDEX) POOL_DATA

buffer busy waits 1.06

-------------------------------------------------------------

Top DB Files DB/Inst: TEST01/TEST01 (Jun 08 01:04 to 01:09)

File ID % Activity Event % Event

10 2.13 db file sequential read 2.02

8 1.46 db file sequential read 1.46

11 1.40 db file sequential read 1.40

7 1.34 db file sequential read 1.34

-------------------------------------------------------------

Top Latches DB/Inst: TEST01/TEST01 (Jun 08 01:04 to 01:09)

No data exists for this section of the report.

Activity Over Time DB/Inst: TEST01/TEST01 (Jun 08 01:04 to 01:09)

Slot Event 01:04:00 (0 secs) 7 write complete waits 3 0.17 db file async I/O submit 1 0.06 free buffer waits 1 0.06 01:04:00 (1.0 min) 343 wait for a undo record 81 4.54 db file sequential read 67 3.75 wait for stopper event to be i 59 3.31 01:05:00 (1.0 min) 330 wait for a undo record 69 3.87 db file async I/O submit 58 3.25 wait for stopper event to be i 55 3.08 01:06:00 (1.0 min) 363 wait for a undo record 97 5.43 db file async I/O submit 59 3.31 wait for stopper event to be i 52 2.91 01:07:00 (1.0 min) 377 db file sequential read 87 4.87 wait for a undo record 77 4.31 wait for stopper event to be i 61 3.42 01:08:00 (1.0 min) 365 db file sequential read 80 4.48 wait for a undo record 61 3.42 db file async I/O submit 59 3.31

这样看果然一目了然,全部的问题都指向了一个表t和对应的索引。

这个表是做数据加载测试使用的表,加载的数据量有千万。会产生很多的redo。

查看n1.t这个表的情况,看表里面,目前是没有数据,但是查询会持续相当长的时间。简单验证一下。

SQL> select count(*)from t where rownum<2;

COUNT(*)

然后查看表t的统计信息。还是现实千万的数据条数。

*******************************************

TABLE_NAME PAR TABLESPACE STATUS NUM_ROWS BLOCKS EMPTY_BLOCKS LOG MON ROW_MOVE LAST_ANAL 13240320 74364 0 NO YES DISABLED 07-JUN-14

********** TABLE STORAGE INFO *****************

INITEXT NXTEXT MINEXT MAXEXT FREELISTS AVG_SPACE CHAIN_CNT AVG_ROW_LEN CACHE T DEPENDEN COMPRES

在我查完问题之后,问题也好像自动解决了,归档也不在生成了。查看alert文件,确实是在做事务的并行回滚,不过刚刚做完。

Thread 1 advanced to log sequence 360 (LGWR switch) SMON: Parallel transaction recovery tried

我现在要做的就是把表t的高水位线放下来。

SQL> truncate table t;

SQL> set timing on

COUNT(*)

Elapsed: 00:00:00.00

转载地址:https://jeanron100.blog.csdn.net/article/details/102506829 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:海量数据迁移之外部表并行抽取(99天)
下一篇:关于创建索引的ora问题 (96天)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月15日 05时11分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章