公司的游戏所在机房意外断电,导致MySQL未正常关闭,使得很多MyISAM表损坏,很多表如果全部修复(数据库很大需要很长的时间)那如果检查整个库在复制命令一个一个修复也浪费时间,最后写个脚本修复数据库。
Mysql 数据库 相信很多地方 都在用,在用的时候避免不了出现表的损坏,损坏之后我们就要修复。如果是单张表,我们使用命令轻易的修复。如果是其中 的一部分表那?最重要的是还不知道具体的那些表。如果 全库修复那花费很长很长的时间。下面就是我写的一个自动化修复脚本。
mysql 进程在一个写入中被杀死、计算机意外关闭、硬件错误都能造成mysql表损坏 。
mysql 修复表的各种方法
1、mysqlcheck 进行表修复
使用mysqlcheck 命令对表进行修复
|
首先检查数据库的那些表损坏,如果能定位到那张表损坏可以直接对表修复
|
更多参数 查看 mysqlcheck –help
2、myisamchk 修复mysql表
Myisamchk是MyISAM表维护的一个非常实用的工具。可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
Myisamchk 选项解释
–debug=debug_options, -# debug_options 输出调试记录文件。debug_options字符串经常是’d:t:o,filename’。
–silent,-s 沉默模式。仅当发生错误时写输出。
–wait, -w 如果表被锁定,不是提示错误终止,而是在继续前等待到表被解锁。 如果不使用–skip-external-locking,可以随时使用myisamchk来检查表。当检查表时,所有尝试更新表的客户端将等待,直到myisamchk准备好可以继续。 请注意如果用–skip-external-locking选项运行mysqld,只能用另一个myisamchk命令锁定表。
–var_name=value 可以通过–var_name=value选项设置下面的变量:
–check, -c 检查表的错误。如果你不明确指定操作类型选项,这就是默认操作。
–check-only-changed, -C 只检查上次检查后有变更的表。
–extend-check, -e 非常仔细地检查表。如果表有许多索引将会相当慢。
–fast,-F 只检查没有正确关闭的表。
–force, -f 如果myisamchk发现表内有任何错误,则自动进行修复。
–information, -i 打印所检查表的统计信息。
–medium-check, -m 比–extend-check更快速地进行检查。只能发现99.99%的错误
–update-state, -U 将信息保存在.MYI文件中,来表示表检查的时间以及是否表崩溃了。该选项用来充分利用–check-only-changed选项, 但如果mysqld服务器正使用表并且正用–skip-external-locking选项运行时不应使用该选项。
–read-only, -T 不要将表标记为已经检查。如果你使用myisamchk来检查正被其它应用程序使用而没有锁定的表很有用
–backup, -B 将.MYD文件备份为file_name-time.BAK
–character-sets-dir=path 字符集安装目录。
–correct-checksum 纠正表的校验和信息。
–data-file-length=len, -D len 数据文件的最大长度
–extend-check,-e 进行修复,试图从数据文件恢复每一行。一般情况会发现大量的垃圾行。不要使用该选项,除非你不顾后果。
–force, -f 覆盖旧的中间文件(文件名类似tbl_name.TMD),而不是中断
–keys-used=val, -k val 对于myisamchk,该选项值为位值,说明要更新的索引。选项值的每一个二进制位对应表的一个索引,其中第一个索引对应位0。 选项值0禁用对所有索引的更新,可以保证快速插入。通过myisamchk -r可以重新激活被禁用的索引。
–parallel-recover, -p 与-r和-n的用法相同,但使用不同的线程并行创建所有键。
–quick,-q 不修改数据文件,快速进行修复。
–recover, -r 可以修复几乎所有一切问题,除非唯一的键不唯一时(对于MyISAM表,这是非常不可能的情况)。如果你想要恢复表, 这是首先要尝试的选项。如果myisamchk报告表不能用-r恢复,则只能尝试-o。 在不太可能的情况下-r失败,数据文件保持完好)。
–safe-recover, -o 使用一个老的恢复方法读取,按顺序读取所有行,并根据找到的行更新所有索引树。这比-r慢些, 但是能处理-r不能处理的情况。该恢复方法使用的硬盘空间比-r少。一般情况,你应首先用-r维修,如果-r失败则用-o。
–sort-recover, -n 强制myisamchk通过排序来解析键值,即使临时文件将可能很大。
–analyze,-a 分析键值的分布。这通过让联结优化器更好地选择表应该以什么次序联结和应该使用哪个键来改进联结性能。 要想获取分布相关信息,使用myisamchk –description –verbose tbl_name命令或SHOW KEYS FROM tbl_name语句。
–sort-index, -S 以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。
–set-auto-increment[=value], -A[value] 强制从给定值开始的新记录使用AUTO_INCREMENT编号(或如果已经有AUTO_INCREMENT值大小的记录,应使用更高值)。 如果未指定value,新记录的AUTO_INCREMENT编号应使用当前表的最大值加上1。
–description, -d 打印出关于表的描述性信息。
检查表
|
myisanchk修复表
|
我只是加了一个参数,可以根据自己的需求添加参数。使用myisam --help参看详细的参数
3、自动修复mysql 表脚本
这个shell脚本,可以很方便的对多个数据库的表进行检查和修复,操作起来也非常方便,希望对大家有用
#!/bin/sh
export LANG=zh_CN.UTF-8
# 修改数据库配置
DB_SOCKET_PATH="/data/app/db"
DB_ROOT_USER="root"
DB_ROOT_PASS="123456"
# 数据库数组 可以加多个数据库
databases=(${SERVER_MARK}_mobcc_user ${SERVER_MARK}_mobcc ${SERVER_MARK}_mobcc_activity)
for database in ${databases[@]}
do
tables=$(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "show tables" )
for arg in $tables
do
check_status=$(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "check table $arg" | awk '{ print $4 }' )
if [ "$check_status" = "OK" ]
then
echo "$arg is ok"
else
echo $(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "repair table $arg")
fi
echo $(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "optimize table $arg")
done
done
echo "all down!"