再谈数据库加载失败故障

Klocwork 版本:2017.3

项目多,build多,数据量大的客户,有时遇到数据库故障,在前面发布过《如何设置Klocwork性能参数》文档三个版本了,但是仍然有客户反馈数据库相关问题,看来仍然有很多用户未能读到这份文档。本文针对其中的数据库故障问题做简明阐述。

Klocwork安装后,针对数据库的缺省设置在这个位置:

/config/kwmysql.ini,打开这个文档,可以看到里面的缺省设置值:

[mysqld]

#

character_set_server=utf8

#

console

#

innodb_file_per_table

innodb_file_io_threads = 8

innodb_fast_shutdown=0

innodb_data_file_path=ibdata1:10M:autoextend

#

thread_concurrency = 8

key_buffer_size = 80M

#

innodb_buffer_pool_size = 128M

#

binlog_cache_size = 32K

#

read_buffer_size = 512K

read_rnd_buffer_size = 1M

sort_buffer_size = 4M

join_buffer_size = 1M

bulk_insert_buffer_size = 10M

#

skip-external-locking

default-storage-engine = MYISAM

max_connect_errors=999999999

lower_case_table_names=1

#

query_cache_size = 4M

query_cache_limit = 100K

query_cache_type = 1

#

thread_cache = 8

myisam_max_sort_file_size = 4G

myisam_sort_buffer_size = 8M

tmp_table_size = 128M

max_heap_table_size = 128M

table_open_cache=300

open_files_limit=2048

这样的参数配置是针对一般小到中型数据库的。现在很多使用Klocwork 分析规模上千万行的代码项目、或者一直在CI里面做 KW Build,累积了过多的 build。Klocwork每次 Server Build结果都保存入库了。所以,对于一个普通的 MySql 数据库,当数据量超大的时候,上述的参数就无法支撑数据库正常运转了,从而出现事务超时、保存失败等故障。一旦发生数据库故障,有时数据库可以通过自恢复机制恢复,但有时候会造成数据丢失,到这种时候我们只能尽力挽救,但在没有其他备份机制的情况下,这种数据库失败很可能会导致数据的丢失。对于数据完整要求很高的项目,建议采用专业的数据冗余备份设备和机制。

Klocwork为什么没有把这些值设置得能力大一些呢?答案很简单,因为并不是所有用户都在使用很强的计算机,设置的参数值太大,会导致普通客户用计算机无法启动 Klocwork Database 服务。Klocwork 至少要保证服务正常启动,所以选择了适合普通计算机的参数配置。

当然,如果说Klocwork安装程序如果在安装过程中,智能一些,可以根据客户计算机的性能指标自动调整这些参数值,我想是一种很受欢迎的功能,这个意见我们已经向 RogueWave 提了,期待未来版本中见到这个功能。

数据库故障都可以从 build.log ,database.log 和 kwloaddb.log 里面看到错误提示。所以,大家在build失败的时候,一定要首先看 build.log 和 kwloaddb.log 以及其他 log 日志(klocwork.log, license.log )以定位问题的原因。

下面按照错误提示,分析几个重要参数:

【错误提示案例一(build.log)】:

MESSAGE: The last packet successfully received from the server was 53,445,570 milliseconds ago. The last packet sent successfully to the server was 53,445,570 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

这种情况表示一次数据库事务中,自上次收到数据包之后,很久没有收到下一个,直到超时了。

应调整参数:wait_timeout - 此值表示数据库服务等待非活跃连接的时间长度,以秒为单位。此值会影响数据库加载,因此应将此值设置为不少于数据库加载最大项目所需要时间长度的值。

我们推荐加大此值为:wait_timeout = 216000

【错误提示案例二(database.log)】:innodb 事务临时数据的缓存区太小造成如下错误:

应调整参数:

innodb_buffer_pool_size - innodb事务临时数据缓存区大小;

innodb_log_file_size - innodb事务临时数据文件每个文件的大小;

innodb_log_files_in_group - innodb事务临时数据文件的个数;

要求:

innodb_buffer_pool_size >= innodb_log_file_size * innodb_log_files_in_group

我们推荐:

