SQL0964C The transaction log for the database is full

SQL0964C The transaction log for the database is full. 
这个错误说明事务日志已满,查到一些解决方法:

方法一:命令行方式
把日志文件的大小和日志文件的数量扩充,如下命令 
db2 update db cfg for DATABASE using LOGFILSIZ 7900 
db2 update db cfg for DATABASE using LOGPRIMARY 30 
db2 update db cfg for DATABASE using LOGSECOND 20

方法二:控制中心方式。
直接在该数据库上右键,弹出如下窗口,找到 Configure Dababase Logging Wizard,打开即可设置。

ibm官方说明:
Too many objects have been loaded into the library server and the transaction to delete rows in the library server transaction tracking table is overfilling the DB2® UDB transaction logs.

Workaround:
1. Stop the migrator process.
2. Stop all the DB2 UDB applications. The DB2 UDB command to stop all the applications is: db2 force applications all
3. Change the number of secondary log files in the DB2 UDB database configuration to a greater number such as 100 (default is 20).
4. To see the database configuration settings, enter the following command in a DB2 UDB command window: db2 get db cfg
5. To update the number of secondary log files to 100, enter the following: db2 command db2 update dbm cfg using LOGSECOND=100
6. Start the migrator process. 
The error message should now not be appearing in the library server log, and the transaction to delete rows in the library server transaction tracking table should be successful.

有关日志文件的参数有如下几个: 
Logprimary:主日志文件的个数;最大为为65536(页数)×4k(块大小);

www.ixdba.net


Logfilsz:每个日志文件的大小;最多不超过256
Logsecond:第二日志文件的个数;最大不超过254;辅助日志文件在需要时分配,不再使用时系统收回。

平常只使用Logprimary的个数个日志文件,当主日志文件被用完,则启用第二日志文件个数个日志文件。如果都用光了系统就会报日志满错误。 

而所谓循环日志方式,是指对主日志文件的循环利用,但是要注意,日志文件的大小必须要满最大单个事务的数据容量需求。因为在一个事务写日志的过程中是不允许循环使用的,平常最好配置到,只使用主日志,不使用第二日志,最好让数据库一天写满一个到两个日志文件。
另外,还有种方法是设置不写日志,即ALTER TABLE A ACTIVATE NOT LOGGED INITIALLY,但是据说这种方法可能会出问题,而且一旦出问题,只能DROP TABLE,无法补救。所以这种方法还是不用了。

补充:
DB2 事务日志摘要

事务是逻辑工作单元。每一个事务在事务日记文件中都存储有相应的日志记录。每个事务都有一个相应的 Redo Log 条目。Redo Log 条目将写入当前的活动日志文件。当活动日志文件变满时,它将被标记为 unavailable。此时,DB2将接着此活动日志文件另外创建一个日志文件,并继续在其中写入日志条目。当前活动日志文件变满时,DB2 将重复这一循环过程。当事务完成后(发起COMMIT  ROLLBACK 语句),相应的日志条目将被释放,因为不再需要将它们用于恢复数据库。

  DB2 将一直尝试将日志条目写入主要日志文件集,也就是数据库活动时间自动分配的日志文件。如果某个事务将所有主要日志文件消耗怠尽(所有主要日志文件都被标记为 unavailable),则数据库管理员将分配一个次要日志文件。当这个文件变满时,数据库管理员将再次检查主要日志文件的状态是否为 unavailable。如果是,则再分配一个次要日志文件并继续在其中写入条目。该过程将不断重复,直到所有次要日志文件都分配并写满。如果没有主要日志文件可供写入
Redo 条目,并且已经分配最大数量的次要日志文件,则应用程序将收到以下错误消息:

  SQL0964C The transaction log for the database is full.

  希望您曾经遇到过这种错误。但是,如果遇到此错误,则应该根据需要增加主要和次要日志文件(或者它们的大小)的数量。在理想情况下,主要日志文件的数量或大小应该足够保存最大的事务。分配次要日志文件相当消耗资源,因为它将在运行时执行。因此,我们应该将需要在高峰工作负荷期间分配的次要日志文件数量降到最低。要更新主要或次要日志文件的数量,可以发起以下命令:

  UPDATE DB CFG FOR db_name USING LOGPRIMARY value

  UPDATE DB CFG FOR db_name USING LOGSECOND value

  注意:如果出现此问题,则应该分析造成整个日志文件空间变满的原因是什么。它可能是由失控查询或用户错误造成的,因此增加日志文件的数量或大小只能在表面上解决问题。比如说,假设某个用户发起了一个 DELETE FROM tab1 语句,且 TAB1 是一个相当大的表。虽然这一语句看上去没什么问题,每行生成一条删除日记记录,但是如果未经过配置处理它可以轻易地将日志空间填满.
posted @ 2011-09-23 16:11  留心_frankliujava  阅读(14508)  评论(0编辑  收藏  举报