• Mysql数据库意外崩溃导致表数据文件损坏无法启动的问题解决


    问题故障:
    Mysql数据库意外崩溃,一直无法启动数据库。
    报错日志:

    启动报错:service mysqld restart
    ERROR! MySQL server PID file could not be found!
    Starting MySQL. ERROR! The server quit without updating PID file (/www/wdlinux/mysql/var/iZ2358oz5deZ.pid).

    数据库error日志:
    200719 22:07:43 InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files...
    InnoDB: Error: trying to add tablespace 840 of name './ob_wp/ob_termmeta.ibd'
    InnoDB: to the tablespace memory cache, but tablespace
    InnoDB: 840 of name './dev_nss/dg_queue.ibd' already exists in the tablespace
    InnoDB: memory cache!
    200719 22:07:43 mysqld_safe mysqld from pid file /www/wdlinux/mysql/var/iZ2358oz5deZ.pid ended

    提示:数据库启动时读取表空间信息时,ob-wp库中的表ob_users.ibd表数据文件已存在于表空间中。

    拓展:
    存储引擎是myisam, 在数据库目录下会看到3类文件:.frm、.myi、.myd
          (a) *.frm--表定义,是描述表结构的文件。
          (b) *.MYD--"D"数据信息文件,是表的数据文件。
          (c) *.MYI--"I"索引信息文件,是表数据文件中任何索引的数据树
    存储引擎是InnoDB, 在data目录下会看到2类文件:.frm、.ibd
         (a) *.frm--表结构的文件。
         (b) *.ibd--表数据文件

    出处:https://www.cnblogs.com/liucx/

    方法一:
    根据提示信息判定该InnoDB表损坏,于是尝试将dev_nss库目录中的表结构和表数据文件备份
    mv ob_termmeta.ibd ob_termmeta.ibd,bak
    mv ob_termmeta.frm ob_termmeta.frm.bak
    然后重启了下mysql,发现还是无法启动,提示其他表数据文件已存在,连续3次将已损坏的文件备份,还是无法启动。故放弃此方法。


    方法二:
    1.查阅官网文档,在mysql配置文件中/etc/my.cnf添加配置,成功启动
    [mysqld]
    innodb_force_recovery = 1

    2.备份数据库
    mysqldump -h172.168.2.100 -uroot -p -A > mysql_all_bak.sql
    如遇报表不存在,mysqldump可以添加参数:--force ,跳过错误

    3.删除数据库
    drop database hxdb; 或者将数据库数据库目录 mv hxdb hxdb_bak (保险)

    4.去掉参数 innodb_force_recovery
    将之前设置的参数去掉后,重新启动数据库

    5.导入数据
    mysql -uroot -p < mysql_all_bak.sql
    Warning: Using a password on the command line interface can be insecure.
    ERROR 1050 (42S01) at line 25: Table '`hxdb`.`tb_info`' already exists

    如果提示表已经存在,这是因为将innodb_force_recovery参数去掉后,数据库会进行回滚操作,会生成相应的ibd文件,所以需要将该文件删除掉,删除后重新导入
    mysql -uroot -p < mysql_all_bak.sql


    注:
    innodb_force_recovery参数解释:崩溃恢复模式,通常只有在严重故障排除情况下才会改变。可以的值是从0到6。

    只有在紧急情况下才将这个变量设置为大于0的值,这样你才能启动InnoDB并转储你的表。作为一种安全措施,当innodb_force_recovery大于0时,InnoDB可以防止插入、更新或删除操作。
    在5.6.15,innodb_force_recovery设置为4或更大,将InnoDB设置为只读模式。由于relay_log_info_repository=TABLE和master_info_repository=TABLE在InnoDB表中存储信息,这些限制可能导致复制管理命令失败并出现错误。

    innodb_force_recovery默认情况下为0(正常启动而不强制恢复)。允许的非零值 innodb_force_recovery是1到6。较大的值包括较小值的功能。例如,值3包含值1和2的所有功能。
    如果能够转储 innodb_force_recovery值为3或更小的表,则相对安全的是,仅丢失损坏的单个页面上的某些数据。4或更大的值被认为是危险的,因为数据文件可能会永久损坏。值6被认为是过分的,因为数据库页面处于过时状态,这反过来可能会使B树 和其他数据库结构遭受更多破坏。

    为了安全起见,请InnoDB防止 INSERT, UPDATE或 DELETE在innodb_force_recovery大于0 时进行操作 。从MySQL 5.6.15开始, 在只读模式下innodb_force_recovery设置4个或更多位置InnoDB。
    1 (SRV_FORCE_IGNORE_CORRUPT)
    让服务器运行,即使它检测到一个损坏的页面。尝试让SELECT * FROM tbl_name跳过损坏的索引记录和页面,这有助于转储表。
    2 (SRV_FORCE_NO_BACKGROUND)
    阻止主线程和任何清除线程运行。如果在清除操作期间发生崩溃,则此恢复值将防止崩溃。
    3 (SRV_FORCE_NO_TRX_UNDO)
    在崩溃恢复后不运行事务回滚。
    4 (SRV_FORCE_NO_IBUF_MERGE)
    防止插入缓冲区合并操作。如果它们会导致崩溃,就不要做。不计算表统计信息。此值可能永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。在MySQL 5.6.15中,将InnoDB设置为只读。
    5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
    启动数据库时不要查看撤销日志:InnoDB甚至会将未完成的事务视为已提交。此值可能永久损坏数据文件。在MySQL 5.6.15中,将InnoDB设置为只读。
    6 (SRV_FORCE_NO_LOG_REDO)
    在恢复时不执行重做日志前滚。此值可能永久损坏数据文件。使数据库页面处于过时状态,这反过来可能会给b -树和其他数据库结构带来更多损坏。在MySQL 5.6.15中,将InnoDB设置为只读。

    出处:https://www.cnblogs.com/liucx/

    参阅官网:
    https://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
    https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_force_load_corrupted

    希望能帮到你

  • 相关阅读:
    hadoop脑裂
    磁盘动态扩容
    zookeeper快照清理
    hadoop rebalance
    redis
    斜率场--微分方程图形解
    simpson法计算arctan(1)-即pi/4
    反函数的导数
    动能公式推导
    schwarz( 施瓦兹)不等式证明
  • 原文地址:https://www.cnblogs.com/liucx/p/13343790.html
Copyright © 2020-2023  润新知