innodb_buffer_pool_size = 4G

innodb_log_file_size - innodb = 1G

innodb_log_files_in_group = 4

注:有个约束条件 innodb_buffer_pool_size + key_buffer_size +query_cache_size + (join_buffer_size + sort_buffer_size) * max_connections < 可用RAM大小

因此,具体还要结合计算机可用物理内存大小,超出了就起不来了。

另外,还有一个配置文件 java_wrappers_memory.conf 文件会涉及到,这个文件保存每个 Klocwork命令所占用 JVM heap 内存的最大值。文件位置 :

/config/java_wrappers_memory.conf。

【错误提示案例三】

如果在load db(执行 kwadmin load )的时候,build.log 中提示:

Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

表示 kwloaddb 命令执行时,jvm 堆内存不足。则需要将 java_wrappers_memory.conf 中 kwloaddb 对应的内存值增大,一般设置为可用物理内存的一半左右(留一些给其他程序和服务使用)。实在必要时,可尝试逐渐加大,增加得太大了,就会出现下面的错误提示案例四的情况:

【错误提示案例四】

如果在load db(执行 kwadmin load )的时候,build.log 中提示:

Error occurred during initialization of VM

Could not reserve enough space for object heap

则,表示kwloaddb 命令所设置的最大 JVM heap 内存值太大,无法初始化JVM了,这时应将其改小。

如果增大了出现错误提示四,调小了出现错误提示三,左右为难怎么办?这种情况就是计算机物理内存太小了,需要增加物理内存后继续调大 JVM heap内存最大值。

上述是结合出错提示解释的个别参数设置,作为数据量超大的情况下,Klocwork给出推荐配置 kwmysql.ini 如下:

[mysqld]

#

character_set_server=utf8

#

console

#

innodb_file_per_table

innodb_file_io_threads = 8

innodb_fast_shutdown=0

#

innodb_data_file_path=ibdata1:10M:autoextend

#

thread_concurrency = 8

key_buffer_size = 200M

#

innodb_buffer_pool_size = 4G

innodb_log_file_size = 1G

innodb_log_files_in_group=4

wait_timeout = 216000

interactive_timeout = 216000

net_read_timeout=300

net_write_timeout=300

#

binlog_cache_size = 32K

#

read_buffer_size = 2M

read_rnd_buffer_size = 2M

sort_buffer_size = 4M

join_buffer_size = 1M

bulk_insert_buffer_size = 10M

#

skip-external-locking

default-storage-engine = MYISAM

max_connect_errors=999999999

lower_case_table_names=1

#

query_cache_size = 128M

query_cache_limit = 2M

query_cache_type = 1

#

thread_cache = 8

myisam_max_sort_file_size = 4G

myisam_sort_buffer_size = 8M

tmp_table_size = 1G

max_heap_table_size = 1G

table_open_cache=300

open_files_limit=2560

innodb_read_io_threads = 4

innodb_write_io_threads = 4

thread_cache_size = 8

max_allowed_packet = 16M

connect_timeout = 900

请根据此参数配置情况进行调整,必要时应增加计算机物理内存或更换更高配置的计算机。

【重要:关于 kwmysql.ini 的访问权限】

另:有时候出现一些奇怪的现象,比如无法启动 innodb 引擎,设置的参数无法生效。这种情况往往是因为 kwmysql.ini 的权限被修改了。kwmysql.ini 的访问权限应该是 644,有时候大家为了修改方便,把权限改成了 755 或者 777,那么 mysql 数据库就禁用这个配置文件了(与Klocwork无关),从而启用缺省配置文件,缺省配置文件使用 ISAM 引擎,你所设置的参数也就无效了,innodb 引擎也就无效了。Klocwork需要工作在 innodb引擎下,所以无法正常工作了。

为保证数据库访问正常,总结如下:

(1)定期清理数据,最好采用保留最近的 n (建议不要超过百次)次构建;

(2)项目数据不断增大时,应对应调整配置文件 kwmysql.ini 和 java_wrappers_memory.conf 中的参数设置;

(3)切记切记保持 kwmysql.ini 文件的访问权限是 644。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180211G078U000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券