常用的Mysql数据库修复方法有下面3种:

1. mysql原生SQL命令: repair
  即执行REPAIR TABLE SQL语句
  语法:REPAIR TABLE tablename[,tablename1...] [options]
  示例: mysql> use database xxx;
    mysql> repair table *;

2.使用MySQL自带的客户端工具: myisamchk (无需停止MySql服务)
具体信息可见: http://dev.mysql.com/doc/refman/5.1/zh/client-side-scripts.html#mysqlcheck
有3种方式来调用mysqlcheck:
shell> mysqlcheck[options] db_name [tables]
shell> mysqlcheck[options] ---database DB1 [DB2 DB3...]
shell> mysqlcheck[options] --all--database
示例:
自动检查并修复数据库xxxdatabase的所有表:
shell> mysqlcheck --auto-repiar xxxdatabase -uroot -p

3.使用MySQL自带的客户端工具: myisamchk (需要停止MySql服务)
  较少使用, 如果想了解详细, 请见Mysql官方文档.

如何修复MySQL数据库(MyISAM / InnoDB)

本文总结了7种修复MySQL数据库的方法,当我们重启数据库无法解决问题或者有数据表损坏时,可以尝试从下面列出的方法中找出相应的解决方案。

重启MySQL:

/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
/usr/local/mysql/bin/mysqld_safe &

1.MyISAM表损坏
MySQL数据库可以为不同的数据表指定不同的存储引擎,其中最流行的两种存储引擎是MyISAM和InnoDB。
MyISAM类型的表容易损坏,这是个不争的事实。幸运的是,在大多数情况下,MyISAM表损坏是很容易修复。
要修复单个损坏的数据表,可以连接数据库执行 :

repair TABLENAME

要修复所有的表,执行如下命令:

/usr/local/mysql/bin/mysqlcheck --all-databases -uUSERNAME -pPASSWORD -r

很多时候,我们不会知道MyISAM表已经损坏了,除非查看了日志文件。
我强烈建议您将此行添加到你的/etc/my.cnf配置文件中, 它会自动修复损坏的MyISAM表。

[mysqld]
myisam-recover=backup,force

2.多个MySQL实例
这种情况很常见,当你启动MySQL时,MySQL进程马上死掉。这时若查看MySQL日志,会发现这是因为有另一个MySQL进程正在运行。
停止所有的MySQL实例

/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown

killall mysql
killall mysqld

再启动MySQL后就只有一个MySQL实例运行了。

3.修改MySQL日志设置
一旦我们在运行一个InnoDB的数据库,我们就不能修改/etc/my.cnf文件中的以下几行:

datadir = /usr/local/mysql/data
innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_log_files_in_group = 2
innodb_log_file_size = 5242880

InnoDB的日志文件的大小一但确定就不能再修改了,否则会造成数据库无法启动。

4.丢失MySQL host表
这种情况我碰到过几次,这可能是一个MyISAM的bug,修复方法如下:

/usr/local/bin/mysql_install_db

5.损坏的MyISAM auto_increment
假如一个MyISAM表中的auto_increment变得紊乱,你将不能向其表中插入新记录。通过将最后一条记录的auto_increment设为-1,可以告诉auto_increment,他现在的工作不正常。
找到最后一条记录的auto_increment的有效值

SELECT max(id) from tablename

然后再更新表的auto_increment

ALTER TABLE tablename AUTO_INCREMENT = id+1

6.太多的数据库连接
当我们的数据库连接数过多时,会造成无法连接到数据库的问题。这时,我们要先停止数据库

/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown

当数据库停止后,我们就可以根据服务器的配置情况适当的增加连接数
在一台专用的数据库服务器上,我们可以设置如下

max_connections = 200
wait_timeout = 100

最后再启动数据库。

7.InnoDB表损坏
InnoDB拥有内部恢复机制,假如数据库崩溃了,InnoDB通过从最后一个时间戳开始运行日志文件,来尝试修复数据库。大多数情况下会修复成功,而且整个过程是透明的。
假如InnoDB自行修复失败,那么数据库将不能启动。无论你怎样一次又一次的尝试启动MySQL,它都只是发出一条错误信息。这也是我们在使用 InnoDB时,需要运行master/master的原因,只有这样才能在一个master宕掉时,还有一台冗余master做后备。
在继续操作前,先浏览下MySQL的日志文件,确定数据库是因为InnoDB表的损坏而崩溃。
有一种方法是更新InnoDB的日志文件计数器以跳过引起崩溃的查询,但是经验告诉我们这不是个好方法。这种情况下,将造成数据的不一致性而且会经常使主从复制中断。
一旦确定MySQL因为InnoDB表损坏无法启动时,我们就可以按照以下5步进行修复:
1.添加如下配置到/etc/my.cnf文件中

