有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。
创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目成都网站设计、成都做网站、外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元硚口做网站,已为上家服务,为硚口各地企业和个人服务,联系电话:18982081108
前者使用起来比较简便。推荐使用。
1、check table 和 repair table 登陆mysql 终端: mysql -uxxxxx -p dbname check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用: repair table tabTest; 进行修复,修复之后可以在用check table命令来进行检查。
在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk 其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。
这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。
当发现某个数据表出现问题时可以使用: myisamchk tablename.MYI 进行检测,如果需要修复的话,可以使用: myisamchk -of tablename.MYI 关于myisamchk的详细参数说明,可以参见它的使用帮助。
需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
2、另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前: [ -x /tmp/mysql.sock ] /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI 。
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的是,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!
最后检测修复所有数据库(表)。
[代码] [Shell/批处理]代码#!/bin/bash #此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表 #变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数 #变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称 echo -e "此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\n\n" pass=123456 name=root read -p "输入mysql存储路径: " choose data_path=$choose unset choose read -p "请输入mysql命令路径: " mysql_version #标准输入、标准输出、标准错误输出的文件标示符 由 0、1、2标识 read -p "请选择是检查服务器上所有数据库还是指定的数据库 1:检查全部数据库 2:只检查指定数据库: " choose if [ $choose == 1 ]; then cd $data_path for directory_list in $(ls) do if [ -d $directory_list ];then if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then cd ${directory_list} echo "当前检查数据库为:"${directory_list} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" /tmp/check_table_all.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 21 /tmp/check_table_all.log done cd .. fi fi done cat /tmp/check_table_all.log | grep "Table is marked as crashed" /tmp/check_table_repair.log repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log ` echo -e "所有数据库用有${repair_count_all}张表需要修复!" more /tmp/check_table_repair.log else read -p "请输入要检查的数据库名称: " db_name cd ${data_path}/${db_name} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" /tmp/check_${db_name}.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 21 /tmp/check_${db_name}.log done cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" /tmp/check_${db_name}_Repair.log repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log` echo -e "${db_name}中共有${repair_count}个表需要修复!\n " more /tmp/check_${db_name}_Repair.log fi
mysqlcheck 是 MySQL 自带的一个工具,作用就是保养 表,其实就是检查,分析,修复和优化了。下面来介绍 mysqlcheck 工具的简单使用,官方文档在这里
以下的例子都是基于 MySQL 5.6 版本运行状态下(mysqlcheck是个在线工具), 不同的存储引擎对于这个命令的支持程度不同(指的是 check, repair, analyze, optimize),下面内容偏于操作,主要基于 innodb 引擎。
提示:OPTIMIZE 在大表时候可能会消耗很多时间,不清楚原理情况下请谨慎使用!!! innodb 一般不用 OPTIMIZE,请参见 Using MySQL OPTIMIZE tables? For InnoDB? Stop
检查特定的表
注意在shell中执行,不是在mysql的交互环境下
如果应用中提示某个表坏了,使用下面的命令来检查。
$ mysqlcheck -c newmandela order -uroot -pEnter password:
newmandela.order
OK
newmandela 是库名, order是表名,还需要输入用户名和密码
检查一个库中的所有表
$ mysqlcheck -c newmandela -uroot -p
Enter password:
newmandela.account OK
newmandela.alarm OK
newmandela.alarm_settings OK
newmandela.auth_group OK
newmandela.auth_group_permissions OK
newmandela.auth_permission OK...
5.9.4. 表维护和崩溃恢复
后面几节讨论如何使用myisamchk来检查或维护MyISAM表(对应.MYI和.MYD文件的表)。
你可以使用myisamchk实用程序来获得有关你的数据库表的信息或检查、修复、优化他们。下列小节描述如何调用myisamchk(包括它的选项的描述),如何建立表的维护计划,以及如何使用myisamchk执行各种功能。
尽管用myisamchk修复表很安全,在修复(或任何可以大量更改表的维护操作)之前先进行备份也是很好的习惯
影响索引的myisamchk操作会使ULLTEXT索引用full-text参数重建,不再与MySQL服务器使用的值兼容。要想避免,请阅读5.9.5.1节,“用于myisamchk的一般选项”的说明。
在许多情况下,你会发现使用SQL语句实现MyISAM表的维护比执行myisamchk操作要容易地多:
· 要想检查或维护MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想优化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
可以直接这些语句,或使用mysqlcheck客户端程序,可以提供命令行接口。
这些语句比myisamchk有利的地方是服务器可以做任何工作。使用myisamchk,你必须确保服务器在同一时间不使用表。否则,myisamchk和服务器之间会出现不期望的相互干涉。
5.9.5. myisamchk:MyISAM表维护实用工具
5.9.5.1. 用于myisamchk的一般选项
5.9.5.2. 用于myisamchk的检查选项
5.9.5.3. myisamchk的修复选项
5.9.5.4. 用于myisamchk的其它选项
5.9.5.5. myisamchk内存使用
5.9.5.6. 将myisamchk用于崩溃恢复
5.9.5.7. 如何检查MyISAM表的错误
5.9.5.8. 如何修复表
5.9.5.9. 表优化
可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
调用myisamchk的方法:
shell myisamchk [options] tbl_name ...
options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk --help得到选项列表。
tbl_name是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为myisamchk不知道你的数据库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操作。
如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:
shell myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有MyISAM表的方式是:
shell myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:
shell myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。
当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:
warning: clients are using or haven't closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。
如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表。
5.9.5.1. 用于myisamchk的一般选项
本节描述的选项可以用于用myisamchk执行的任何类型的表维护操作。本节后面的章节中描述的选项只适合具体操作,例如检查或修复表。
· --help,-?
显示帮助消息并退出。
· --debug=debug_options, -# debug_options
输出调试记录文件。debug_options字符串经常是'd:t:o,filename'。
· --silent,-s
沉默模式。仅当发生错误时写输出。你能使用-s两次(-ss)使myisamchk沉默。
· --verbose,-v
冗长模式。打印更多的信息。这能与-d和-e一起使用。为了更冗长,使用-v多次(-vv, -vvv)!
· --version, -V
显示版本信息并退出。
· --wait, -w
如果表被锁定,不是提示错误终止,而是在继续前等待到表被解锁。请注意如果用--skip-external-locking选项运行mysqld,只能用另一个myisamchk命令锁定表。
还可以通过--var_name=value选项设置下面的变量:
变量
默认值
decode_bits
9
ft_max_word_len
取决于版本
ft_min_word_len
4
ft_stopword_file
内建列表
key_buffer_size
523264
myisam_block_size
1024
read_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
stats_method
nulls_unequal
write_buffer_size
262136
可以用myisamchk --help检查myisamchk变量及其 默认值:
当用排序键值修复键值时使用sort_buffer_size,使用--recover时这是很普通的情况。
当用--extend-check检查表或通过一行一行地将键值插入表中(如同普通插入)来修改键值时使用Key_buffer_size。在以下情况通过键值缓冲区进行修复:
· 使用--safe-recover。
· 当直接创建键值文件时,需要对键值排序的临时文件有两倍大。通常是当CHAR、VARCHAR、或TEXT列的键值较大的情况,因为排序操作在处理过程中需要保存全部键值。如果你有大量临时空间,可以通过排序强制使用myisamchk来修复,可以使用--sort-recover选项。
通过键值缓冲区的修复占用的硬盘空间比使用排序么少,但是要慢。
如果想要快速修复,将key_buffer_size和sort_buffer_size变量设置到大约可用内存的25%。可以将两个变量设置为较大的值,因为一个时间只使用一个变量。
myisam_block_size是用于索引块的内存大小。
stats_method影响当给定--analyze选项时,如何为索引统计搜集处理NULL值。它如同myisam_stats_method系统变量。详细信息参见5.3.3节,“服务器系统变量”和7.4.7节,“MyISAM索引统计集合”的myisam_stats_method的描述。
ft_min_word_len和ft_max_word_len表示FULLTEXT索引的最小和最大字长。ft_stopword_file为停止字文件的文件名。需要在以下环境中对其进行设置。
如果你使用myisamchk来修改表索引(例如修复或分析),使用最小和最大字长和停止字文件的 默认全文参数值(除非你另外指定)重建FULLTEXT索引。这样会导致查询失败。
出现这些问题是因为只有服务器知道这些参数。它们没有保存在MyISAM索引文件中。如果你修改了服务器中的最小或最大字长或停止字文件,要避免该问题,为用于mysqld的myisamchk指定相同的ft_min_word_len,ft_max_word_len和ft_stopword_file值。例如,如果你将最小字长设置为3,可以这样使用myisamchk来修复表:
shell myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
要想确保myisamchk和服务器使用相同的全文
检查特定的表注意在shell中执行,不是在mysql的交互环境下如果应用中提示某个表坏了,使用下面的命令来检查。$ mysqlcheck -c newmandela order -uroot -pEnter password:newmandela.orderOKnewmandela 是库名, order是表名,还需要输入用户名和密码检查一个库中的所有表$ mysqlcheck -c newmandela -uroot -pEnter password:newmandela.account OKnewmandela.alarm OKnewmandela.alarm_settings OKnewmandela.auth_group OKnewmandela.auth_group_permissions OKnewmandela.auth_permission OK...
是坏表吗,打开表有什么提示。
我遇到的有2种
查询表报错 (只能重命名表,重新创建表)
查询数据mysql崩溃
为了防止数据丢失,提前设置备份 主从设置,开启log-bin 日志,条件可以的话使用固态硬盘+UPS ,避免异常断电