`
yahoo71986
  • 浏览: 10522 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL的Innodb表修复

阅读更多
前一段时间遇到这样一个问题,突然有一天在做数据库备份的时候出现了#2013 - Lost connection to MySQL server at 'reading initial communication packet', system error: 0,注意我的标红部分。因为不同的错误代码可能原因是不同的。即使是我这个问题,网上找到的原因也有几种。
到网站去搜,刚开始的结果是说linux的hosts.allow里面应该加一行mysqld:ALL:ALLOW。意思就是,linux的远程服务没有把mysql加到里面。但问题就来了,以前我运行都好好的呢。死马且当活马医吧。加上试试,不行。在my.ini里面加上skip-name-resolve?没用!my.ini里面有个bind-address=127.0.0.1?没有啊!
后来还是着急备份数据,只能试试其他表行不行。其他表都没问题,唯独一张表,也就是文章表,备份出现问题。问google(以前都是问baidu,但还是google靠谱啊),说是表出现问题了,这个问题后来得知或是因为数据量过大,或是因为mysql的bug。但是怎么修复呢,checktable?那是对myisam,如果对innodb的数据库,会显示一个当前表的storeage(数据库引擎)不支持当前操作。其实网上搜如果修复innodb的表有很多。但最权威的还是mysql官网上的。里面这样写的,英文不好直接看我翻译。
13.2.6.2. Forcing InnoDB Recovery

If there is database page corruption, you may want to dump your tables from the database with SELECT ... INTO OUTFILE. Usually, most of the data obtained in this way is intact. However, it is possible that the corruption might cause SELECT * FROM tbl_name statements or InnoDB background operations to crash or assert, or even cause InnoDB roll-forward recovery to crash. In such cases, you can use the innodb_force_recovery option to force the InnoDB storage engine to start up while preventing background operations from running, so that you are able to dump your tables. For example, you can add the following line to the [mysqld] section of your option file before restarting the server:

[mysqld]
innodb_force_recovery = 4

innodb_force_recovery is 0 by default (normal startup without forced recovery) The permissible nonzero values for innodb_force_recovery follow. A larger number includes all precautions of smaller numbers. If you are able to dump your tables with an option value of at most 4, then you are relatively safe that only some data on corrupt individual pages is lost. A value of 6 is more drastic because database pages are left in an obsolete state, which in turn may introduce more corruption into B-trees and other database structures.

    1 (SRV_FORCE_IGNORE_CORRUPT)

    Let the server run even if it detects a corrupt page. Try to make SELECT * FROM tbl_name jump over corrupt index records and pages, which helps in dumping tables.

    2 (SRV_FORCE_NO_BACKGROUND)

    Prevent the main thread from running. If a crash would occur during the purge operation, this recovery value prevents it.

    3 (SRV_FORCE_NO_TRX_UNDO)

    Do not run transaction rollbacks after recovery.

    4 (SRV_FORCE_NO_IBUF_MERGE)

    Prevent insert buffer merge operations. If they would cause a crash, do not do them. Do not calculate table statistics.

    5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

    Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.

    6 (SRV_FORCE_NO_LOG_REDO)

    Do not do the log roll-forward in connection with recovery.

The database must not otherwise be used with any nonzero value of innodb_force_recovery. As a safety measure, InnoDB prevents users from performing INSERT, UPDATE, or DELETE operations when innodb_force_recovery is greater than 0.

You can SELECT from tables to dump them, or DROP or CREATE tables even if forced recovery is used. If you know that a given table is causing a crash on rollback, you can drop it. You can also use this to stop a runaway rollback caused by a failing mass import or ALTER TABLE. You can kill the mysqld process and set innodb_force_recovery to 3 to bring the database up without the rollback, then DROP the table that is causing the runaway rollback.
我的翻译
13.2.6.2. 强制执行innodb恢复
如果你想从数据库中备份你的数据。通常,大多数获得的数据是完整的。但是,不排除你在执行SELECT * FROM tbl_name或者执行InnoDB后台操作的时候碰上了崩溃、断言。这样,就会让InnoDB前滚恢复的时候崩溃。在这种情况下,你就要用到innodb_force_recovery(innodb强制恢复)操作去强制InnoDB 数据存储引擎在防止后台操作运行的情况下启动。这样,你就能够备份你的数据库表了。例如,你可以在[mysqld]选项的下面加入如下行,然后重启服务(这里说一下redhat系下面mysql的重启,redhat是用rpm包管理的,可以直接输入命令行service mysql restart即可。网上说什么mysqld。反正我的机器上是不行)。
[mysqld]
innodb_force_recovery = 4

innodb_force_recovery默认是0(平常启动不带强制恢复)。大点的数字包含所有小的数的预防措施(也就是说,例如2包含1的所有功能)。如果你备份你的表用4,只有一些崩溃表的数据会丢失,相对来说比较安全。6是最极端的,因为所有的数据库表都处在一种转入B-tree和其他数据结构的废弃状态

有下面非0的选项:
    1 (强制忽略崩溃)
    在备份的时候,让服务遇到崩溃,跳过崩溃的记录或者表。

    2 (强制没有后台)

    Prevent the main thread from running. If a crash would occur during the purge operation, this recovery value prevents it.

    3 (强制不回滚事务)
    在恢复之后,不回滚事务

    4 (SRV_FORCE_NO_IBUF_MERGE)

    Prevent insert buffer merge operations. If they would cause a crash, do not do them. Do not calculate table statistics.

    5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

    Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.

    6 (SRV_FORCE_NO_LOG_REDO)

    Do not do the log roll-forward in connection with recovery.

数据库在innodb_force_recovery这个参数中一定要使用以上非零数字。作为安全的考量,当数字大于0的时候innodb不让用户使用插入、更新、删除操作。但你可以从表中select数据,然后备份他们,或者做一些DROP表或者CREATE表的操作。
如果你知道那张表出了问题,你可以drop掉。你当然也可以停止一个由于失败的导入或者 ALTER TABLE操作所导致的runaway rollback。You can kill the mysqld process and set innodb_force_recovery to 3 to bring the database up without the rollback, then DROP the table that is causing the runaway rollback.

翻译的比较烂,明白大概意思就行。当然这种完成之后,只能保证你能够顺利select。反正我这边备份还是有问题,还好我之前有备份的sql文件。把整个表drop掉,然后再导入数据,记住,前面说了,导入之前你必须把innodb_force_recovery改回来,因为innodb_force_recovery=1不支持增删改操作。期间还有问题,总觉得不是整张表有问题,而是个别记录出了问题。只能一条一条导入再试试。非常的麻烦,不知道各位谁有好的办法。
分享到:
评论

相关推荐

    MySQL数据库INNODB 表损坏修复处理过程

    MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。

    MySQL数据库INNODB表损坏修复处理过程分享

    6. **检查并修复表**: 使用`CHECK TABLE`命令检查表的完整性,如果发现问题,可以尝试`REPAIR TABLE`(尽管对InnoDB表效果有限),或者直接删除并重新导入表。对于InnoDB表,也可以考虑使用`mysqldump`创建表的...

    mysql innodb 异常修复经验分享

    MySQL InnoDB 异常修复是一项复杂的工作,尤其是在处理版本升级或更换数据库服务器时。本文将分享一次关于MySQL InnoDB 异常修复的经验,涉及到的问题包括版本回退、InnoDB模块重装以及配置文件的调整。 首先,问题...

    MYSQL数据库修复程序

    这可能包括重建索引、修复表结构等操作。 5. **表设计和查看**:Navicat允许用户查看和修改表的设计,包括字段类型、键设置、索引等。这对于理解表结构和潜在问题至关重要。 6. **SQL查询与内容读取**:通过SQL...

    MySql Innodb底层存储架构

    MySQL的InnoDB存储引擎是目前使用最为广泛的事务处理引擎之一,它提供了行级锁定、外键支持、崩溃修复能力以及多版本并发控制等功能。InnoDB存储引擎的底层存储架构设计得非常精细,能够有效地支持大规模的数据存储...

    mysql表修复的实用命令

    MyISAM是MySQL早期默认的存储引擎之一,虽然从MySQL 5.5版本开始InnoDB成为默认存储引擎,但MyISAM仍然在很多场景下被广泛使用。它不支持事务处理,并且每个表都是一个独立的数据文件和索引文件。 #### 2. 表损坏的...

    mysql Innodb表空间卸载、迁移、装载的使用方法

    MySQL的InnoDB存储引擎在处理表空间方面有两种模式:共享表空间和独立表空间。共享表空间模式下,所有InnoDB表的数据和索引都存储在一个或多个大文件(如ibdata1)中。而独立表空间模式,也称为文件-per-table模式,...

    MYSQL数据库表的修复教程

    `通常用于快速修复表结构,而忽略数据。 2. **OPTIMIZE TABLE命令**:虽然主要用于优化表的物理存储,`OPTIMIZE TABLE`有时也可以帮助修复轻微的损坏。它会重新组织表的物理结构,释放未使用的空间,并更新统计信息...

    MYSQL数据库修复大师

    MySQL的存储引擎有InnoDB和MyISAM等,它们在处理事务、索引和数据存储方面有所不同,这在修复过程中非常重要。 当MySQL数据库出现故障时,可能的原因包括硬件故障、操作系统崩溃、文件系统错误、不正确的关闭或突然...

    MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error

    这个问题通常表明MySQL的InnoDB存储引擎无法获取对`ibdata1`文件的锁,`ibdata1`是InnoDB用来存储数据和系统表空间的文件。这个错误可能是由于多种原因导致的,包括但不限于以下几点: 1. **另一个mysqld进程正在...

    MySQL数据库innodb启动失败无法重启的解决方法

    - **修复InnoDB表空间**:如果问题是由于表空间损坏导致的,可以尝试使用`mysqlcheck`工具进行修复,或者使用`innodb_force_recovery`参数设置不同的恢复级别。 - **检查权限和配置**:确保MySQL服务有足够的权限...

    MYSQL数据库修复工具

    这款工具专为解决MySQL数据库的故障而设计,其主要功能包括数据恢复、表结构修复以及日志分析等。通过先进的算法和深度扫描技术,它能够深入到数据库的底层,找出并修复损坏的记录,确保数据的完整性和一致性。 ...

    InnoDB 中文参考手册

    InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 ...

    mysql数据库修复专家

    "mysql数据库修复专家"就是针对这种需求的专业工具,它覆盖了MySQL 3到6版本的错误修复,能够处理多种类型的数据库文件,包括MYD、IBD和ibdata1。 MYD、IBD和ibdata1是MySQL数据库中不同类型的数据文件: 1. MYD...

    使用innodb_force_recovery解决MySQL崩溃无法重启问题

    在设置这个参数后,应该尽快备份或导出所有重要数据,然后关闭MySQL服务,修复底层问题,最后清除`innodb_force_recovery`,按照常规流程重新启动数据库。如果可能,最好在测试环境中先验证这种方法,避免在生产环境...

    MYSQL数据表损坏的原因分析和修复方法小结(推荐)

    本文主要分析了MySQL数据表损坏的原因,并提供了相应的预防措施和修复方法。 1. **数据表损坏的原因**: - 服务器突然断电:电源中断可能会导致数据文件未完成写入,从而造成损坏。 - 强制关机:在没有正常关闭...

    MySQL修改innodb_data_file_path参数的一些注意事项

    5. **安全重启**:在更改配置后,使用安全模式(如`--skip-grant-tables`)启动MySQL,以便在必要时修复权限或表结构问题。 总之,`innodb_data_file_path`是MySQL中一个关键的配置参数,用于管理InnoDB表空间。...

Global site tag (gtag.js) - Google Analytics