innodb_force_recovery = 4

2.这时就可以重新启动数据库了,在innodb_force_recovery配置的作用,所有的插入与更新操作将被忽略;
3.导出所有的数据表;
4.关闭数据库并删除所有数据表文件及目录,再运行 mysql_install_db来创建MySQL默认数据表;
5.在/etc/my.cnf中删除innodb_force_recovery这一行,再启动MySQL(这时MySQL正常启动);
6.从第3步备份的文件中恢复所有的数据。

文章翻译自:http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql-database-myisam-innodb-1634.html

 
 
 

MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)的更多相关文章

  1. php 实现 mysql数据表优化与修复

    <?php $link = mysql_connect("localhost", "root", "") or die("e ...

  2. mysql数据表最高速迁移,mysql的存储引擎为:myisam

    本文链接:http://blog.csdn.net/u010670689/article/details/41346689 需求: 开发产品过程中,有个项目分支,数据库须要带数据拷贝,可是表的数据非常 ...

  3. MySQL 数据表修复及数据恢复

    1. MYSQL数据表在什么情况下容易损坏? 服务器突然断电导致数据文件损坏. 强制关机,没有先关闭mysql 服务等.   2. 数据表损坏后的主要现象是什么? 从表中选择数据之时,得到如下错误:I ...

  4. MYSQL数据表损坏的原因分析和修复方法小结

    MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...

  5. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  6. 用Myisamchk让MySQL数据表更健康

    用Myisamchk让MySQL数据表更健康 2011-03-15 09:15 水太深 ITPUB 字号:T | T 为了让MySQL数据库中的数据表“更健康”,就需要对其进行定期体检.在这里笔者推荐 ...

  7. 设置MySQL数据表主键

    设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...

  8. 谈谈MySQL数据表的类型(转)

    谈谈MySQL数据表的类型 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其 ...

  9. mysql数据表增删改查

    http://www.runoob.com/mysql/mysql-tutorial.html 一.MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以 ...

随机推荐

  1. nginx介绍及安装

    nginx(Engine x)      静态的www软件    特点:        配置简单        高并发,1-2w,基于异步IO模型(epoll,kqueue)        占用资源少 ...

  2. 更多隐式Intent用法

    上几篇无论是显示的Intent或者隐式的Intent,都是要跳转的自己添加指定的页面,如果想要跳转到百度首页或者跳转到联系人面板等,前面的知识显然是很不实用的.这里,将要针对其它的一些Intent用法 ...

  3. html a标签 图片边框和点击后虚线框的有关问题

    html a标签 图片边框和点击后虚线框的问题 一直在在chrome上开发自己的项目,今天上ie和firefix一看,真丑,a标签在使用图片时,多加了蓝色的边框,并且点击后所有a标签都会出现一个虚线框 ...

  4. .Net开源SqlServer ORM框架SqlSugar整理

    一.链接整理 官方Git源代码地址: https://github.com/sunkaixuan/SqlSugar 最新发布版更新地址:当前版本Release 3.5.2.1 https://gith ...

  5. 自定义组合控件,适配器原理-Day31

    自定义组合控件,适配器原理-Day31 mobile2.1 主页定义 手机上锁功能 1.弹出设置密码框. 手机下载进度 自定定义控件 控件的属性其实就是控件类一个属性设置属性调用类的set方法方法, ...

  6. Perl连接Sqlite数据库

    Sqlite是一个小巧的嵌入式关系型数据库,几乎可以嵌入所有编程语言,特别是C,C++,PHP,Perl等.这里就介绍如何用Perl连接并操作Sqlite数据库. use DBI; # perl用以操 ...

  7. KMP算法_读书笔记

    下面是KMP算法的实现伪代码: KMP_MATCHER ( T, P ) . n = T.length . m = P.length . next = COMPUTE_PREFIX_FUNCTION ...

  8. GridView 编辑、删除 、分页

    类似代码都差不多,记录一下,便于以后查看使用. 前台页面: <asp:GridView ID="gdvList" runat="server" AutoG ...

  9. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  10. 获取动态SQL查询语句返回值(sp_executesql)

    在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值 ...