MySql:在强大的服务器上,每三天崩溃一次

我的MySQL服务器在Ubuntu 16.x上运行最新版本的MySql,每天都会一次或两次崩溃。 有时它会很快修复(10分钟)。 有时我必须重新启动,并做一个fsck让事情再次运行。

这会造成什么?

到目前为止我尝试过的东西:

  • 将内存从1.5GB提高到了5GB。
  • 硬件升级:母板,处理器,内存(DDR4),但没有帮助(它正在运行一个7岁的处理器,现在运行第七代核心I5)。
  • 设置UFW防火墙,以确保它不是由攻击MySQL或其他服务的机器人造成的。
  • 在my.cnf中,将innodb_buffer_pool_size从128MB更改为500MB。 没有帮助,但仍然到位
  • 我已经运行:mysqlcheck -u root -p –auto-repair –optimize –all-databases多次。 没有帮助
  • 在my.cnf中,将mysql max_connections从151减less到80,然后重新启动mysql。 没有帮助
  • 将apache MaxRequestWorkers从150减less到100. 没有帮助。 仍然崩溃。
  • 我已经有一个1GB的交换文件。 留下它。
  • 通过Apache2日志,SysLog,似乎是合适的,但没有发现任何引起我注意的任何其他日志。
  • closures服务器并尝试将虚拟机移动到另一个驱动器,但失败并出现文件错误。
  • 我最近的怀疑是这是由一个坏块造成的,但是运行badblocks似乎在25%完成时会引发崩溃。 在fsck期间,我看到这个:fsck critical medium error,dev sda,sector 147306432

这里是一个典型的mysql错误日志:

