问题一:Table xx is marked as crashed and last (automatic?) repair failed
某一天网站突然不能发布文章入库,检查发现数据库坏了,连不上数据库,看了下 MySQL 的错误日志,报错如下:
Error: Table './db_name/table_name' is marked as crashed and last (automatic?) repair failed
修复方法一:
1、先停止 MySQL:service mysqld stop
2、进入到 MySQL 数据库的文件存放目录,比如 cd /data/mysql_data/xx_db
然后执行如下命令:
D:\PiaoYun.CC\mysql\MySQL8.1\bin\myisamchk.exe --safe-recover -f -r *.MYI
3、启动 MySQL:service mysqld start
4、最后,执行再次自动修复优化命令即可解决:
D:\PiaoYun.CC\mysql\MySQL8.1\bin\mysqlcheck.exe --auto-repair --optimize --all-databases -u用户 -p密码 -P端口
修复方法二:
Navicat数据库软件即可修复
找到报错的数据表,右键维护->修复表->拓展或者快速。
mysqlcheck参数详解:
---help,-?
显示帮助消息并退出。
--all--database,-A
检查所有数据库中的所有表。与使用---database选项相同,在命令行中命名所有数据库。
--all-in-1,-1
不是为每个表发出一个语句,而是为命名数据库中待处理的所有表的每个数据库执行一个语句。
--analyze,-a
分析表。
--auto-repair
如果某个被检查的表破坏了,自动修复它。检查完所有表后自动进行所有需要的修复。
--character-sets-dir=path
字符集的安装目录。参见5.10.1节,“数据和排序用字符集”。
--check,-c
检查表的错误。
--check-only-changed,-C
只检查上次检查以来已经更改的或没有正确关闭的表。
--compress
压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。
---database,-B
处理数据库中命名的所有表。使用该选项,所有字名参量被看作数据库名,而不是表名。
---debug[=debug_options],-# [debug_options]
写调试日志。debug_options字符串通常为'd:t:o,file_name'。
--default-character-set=charset
使用charsetas默认字符集。参见5.10.1节,“数据和排序用字符集”。
--extended,-e
如果你正使用该选项来检查表,可以确保它们100%地一致,但需要很长的时间。
如果你正使用该选项来修复表,则运行扩展修复,不但执行的时间很长,而且还会产生大量的垃圾行!
--fast,-F
只检查没有正确关闭的表。
--force,-f
即使出现SQL错误也继续。
--host=host_name,-h host_name
连接给定主机上的MySQL服务器。
--medium-check,-m
执行比--extended操作更快的检查。只能发现99.99%的错误,在大多数情况下这已经足够了。
--optimize,-o
优化表。
--password[=password],-p[password]
当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。
--port=port_num,-P port_num
用于连接的TCP/IP端口号。
--protocol={TCP | SOCKET | PIPE | MEMORY}
使用的连接协议。
--quick,-q
如果你正使用该选项在检查表,它防止扫描行以检查错误链接的检查。这是最快的检查方法。
如果你正使用该选项在修复表,它尝试只修复索引树。这是最快的修复方法。
--repair,-r
执行可以修复大部分问题的修复,只是唯一值不唯一时不能修复。
--silent,-s
沉默模式。只打印错误消息。
--socket=path,-S path
用于连接的套接字文件。
--tables
覆盖---database或-B选项。选项后面的所有参量被视为表名。
--user=user_name,-u user_name
当连接服务器时使用的MySQL用户名。
--verbose,-v
冗长模式。打印关于各阶段程序操作的信息。
--version,-V
显示版本信息并退出。
问题二:/usr/local/mysql/bin/mysqld does not exist or is not executable.
]# /data/wapage/hhzk/mserver/mysql5713/bin/mysqld_safe --defaults-file=/etc/my.cnf & [1] 24527 ]# 2020-11-23T10:36:45.803151Z mysqld_safe Logging to '/data/wapage/hhzk/mserver/mysql5713/data/qd01-tech2-rec-build001.ps.easou.com.err'. 2020-11-23T10:36:45.809116Z mysqld_safe The file /usr/local/mysql/bin/mysqld does not exist or is not executable. Please cd to the mysql installation directory and restart this script from there as follows: ./bin/mysqld_safe& See http://dev.mysql.com/doc/mysql/en/mysqld-safe.html for more information [1]+ Exit 1 /data/wapage/hhzk/mserver/mysql5713/bin/mysqld_safe --defaults-file=/etc/my.cnf
说明:mysqld_safe启动脚本默认的从/usr/local/mysql目录中读取另外一个启动脚本mysqld,因为我的安装目录为/data/wapage/hhzk/mserver/mysql5713。所以找不到相关文件。可以从两个方面解决。
修复:
方法一:在/usr/local/mysql创建链接文件
mkdir -p /usr/local/mysql/bin ln -s /data/wapage/hhzk/mserver/mysql5713/bin/mysqld /usr/local/mysql/bin/mysqld
方法二:将mysqld_safe中的所有/usr/local/mysql目录改为自己实际的安装目录
sed -i 's#/usr/local/mysql#/data/wapage/hhzk/mserver/mysql5713#g' /data/wapage/hhzk/mserver/mysql5713/bin/mysqld_safe
相关来源阅读:
MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed_OhMyScofield的博客-CSDN博客