我尝试将innodb_buffer_pool_size
其my.cnf
从默认的 128m 增加到 256m,但在重新启动时,mysql 关闭失败,并显示:
130125 11:49:55 InnoDB: Initializing buffer pool, size = 256.0M
130125 11:49:55 InnoDB: Completed initialization of buffer pool
InnoDB: Unable to lock ./ibdata1, error: 11
MySQL 已启动并正在运行,但任何通过终端尝试“mysql -u root -p”的操作都会失败:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
我在适当的位置 touch/chown mysql.sock 和 mysqld.pid(因为它们丢失了,不好),但仍然无法进入 mysql。
有昨晚的转储,但希望获得今天的转储来查看 ibdata1 是否已损坏(读/写操作似乎正常,因此如果它已损坏,mysql 将关闭,不是吗?)
不用说,担心尝试重新启动!我们有一个通过连接池连接到 MySQL 的 Java 应用程序;那里是否发生锁定?
无论如何,对于如何处理这种情况的想法值得赞赏。可能会克隆运行 MySQL 的 VM 并导入 /var/lib/mysql 目录以查看发生了什么,但如果只是重新创建 sock 和 pid 文件并重新启动,那就没必要浪费一个下午了。
答案1
有其他东西在 ibdata1 上持有文件锁。使用lsof
ibdata1 并找出谁在持有锁。
答案2
解决了这个问题,mysql.sock 和 mysql.pid 文件不见了,所以我:
touch /var/lib/mysql/mysql.sock
chown mysql.mysql /var/lib/mysql/mysql.sock
touch /var/run/mysqld/mysqld.pid
chown mysql.mysql /var/run/mysqld/mysqld.pid
echo [pid of running mysqld] > /var/run/mysqld/mysqld.pid
mysqld 服务正在运行,因此客户端站点一切正常,但鉴于日志中的惊人错误,我认为 ibdata 文件已损坏:“无法打开或创建数据文件...InnoDB 只写入了那些充满零的文件,但尚未以任何方式使用它们。但请小心,不要删除包含您宝贵数据的旧数据文件!”
我的意思是,考虑到大量的警告和错误,很难不认为天要塌下来了——看起来事情已经变得一团糟,但在这种情况下,根本没有。
通过终端会话运行上述操作,然后service mysql restart
,瞧,业务仍在进行中和缓冲池大小增加到 256MB,正如我my.cnf
今天早上进行更改时最初打算的那样。
至于问题的原因,我已经运行mysqltuner.pl
检查性能瓶颈;这必须在正在运行的 mysqld 进程之外创建一个新的 mysqld 进程,该进程在脚本运行后保持连接(重启失败时 grep 正在运行的进程有 4 个 mysqld 进程,其中 2 个用于 root mysqld_safe,2 个用于 mysql mysqld)。
终止 mysqltuner.pl 创建的进程并不能解决问题,因为 mysql.sock 和 mysql.pid 文件也随之消失,然后我就无法进入 mysql 客户端了。查看日志时,我担心会发生最坏的情况,并花了几个小时在网上搜索。
无事生非 ;-)