2017-04-20T18:43:46.958430Z 0 [注] InnoDB:page_cleaner:1000ms预期循环花了11791ms。 这些设置可能不是最佳的。 (在此期间stream感病毒= 92,被驱逐= 0)。
2017-04-20T18:44:11.989905Z 0 [注意] InnoDB:page_cleaner:1000ms打算循环花了6822ms。 这些设置可能不是最佳的。 (在此期间刷新= 8,驱逐= 0)。
2017-04-20T18:44:49.145162Z 0 [注意] InnoDB:page_cleaner:1000ms预期循环花了5021ms。 这些设置可能不是最佳的。 (flus hed = 0,在此期间被驱逐= 0)。
2017-04-20T18:45:22.322429Z 0 [注] InnoDB:page_cleaner:1000ms预期循环花费26338ms。 这些设置可能不是最佳的。 (stream感病毒= 10,驱逐时间= 0)。
2017-04-20T18:45:53.926808Z 0 [注意] InnoDB:page_cleaner:1000ms打算循环花了4510ms。 这些设置可能不是最佳的。 (flus hed = 0,在此期间被驱逐= 0)。
2017-04-20T18:46:03.097400Z 0 [注意] InnoDB:page_cleaner:1000ms打算循环花了5384ms。 这些设置可能不是最佳的。 (flus hed = 13,在此期间被驱逐= 0)。
2017-04-20T18:46:39.247467Z 0 [注] InnoDB:page_cleaner:1000ms预期循环花费了14848ms。 这些设置可能不是最佳的。 (stream感病毒= 8,驱逐= 0,在此期间)。
2017-04-20T18:47:16.271672Z 0 [注意] InnoDB:page_cleaner:1000ms预期循环需要29107ms。 这些设置可能不是最佳的。 (stream感病毒= 8,驱逐= 0,在此期间)。
2017-04-20T18:47:53.669557Z 0 [注意] InnoDB:page_cleaner:1000ms预期循环花了5969ms。 这些设置可能不是最佳的。 (flus hed = 37,在此期间被驱逐= 0)。
2017-04-20T18:50:23.879411Z 0 [注意] InnoDB:page_cleaner:1000ms预期循环需要37671ms。 这些设置可能不是最佳的。 (stream感病毒= 6,驱逐时间= 0)。
2017-04-20T18:55:07.190725Z 0 [Warning]更改限制:max_open_files:1024(请求5000)2017-04-20T18:55:07.235759Z 0 [Warning]更改限制:table_open_cache:431(请求2000)
2017-04-20T18:55:10.486670Z 0 [Warning]带有隐式DEFAULT值的TIMESTAMP已被弃用。 请使用–explicit_defaults_for_times tamp服务器选项(请参阅文档以获取更多详细信息)。
2017-04-20T18:55:11.563578Z 0 [注] / usr / sbin / mysqld(mysqld 5.7.17-0ubuntu0.16.04.2)以24701进程启动…
2017-04-20T18:55:21.979225Z 0 [Note] InnoDB:PUNCH HOLE支持
2017-04-20T18:55:21.979250Z 0 [注意] InnoDB:Mutexes和rw_locks使用GCCprimefaces内build函数
2017-04-20T18:55:21.979253Z 0 [注] InnoDB:使用事件互斥体2017-04-20T18:55:21.979256Z 0 [注意] InnoDB:GCC内build__atomic_thread_fence()用于内存屏障
2017-04-20T18:55:21.979259Z 0 [注] InnoDB:压缩表使用zlib 1.2.8
2017-04-20T18:55:21.979262Z 0 [注] InnoDB:使用Linux本地AIO 2017-04-20T18:55:22.004800Z 0 [注] InnoDB:池数量:1
2017-04-20T18:55:22.060762Z 0 [注意] InnoDB:使用CPU crc32指令
2017-04-20T18:55:22.104584Z 0 [注意] InnoDB:初始化缓冲池,总大小= 128M,实例= 1,块大小= 128M
2017-04-20T18:55:24.184701Z 0 [注] InnoDB:完成缓冲池的初始化
2017-04-20T18:55:24.210160Z 0 [注意] InnoDB:如果mysqld执行用户被授权,可以改变页面清理线程的优先级。 请参阅setpriority()的手册页。
2017-04-20T18:55:26.405242Z 0 [注] InnoDB:支持的最高文件格式是梭子鱼。
2017-04-20T18:55:27.508456Z 0 [注意] InnoDB:日志扫描已经超过了检查点lsn 35288448161
2017-04-20T18:55:27.508478Z 0 [注] InnoDB:恢复:扫描到日志序列号35288448170
2017-04-20T18:55:27.508630Z 0 [注] InnoDB:恢复:扫描到日志序号35288448170
2017-04-20T18:55:27.508634Z 0 [注意] InnoDB:数据库没有正常关机!
2017-04-20T18:55:27.508637Z 0 [注意] InnoDB:启动崩溃恢复。
2017-04-20T18:56:16.516761Z 0 [注] InnoDB:删除临时表空间数据文件:“ibtmp1”
2017-04-20T18:56:16.516785Z 0 [注] InnoDB:为临时表创build共享表空间
2017-04-20T18:56:16.516817Z 0 [注] InnoDB:将文件'./ibtmp1'的大小设置为12 MB。 物理写满文件; 请稍候 …
2017-04-20T18:56:16.621736Z 0 [Note] InnoDB:文件'./ibtmp1'的大小现在是12 MB。
2017-04-20T18:56:16.622203Z 0 [注] InnoDB:find96个重做回滚段。 96个重做回滚段处于活动状态。
2017-04-20T18:56:16.622211Z 0 [注] InnoDB:32个非重做回滚段处于活动状态。
2017-04-20T18:56:16.622565Z 0 [注] InnoDB:等待清洗开始
2017-04-20T18:56:16.672708Z 0 [注] InnoDB:5.7.17开始; 日志序列号35288448170
2017-04-20T18:56:16.672708Z 0 [注意] InnoDB:page_cleaner:1000ms的预期循环需要52462ms。 这些设置可能不是最佳的。 (刷新= 0,被驱逐= 0,在此期间)。
2017-04-20T18:56:16.673192Z 0 [注] InnoDB:从/ var / lib / mysql / ib_buffer_pool加载缓冲池
2017-04-20T18:56:16.702959Z 0 [注]插件'FEDERATED'被禁用。
2017-04-20T18:56:16.851553Z 0 [错误]函数'archive'已经存在
2017-04-20T18:56:16.851568Z 0 [Warning]无法加载名为'archive'的插件与soname'ha_archive.so'。
2017-04-20T18:56:16.851574Z 0 [错误]function'黑洞'已经存在
2017-04-20T18:56:16.851575Z 0 [Warning]无法加载名为'blackhole'的插件与soname'ha_blackhole.so'。
2017-04-20T18:56:16.851578Z 0 [错误]函数'federated'已经退出2017-04-20T18:56:16.851579Z 0 [Warning]无法加载名为'federated'的插件soname'ha_federated.so' 。
2017-04-20T18:56:16.851582Z 0 [错误]函数'innodb'已经存在2017-04-20T18:56:16.851583Z 0 [Warning]无法加载名为'innodb'的插件soname'ha_innodb.so' 。
2017-04-20T18:56:17.044733Z 0 [警告]由于以下SSL库错误,无法设置SSL:没有证书和私钥,SSL上下文无法使用
2017-04-20T18:56:17.044754Z 0 [注]服务器主机名(bind-address):'0.0.0.0'; 港口:3306
2017-04-20T18:56:17.044761Z 0 [注] – '0.0.0.0'parsing为'0.0.0.0';
2017-04-20T18:56:17.044779Z 0 [注意]在IP上创build的服务器套接字:“0.0.0.0”。 2017-04-20T18:56:18.483575Z 0 [Note] Event Scheduler:加载了0个事件
2017-04-20T18:56:18.483706Z 0 [Note]执行'SELECT * FROM INFORMATION_SCHEMA.TABLES';' 使用废弃的分区引擎获取表的列表。 您可以使用启动选项“–disable-partition-engine-check”跳过此检查。
2017-04-20T18:56:18.483716Z 0 [注意]非本地分区表的列表的开始
2017-04-20T18:56:25.478293Z 0 [注] InnoDB:缓冲池加载完成时间为170420 13:56:25
2017-04-20T18:56:26.091240Z 0 [注意]非本地分区表的列表结束
2017-04-20T18:56:26.091423Z 0 [注] / usr / sbin / mysqld:准备连接。 版本:'5.7.17-0ubuntu0.16.04.2'socket:'/var/run/mysqld/mysqld.sock'port:3306(Ubuntu)
2017-04-20T18:56:26.155810Z 4 [错误] / usr / sbin / mysqld:表'./example/wp_options'被标记为崩溃,应该修复
2017-04-20T18:56:26.155889Z 5 [错误] / usr / sbin / mysqld:表'./example/wp_options'被标记为崩溃,应该修复
2017-04-20T18:56:26.156037Z 4 [Warning]检查表格:'./ example / wp_options'
2017-04-20T18:56:35.816730Z 4 [错误] / usr / sbin / mysqld:表'./example/wp_usermeta'被标记为崩溃,应该修复
2017-04-20T18:56:35.816875Z 4 [Warning]检查表格:'./example/wp_usermeta'

