【问题标题】:Hard to debug "Mysql server has gone away"难以调试“Mysql 服务器已消失”
【发布时间】:2011-09-01 07:20:08
【问题描述】:

我正在使用 Mysql 后台数据库运行 MsAccess,今天我遇到了一些问题。

根据我可以进入程序的程度,我可以获得所有名称和条目的列表。但是,一旦我进入任何条目的编辑表单,我就会得到各种结果。有时我很幸运,我可以看到第一个条目。但是之后的任何条目总是会得到一个 MsAccess 错误:Object invalid or no longer set,然后之后的任何后续调用都会产生一个 Mysql ODBC 错误 Mysql server has gone away。

我浏览了几个网站,甚至所有的堆栈溢出网站,都有相同的问题,我尝试了各种解决方案。 (请记住,该数据库已经运行多年,这是我第一次收到此消息)它还需要大约 2m14s 到 2m59s 才能显示任何错误消息。

这是我目前尝试过的:

  1. 我已尝试更改一些 ODBC 连接设置。
    • 选中允许大结果 - 失败
    • 选中启用自动重新连接 - 失败
  2. 我检查并修复了表格 - 失败
    • 导致大量表,“表需要更新,请修复表”
  3. 我将 my.cnf 配置中的数字翻了一番,并重新启动了 mysql 服务以及 msaccess 软件。 失败
    • 这些是我进行更改后 my.cnf 的设置。

这里:

set-variable = max_connections=500
safe-show-database
log-error=/var/log/mysqld.log
connect_timeout=1000
interactive_timeout=28800
wait_timeout=288000          <**This was changed**

join_buffer_size=6M
key_buffer_size=300M         <**THIS WAS CHANGED **
max_allowed_packet=300M      <**THIS WAS CHANGED **
myisam_sort_buffer_size=300M <**THIS WAS CHANGED **
read_buffer_size=6M
sort_buffer_size=6M
table_cache=12288
thread_cache_size=24
tmp_table_size=132M
query_cache_limit=3M
query_cache_size=64M
query_cache_type=1

基本上我已经尝试了到目前为止我能找到的每一个建议,但我似乎无法找出问题所在。

我也看过MYSQL: Has gone away 如果我在那里查看项目符号列表

  • 没有人杀死正在运行的线程
  • 我认为在连接关闭后没有运行查询(因为它运行了多年)
  • 客户端应用程序确实具有所需的权限
  • 我不知道如何判断客户端的 TCP/IP 连接是否超时
  • 我不知道我是否在服务器端遇到超时,但我知道客户端中的自动重新连接已禁用
  • ???
  • 查询可能很大,因为它是一个包含许多子表单的表单
  • ???
  • DNS 应该没问题,因为我可以使用真正的 sql 查看器 (HeidiSQL) 连接到它
  • ???子叉???
  • ???

我认为这是由于我筋疲力尽而难以弄清楚的错误之一:/ 我可能遗漏了一些信息,但我不确定还包括什么。

---编辑---

谢谢大家的cmets,我还在调试这个问题。似乎并不是所有的形式都会导致一些问题。所以我开始认为这是一个 MSAccess 问题,而不是一个 MySql 问题。确实中断的表单在其 VBA 代码中都有相同的行:

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    If Screen.ActiveControl.Name = "UnboundTextBox" Then
       Response = acDataErrContinue
    End If
End Sub

我不记得把这段代码放进去,所以我认为这是一个自动的事情,但我仍在检查我的所有表单,看看哪些导致了这个错误,哪些没有。所以更多。

---今天我正在做一些调试,试图从我能收集到的任何日志中找到我能找到的任何东西----

 MSACCESS        17ec-b10   EXIT  SQLStatisticsW  with return code -1 (SQL_ERROR)
    HSTMT               0AF82920
    WCHAR *             0x00000000 [      -3] <empty string>
    SWORD                       -3 
    WCHAR *             0x00000000 [      -3] <empty string>
    SWORD                       -3 
    WCHAR *             0x0013AAE8 [      -3] "location\ 0"
    SWORD                       -3 
    UWORD                        1 <SQL_INDEX_ALL>
    UWORD                        0 <SQL_QUICK>

    DIAG [08S01] [MySQL][ODBC 3.51 Driver][mysqld-5.0.92-community]Lost   
 connection to MySQL server during query (2013) 

------------------------------ 最终编辑 ---------------- ----------

过去一周左右,我的老板一直在努力为我们的办公室安装新的内部服务器。我们还多次切换 IP 和 ISP 提供商。结果,他为我制造了一场管理噩梦,因为我试图调试服务器的问题,以及软件等问题。当问题出现在 ISP 提供商使用路由器设置建立的设置中时等等……等等……所以基本上这整个头痛都不是服务器有问题,也不是软件问题,而是介于两者之间的硬件问题。

所以现在,我必须对我所做的一切进行反向工程,并尝试让它在两个 ips 上工作。它现在适用于重要的一个。但它不适用于旧的所以......我想我只需要弄清楚这一点。 [在空中挥舞着假想的拳头]大声笑

