10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册节选

B.3.3.3 MySQL一直崩溃怎么办

每个MySQL版本在发布之前都要在许多平台上进行测试。这并不意味着MySQL中没有错误,但如果有错误,它们应该很少,而且很难发现。如果您遇到问题,尝试找出导致系统崩溃的确切原因总是有帮助的,因为您有更好的机会快速解决问题。

首先,你应该试着找出问题是否在于mysqld服务器坏了,或者你的问题与你的客户端有关。你可以检查你的mysqld服务器已通过执行启动mysqladmin版本.如果mysqld已经死亡并重新启动,您可以通过查看服务器的错误日志找到原因。看到第5.4.2节“错误日志”

在某些系统上,您可以在错误日志中找到位置的堆栈跟踪mysqld死亡。请注意,错误日志中写入的变量值可能并不总是100%正确。

许多意外的服务器退出是由损坏的数据文件或索引文件引起的。数据库更新磁盘上的文件write ()在每条SQL语句之后,在通知客户端结果之前,系统调用。(如果你用的是delay_key_write启用系统变量,在这种情况下写入数据文件,但不写入索引文件。)这意味着数据文件内容是安全的,即使mysqld崩溃,因为操作系统确保将未刷新的数据写入磁盘。您可以通过启动强制MySQL在每个SQL语句之后将所有内容刷新到磁盘mysqld——平选择。

前面的意思是,通常你不应该得到损坏的表,除非发生以下情况之一:

  • MySQL服务器或服务器主机在更新过程中被杀死。

  • 您已经发现了一个漏洞mysqld这导致它在更新过程中死亡。

  • 一些外部程序正在同时操作数据文件或索引文件mysqld没有正确地锁定表。

  • 你跑了很多mysqld在不支持良好文件系统锁的系统上使用相同数据目录的服务器(通常由lockd锁定管理器),或者您正在运行多个禁用外部锁定的服务器。

  • 您有一个崩溃的数据文件或索引文件,其中包含非常混乱的损坏数据mysqld

  • 您在数据存储代码中发现了一个错误。这不太可能,但至少是可能的。在这种情况下,您可以尝试使用将存储引擎更改为另一个引擎ALTER TABLE在一张修复好的桌子上。

因为很难知道某件事为什么会崩溃,所以首先试着检查一下,对别人有效的事情是否会导致你意想不到的退出。试试下面的方法:

  • 停止mysqld服务器与mysqladmin关闭、运行Myisamchk——无声——力*/*。MYI从数据目录中检查全部MyISAM表,并重新启动mysqld.这确保您正在从一个干净的状态运行。看到第五章,MySQL服务器管理

  • 开始mysqld启用了常规查询日志(请参阅第5.4.3节“一般查询日志”).然后尝试从写入日志的信息中确定某个特定的查询是否杀死了服务器。大约95%的错误都与特定的查询有关。通常,这是在服务器重新启动之前日志文件中的最后一个查询。看到第5.4.3节“一般查询日志”.如果您可以反复使用特定的查询杀死MySQL,即使在发出查询之前检查了所有表,那么您已经隔离了错误,并且应该提交错误报告。看到第1.6节,“如何报告错误或问题”

  • 试着做一个测试用例,我们可以用来重复这个问题。看到章节5.9,“调试MySQL”

  • fork_big.pl脚本。(它位于测试源代码发行版目录。)

  • 为调试配置MySQL可以在出现错误时更容易地收集有关可能错误的信息。重新配置MySQL-DWITH_DEBUG = 1选项CMake然后重新编译。看到章节5.9,“调试MySQL”

  • 确保您已经为您的操作系统应用了最新的补丁。

  • 使用——skip-external-locking选项mysqld.在某些系统上,lockd锁管理器不能正常工作;的——skip-external-locking选项告诉mysqld不使用外部锁定。(这意味着您不能运行两个mysqld服务器上的数据目录相同,使用时必须小心myisamchk.尽管如此,尝试这个选项作为测试可能是有益的。)

  • 如果mysqld似乎在运行,但没有响应,试试Mysqladmin -u root processlist.有时mysqld即使它看起来没有反应,也不会被挂起。问题可能是所有连接都在使用,或者可能存在一些内部锁问题。Mysqladmin -u root processlist通常即使在这些情况下也能够建立连接,并且可以提供有关当前连接数量及其状态的有用信息。

  • 执行命令Mysqladmin -i 5 statusMysqladmin -i 5 -r status在一个单独的窗口中生成统计数据,同时运行其他查询。

  • 试试下面的方法:

    1. 开始mysqld广东发展银行(或其他调试器)。看到章节5.9,“调试MySQL”

    2. 运行您的测试脚本。

    3. 在最低的三个级别打印回溯和局部变量。在广东发展银行时,您可以使用以下命令执行此操作mysqld已经崩溃了广东发展银行

      回溯信息本地up信息本地up信息本地

      广东发展银行,您还可以检查哪些线程存在信息线程并切换到特定的线程线程N,在那里N是线程ID。

  • 尝试用Perl脚本模拟应用程序,以强制MySQL退出或出错。

  • 发送一个正常的错误报告。看到第1.6节,“如何报告错误或问题”.要比平时更详细。因为MySQL适用于许多人,所以崩溃可能是由于只存在于您的计算机上的某些东西(例如,与您的特定系统库相关的错误)。

  • 如果您对包含动态长度行的表有问题,并且您只使用VARCHAR列(不文本列),您可以尝试全部更改VARCHAR字符ALTER TABLE.这迫使MySQL使用固定大小的行。固定大小的行占用一点额外的空间,但对损坏的容忍度更高。

    当前的动态行代码已经使用了几年,问题很少,但是动态长度的行本质上更容易出错,因此尝试这种策略看看它是否有帮助可能是一个好主意。

  • 诊断问题时应考虑硬件故障的可能性。有缺陷的硬件可能是数据损坏的原因。在排除硬件故障时,要特别注意内存和磁盘子系统。