DB2在执行一个大的insert/update操作的时候报“The transaction log for the database is full.. ”错误,查了一下文档是DB2的日志文件满了的缘故。
1.连接db2服务器
切换linux用户
su - db2inst1
2.连接数据库
db2 connect to 数据库名 user 用户名 using 密码
3. 首先运行下面命令来查看DB2的日志配置信息
4. 注意其中的下面配置项
5. 此时可以通过下面的命令来修改B2的日志配置信息
6. 修改配置以后需要重新启动数据库实例
7. 最后再次查看修改后的参数,然后重新运行insert/update操作。
下面稍微想想其原因,DB2数据库的日志原理:
事务日志记录数据库中所有对象和数据的改变,在早前版本中最大可达256G,其大小为( logprimary + logsecond ) * logfilsiz,其中logprimary + logsecond的值小于或等于256,logfilsiz的最大为262144,在9.5版本中,日志最大已经可以达到512G,其中logfilsz的大小更改为524286。
DB2数据库的日志分为主日志和辅助日志,其中主日志在第一个连接到达数据库或者数据库被激活后立即分配,而辅助日志在主日志大小不够的时候动态分配。所以需要注意一点,日志所在的文件系统的大小必须大于主日志文件与辅助日志文件的大小之和。
DB2数据库有2种日志配置方式,循环日志与归档日志。
循环日志:这是数据库默认的日志使用方式,主日志用来记录所有的更改,当事务提交后,日志文件会被重用。当主日志文件达到限制时,辅助日志文件将被使用。这种日志方式可以进行崩溃恢复和版本恢复,不能进行前滚恢复,不支持在线备份。
当活动事务的使用空间超过主日志和辅助日志的限制或者日志空间超过磁盘可使用空间,将会得到日志满的错误。
归档日志:启用logarchmetd1、logarchmetd2或打开logretain参数,注意,在9.5版本中,不推荐使用logretain参数,其所有的设置值将被忽略。在数据库归档日志规划时,建议不再使用logretain的方法。日志文件将不会被删除-保持在线或者离线状态。支持前滚恢复和在线备份。
疑问:归档日志下,日志一直保留,持续生成新日志,为什么还会出现日志满的错误?
归档日志下,其可用的活动日志大小依然受到主日志与辅助日志大小之和的限制,所以,即使在归档日志下,日志满的场景与活动日志下是完全一样的。