【问题讨论】:

  • 您知道您可以 ping 服务器以使其保持活动状态吗,(虽然不知道如何从 msaccess 调用它)dev.mysql.com/doc/refman/5.1/en/mysql-ping.html
  • 您是否有多个客户端在运行?如果是,您是否在所有客户端机器上都存在此问题?
  • 您最近是否对 MySQL 表进行了任何更改?您需要在 Access 中删除链接的表,然后重新链接它们才能正确查看任何更改。
  • 同一个盒子的不同 mysql 客户端会发生什么?也许是一个简单的命令行界面?
  • 对于 ODBC 链接表,您不想更新它们,而是想删除它们并从头开始重新创建它们。这是因为在链接表定义中缓存了有关服务器的元数据,当您刷新链接时,这些元数据不会更新。更改链接表或链接视图的结构可能会导致其中断或变为只读,修复它的唯一方法是删除链接表并重新创建它。

标签: mysql ms-access


【解决方案1】:
[mysqld-5.0.92-community]Lost   
connection to MySQL server during query (2013) 

这个 genary 表示你在 MySQL-Server 中发现了一个 bug 你能贴出你的 mysqld.err 和 mysqd.log 的尾巴吗

这会使服务器重新启动并有效关闭所有打开的连接

【讨论】:

  • 感谢您的回复。不幸的是,我的服务器上没有 mysqld.err 文件。 (find / -name mysqld.err) 我的 mysqld 没有崩溃,我的服务器每天重新启动一次(它也没有崩溃)所以盒子本身似乎没有错误。不幸的是,我目前正在远程控制我的工作电脑,所以我会在早上在原始帖子上发布我的 mysqld.log。有趣的是,虽然没有什么不寻常的。由于我正在更改 my.cnf,它只显示我重新启动的次数。 (之前最早的错误是在 11-05-15,其余的只是我重新启动)虽然
  • 我无法在 my.cnf 中打开 general_logs=on,我得到:: unknown variable 'general_log=on'
【解决方案2】:

我没有在生产环境中将 MySQL 与 Access 一起使用,但您遇到的问题听起来与我在使用 SQL Server 时遇到的问题很相似。基本上,如果客户端工作站的 DNS 设置不正确,它可能会对如何解析与 SQL Server 的连接感到困惑并失去连接。在我遇到这种情况的情况下,工作站被错误地配置为使用 Internet 提供商的 DNS 作为主要 DSN,但 SQL Server 是本地服务器,仅在本地 LAN 上可用(而不由 ISP DNS 映射)。

解决方案是使用本地域控制器作为主 DNS。它将查找本地 SQL Server 的 IP,并将任何非本地查找传递给 Internet 提供商的 DNS。

如果您没有 Windows/Samba 域控制器,那么您需要使用本地 LAN 的授权名称服务器。或者,您可以通过 IP 地址连接到 MySQL 服务器并避免该问题,或者将其映射到客户端工作站的 HOSTS 文件中(不建议这样做——这是在 IP 地址更改时导致非常难以解决问题的好方法) .

【讨论】:

  • 我相信你是最接近我问题根源的人。尽管我永远不会删除所有表格以再次重新链接它们,(这只是纯粹的精神错乱:P [不是真正的精神错乱,而是一种不得已的措施,或者一次测试一个表格的措施,而不是所有表格一口气。])我不确定我是否理解您的答案,因为我们的服务器是外部的(目前)但这很可能会帮助其他有类似问题的人。我似乎找到了问题的原因,我在上面进行了更新。感谢您与我一起度过的时光。
  • ODBC 链接表必须在它们链接到的表/视图发生更改时删除并重新创建。否则,它们将无法充分发挥作用。没有两种方法可以解决这个问题,但是在 Access 中编写代码真的很容易,所以我不知道为什么会出现问题。
  • 无论服务器在哪里,如果 DNS 无法正确解析(或间歇性可用于解析),都可能导致此类问题。当服务器在本地时我遇到过,但理论上它在远程时可能同样是一个问题。
  • 当我过去更改表格时,我通常只是重新链接表格。我以前对此没有太多问题,但我很想知道并看看他们是如何失败的。您是否碰巧有一个示例更改,我可以对表进行更改以复制这些失败?如果我有点抗拒,我提前道歉。
  • 可能取决于数据库服务器。对于 SQL Server,重新链接(即刷新链接表)不会清除所有元数据。我从未在 MySQL 上尝试过(我只是在更改结构时重新创建链接表),所以链接表中存储的元数据类型可能会导致问题。我仍然看不到删除链接表并重新创建它们的问题。这是一件非常简单的事情(遍历 TableDefs 集合,将要删除的每个表的信息存储在数组中,删除它们,然后从数组中恢复)。
【解决方案3】:

问题是连接超时。这不是您可以在 ODBC 级别更改的设置。我的 MySQL 提供程序已将超时设置为 30 秒(您可以在我运行 PassThrough 查询“SELECT @@wait_timeout”时找出您的设置)。我通过一个简单的表格每 10 秒轮询一次连接来解决这个问题。这使连接保持活跃。确保您有一个可以打开表单的 AutoExec 宏。

Private Sub Form_Open(Cancel As Integer)
    Me.TimerInterval = 1000 ' 10 seconds
End Sub

Private Sub Form_Timer()
    Me.Requery
End Sub

【讨论】:

  • 我不知道这个功能,听起来很棒!伙计,我希望我能记得我是如何或做了什么来解决这个问题,因为我已经很长时间没有看到它了。但是我真的很喜欢您的解决方案,如果这实际上是问题所在,我不会感到惊讶。我要牢记在心,以备将来之用。谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2011-06-07
  • 2010-12-20
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多