最后两点表明问题。 你的坏块怀疑似乎是有根据的。

  • 尝试移动虚拟机时出现文件错误
  • 坏块每次都会在同一个地方崩溃。

在服务器运行时,将数据库转储到主机操作系统上的文件。 由于服务器崩溃,并且您不清楚它在访问时访问的表,数据库或logging的具体情况,请花时间分别转储每个数据库,甚至每个表。 希望坏块不会出现在您的数据中,但在系统正在尝试使用的某个文件中。 在任何情况下,如果其中一个转储触发了崩溃,如果您想再次检查它,请将该表或数据库视为可疑,然后尽可能手动进行检查。

然后在不同的物理磁盘上创build一个新的虚拟机,并安装所有需要的安装。 导入转储的数据,包括任何可疑数据的检查版本。 在所有的表格上,对数据进行一些随机的完整性检查,特别是从任何可疑的转储中build立的表格。 然后做任何你认为合适的testing,以确保新的虚拟机和数据库正常工作,并有有效的数据。

将新的虚拟机作为“活动”服务器,退出旧的虚拟机,然后开始备份/恢复其他物理驱动器,这些虚拟机包含崩溃的服务器虚拟机。 一旦从磁盘中检索到所有或所有可用的数据,就可以确定它的健康状况(怀疑),以及是否愿意相信这些数据以用于重要数据。 也许它可以作为一个放置你的/tmp目录,或其他瞬态结构,或者作为交换空间的地方,为重要的数据释放另一个可能是好的磁盘空间。