为什么当数据库发生很小的变更时,Oracle数据库每天会生成大量的归档日志?

为什么当数据库发生很小的变更时,Oracle数据库每天会生成大量的归档日志?

我目前在 RHEL5 上使用 Oracle 数据库 11g。即使数据库只发生少量更改(每天大约 500 个事务),我的数据库每天也会生成大量存档日志。我还检查了我的数据文件(用户表空间)的大小;它的大小每天增加约 20MB,但存档日志每天生成 5GB 到 10GB。

有人能告诉我是什么原因导致了这个问题吗? 有什么解决方案可以检查为什么它会生成更多存档吗? 我该如何减少它?

此致,

沙里思

答案1

可能值得查看文件上的时间戳,看看它是否均匀分布,或者是否一次生成一堆(可能与某些批处理活动相对应)。

如下查询将显示当前生成重做的会话。

select s.sid, n.name, s.value, sn.username, sn.program, sn.type, sn.module
from v$sesstat s 
  join v$statname n on n.statistic# = s.statistic#
  join v$session sn on sn.sid = s.sid
where name like '%redo entries%'
order by value desc;

如果您拥有 AWR 许可,您也可以查看历史记录表。

数据库的总大小是多少?我怀疑一些大型表每天都会被截断并重新加载非常相似的数据

答案2

正如建议的那样另一个线程,您可以使用 LogMiner 来发现记录了哪些交易:

http://www.oracle.com/technology/oramag/oracle/05-jul/o45dba.html

答案3

UPDATE语句不一定会改变表或行的大小,但必须在重做中捕获,这决定了存档日志的大小。

未提交的事务(即回滚的事务)不会对数据库做出永久性的更改,但仍会生成重做。

导致索引更新的表 DML 活动(应用程序是否进行了大量DELETEing 和INSERTing?)也会导致索引更新,UPDATE更改索引列的语句也会导致索引更新。

简而言之,测量存档日志大小是衡量变化活动的一种方式——增长是另一种通常不相关的指标。您可能希望执行的操作是查询ALL_TAB_MODIFICATIONS以准确显示自上次分析以来从写入角度来看您的表实际上有多忙,因为在 10g+ 中,所有表都会自动监视 DML 活动。

答案4

这个问题的一个简单解决方法是

1)在Oracle中设置块更改跟踪以加速增量备份
http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmbckba.htm# BRADV8125

2) 运行 DB 和存档日志的增量备份级别 1(例如,每天 2 次),并在 RMAN 脚本末尾添加下一行:

DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE -2';
如果 RMAN 显著降低了数据库的查询运行速度,则可以向 BACKUP DATABASE 字符串添加以下关键字:
DURATION 1:00 PARTIAL MINIMIZE LOAD
其中,1:00—需要备份的时间1小时。

相关内容