我使用 shell 中的这个命令修复所有数据库
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
然后我重启了服务器
当它再次恢复运行时,我尝试打开我的 vBulletin 论坛,但收到了数据库错误消息。
并尝试打开 phpMyAdmin 但收到此错误:
#2002 - The server is not responding (or the local MySQL server's socket is not correctly configured).
我检查了服务列表,发现没有列出 MySQL 服务,因此我尝试从 shell 启动它,但收到此错误:
Starting MySQL.Manager of pid-file quit without updating fi[FAILED]
有人能帮助我吗?
提前致谢。
更新
我在日志文件中找到了这些行
101101 01:36:01 mysqld started
101101 1:36:01 [Warning] Asked for 196608 thread stack, but got 126976
101101 1:36:01 [ERROR] /usr/sbin/mysqld: Table './mysql/user' is marked as crashed and last (automatic?) repair failed
101101 1:36:01 [ERROR] /usr/sbin/mysqld: Table './mysql/user' is marked as crashed and last (automatic?) repair failed
101101 1:36:01 [ERROR] Fatal error: Can't open and lock privilege tables: Table './mysql/user' is marked as crashed and last (automatic?) repair failed
101101 01:36:01 mysqld ended
那我该怎么办?
答案1
当 mysqld 没有正确关闭时,就会发生这种情况。基本上,pid 文件(包含当前正在运行的进程的进程 ID 的文件)的存在是为了检测进程是否正在运行。当系统失灵时(即,它找到了 pid 但找不到进程,这意味着服务器没有正确停止),它需要手动干预。
简单rm /var/run/mysqld.pid
来说你应该会没事。
安德鲁
更新:根据您最近的日志文件(以及自动修复失败的事实),以下是关于其他修复方法的精彩帖子。此外,请确保服务器上有足够的磁盘空间。
答案2
尝试使用 --skip-grant-tables 启动 mysqld,这样它就不会尝试加载(崩溃的)用户表。
/etc/init.d/mysqld start --skip-grant-tables
然后登录mysql
mysql
然后在用户表上尝试修复命令
use mysql;
REPAIR TABLE user;
我不确定语法是否100%正确。
答案3
我认为你需要 mysqlrepair:
mysqlrepair -r tablename
(刚刚意识到这与 mysqlcheck 相同。)
您需要的是明确修复而不是自动修复。
答案4
我在 xampp 上遇到了同样的问题,对于 xampp,首先转到C:\xampp\mysql\bin\
并启动守护进程
mysqld --skip-grant-tables --datadir=C:\xampp\mysql\data\
然后在同一路径上打开另一个终端并运行mysqlcheck
以查找哪些表需要修复
mysqlcheck mysql -a
之后运行mysql
并修复表格
mysql
use mysql;
REPAIR TABLE table_name;
我希望可以修复它而不会出现任何问题