我们的 mysql 系统每隔两天就会“冻结”一次。
我所说的“冻结”是指:
- 它没有响应 ping
- 我们无法使用 SSH 登录
- 我们没有收到来自 MySQL 的任何答复
- 错误日志中没有条目!无论是来自 Linux 还是来自 MySQL。
- 我们已经换了全新的硬件,还是出现同样的问题,所以肯定不是硬件问题。
- 除了防火墙(iptables 规则)之外,我们没有安装任何其他软件
- 我们可以使用 rsyslog (www.rsyslog.com) 从另一台服务器重新启动服务器(软件重置)
有人能帮我吗?给我一些建议,告诉我该怎么做才能解决问题?我已经包含了有关我们设置的每个细节。
预先感谢您的帮助。 最大限度。
我们的系统参数及设置:
- 系统内存:12GB
- 处理器:英特尔 7-920 四核
- 操作系统:Debian 5(lenny)64位
- MySQL 5.1.49
- 数据库:(a)一个小型 phpbb 论坛(b)一个 6GB 数据库,3 个表,约 1500 万行
我的cnf
# # MySQL 数据库服务器配置文件。 # # 您可以将其复制到以下位置之一: #-“/etc/mysql/my.cnf”设置全局选项, #-“~/.my.cnf”设置用户特定选项。 # # 可以使用程序支持的所有长选项。 # 使用 --help 运行程序以获取可用选项列表,并使用 # --print-defaults 查看它实际上能够理解和使用哪一个。 # # 解释请参见 #http://dev.mysql.com/doc/mysql/en/server-system-variables.html # 这将传递给所有 mysql 客户端 # 有报告称密码应该用勾号/引号括起来 # 特别是如果它们包含“#”字符…… # 更改套接字位置时,请记住编辑 /etc/mysql/debian.cnf。 [客户] 端口 = 3306 套接字 = /var/run/mysqld/mysqld.sock # 以下是一些特定程序的条目 # 以下值假设您至少有 32M 内存 # 这以前被称为 [safe_mysqld]。目前两个版本都已解析。 [mysqld_safe] 套接字 = /var/run/mysqld/mysqld.sock 好 = 0 [mysqld] # # * 基本设置 # 用户 = mysql pid 文件 = /var/run/mysqld/mysqld.pid 套接字 = /var/run/mysqld/mysqld.sock 端口 = 3306 basedir = /usr 数据目录 = /var/lib/mysql tmpdir = /tmp 语言 = /usr/share/mysql/english 跳过外部锁定 # # 现在默认不再跳过网络,而是只监听 # localhost 兼容性更强,安全性也更高。 绑定地址 = 我们的 IP 地址 # # * 微调 # 密钥缓冲区 = 16M 最大允许数据包 = 16M 线程堆栈 = 256K 线程缓存大小 = 32 最大连接数 = 300 表缓存 = 2048 #thread_concurrency = 4 # 对于 InnoDB 表建议使用 50%-80% 的可用内存 innodb_buffer_pool_size = 6G # 有时更大 20MB innodb_additional_mem_pool_size = 20M # 8M-16M 适用于大多数情况 innodb_log_buffer_size = 8M # 禁用 XA 支持,因为我们不使用它 innodb-支持-xa = 0 # 1 是默认值,100% 安全,但 2 性能更佳 innodb_flush_log_at_trx_commit = 1 innodb_flush_method = O_DIRECT #innodb_thread_concurency = 8 # 建议 64M - 512M,具体取决于服务器大小 innodb_log_file_size = 512M # 每个表一个文件 表 1. innodb_file_per_table # # * 查询缓存配置 # 查询缓存限制 = 1M 查询缓存大小 = 16M #查询缓存类型 = 1 #query_cache_min_res_unit= 2K #join_buffer_size = 1M # # * 日志记录和复制 # # 两个位置都由 cronjob 轮换。 # 请注意,这种日志类型会降低性能。 # 从 5.1 开始,您可以在运行时启用日志! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # # 错误日志记录到 syslog。这是 Debian 的一项改进 :) # # 在这里你可以看到持续时间特别长的查询 log_slow_queries = /var/log/mysql/mysql-slow.log 长查询时间 = 2 记录未使用索引的查询 # # 以下内容可以轻松重放备份日志或进行复制。 #服务器 ID = 1 log_bin = /var/log/mysql/mysql-bin.log # 警告:使用 expire_logs_days 而不使用 bin_log 会导致服务器崩溃!请参阅 README.Debian! 过期日志天数 = 10 max_binlog_size = 100M #binlog_do_db = include_database_name #binlog_ignore_db = include_database_name # # InnoDB 默认启用,在 /var/lib/mysql/ 中有一个 10MB 的数据文件。 # 阅读手册了解更多与 InnoDB 相关的选项。有很多! # * InnoDB 插件 # 从 MySQL 5.1.38 开始,Oracle 的 InnoDB 插件包含在 MySQL 源代码中。 # 比内置的InnoDB存储引擎有很多改进,性能更好。 # 请阅读http://www.innodb.com/products/innodb_plugin/以了解更多信息。 # 取消注释以下两行以使用 InnoDB 插件。 忽略_builtin_innodb 插件加载=innodb=ha_innodb_plugin.so # # * 安全功能 # # 如果您想要 chroot,也请阅读手册! #chroot = /var/lib/mysql/ # # 为了生成 SSL 证书,我推荐使用 OpenSSL GUI“tinyca”。 # #ssl-ca=/etc/mysql/cacert.pem #ssl-cert=/etc/mysql/server-cert.pem #ssl-key=/etc/mysql/server-key.pem [mysqldump] 快的 引述名称 最大允许数据包 = 16M [mysql] #no-auto-rehash # mysql 启动速度更快,但没有 tab 键补全 [isamchk] 密钥缓冲区 = 16M # #* NDB 集群 # # 查看 /usr/share/doc/mysql-server-*/README.Debian 了解更多信息。 # # NDB 数据节点(ndbd 进程)读取以下配置 # 不是来自 NDB 管理节点(ndb_mgmd 进程)。 # # [MYSQL_集群] #ndb-连接字符串=127.0.0.1 # # * 重要:附加设置可以覆盖此文件中的设置! # !includedir /etc/mysql/conf.d/
更新 安装 sysstat 并将其配置为每分钟收集一次数据后,我得到了以下数据。我使用了特区生成以下输出:
日志文件太大,无法在此处输入,但已上传到 box.net。链接是 http://www.box.net/shared/xc6rh7qqob
第二次更新 我们在后台启动了 ping 命令,问题就解决了。现在服务器已经工作了一周多了。我们仍然不知道问题出在哪里。
答案1
您的服务器负载是否很重?
您是否检查过系统资源是否耗尽? sysstat 包是监控系统资源的绝佳方法。
服务器是否会在一段时间后“解冻”,或者它会完全锁定直到您重新启动它?
我目前有时会在自己的服务器上看到类似的行为,因此我想更多地了解您的问题是如何发生的,现在它有很多相似之处。
答案2
听起来像是网络连接问题。您已将硬件排除在范围之外,并且整个服务器都无法访问,这不太可能是系统问题,除非日志中反映出某种程度的问题。如果服务器没有重新启动或日志中没有问题,则会影响一切,专注于网络。
答案3
MySQL 数据文件夹使用本地磁盘还是 SAN/NAS?当 /var/lib/mysql 安装在 iSCSI 目标上,并且在大型索引重新计算期间超出 TOE 缓冲区时,我看到了类似的、无法解释的行为。