innodb_force_recovery 的一些说明

innodb_force_recovery 的一些说明

innodb_force_recovery 是 MySQL 中的一个启动选项,它允许我们在遇到 InnoDB 表空间损坏时,通过强制恢复来启动 MySQL 服务器。启用这个选项后,MySQL 会尝试跳过损坏的部分并继续运行,这对于恢复数据和防止数据丢失非常有用。

这个选项有几个不同的级别,从 1 到 6,每个级别代表不同的恢复强度:

  • 级别 1:这是最轻微的恢复尝试,通常可以处理大多数崩溃后的恢复。

  • 级别 2:如果级别 1 不起作用,可以尝试这个级别,它会更加强制地进行恢复。

  • 级别 3:更强的恢复尝试,可能会在数据库中留下一些损坏的数据。
  • 级别 4:更高级别的恢复,可能会牺牲更多的数据完整性。
  • 级别 5:非常强力的恢复尝试,不推荐使用,除非你真的需要恢复数据库。
  • 级别 6:这是最强力的恢复级别,会尽可能地恢复表空间,但可能会造成大量数据丢失。

启用 innodb_force_recovery 的方法是在启动 MySQL 时,通过命令行参数或配置文件来设置。例如,在命令行启动 MySQL 时,可以使用以下命令:

mysqld --innodb_force_recovery=1

或者在配置文件中设置,可以找到 [mysqld] 部分,然后添加一行:

innodb_force_recovery = 1

需要注意,使用 innodb_force_recovery 可能会导致数据丢失或损坏,因此,只有在其他所有恢复方法都失败时,才应该考虑使用它。在尝试使用 innodb_force_recovery 之前,强烈建议备份我们的数据库。

使用脚本检查数据库

此外,一旦能够使用 innodb_force_recovery 成功启动了 MySQL,可以使用下面的 mysqlcheck.sh 脚本来对数据库做一次全面的检查。

#!/bin/bash

# MySQL 配置文件,用于存储用户名和密码
CONFIG_FILE=".my.cnf"


# 输出文件名
OUTPUT_FILE="./mysqlcheck_results_(date +"%Y%m%d%H%M%S").txt"

# 检查 MySQL 配置文件是否存在
if [ ! -f "CONFIG_FILE" ]; then
    echo "MySQL 配置文件 CONFIG_FILE 不存在。"
    exit 1
fi

# 从配置文件中读取 MySQL 用户名和密码
username=(cat CONFIG_FILE | grep -oP '(?<=^user=)[^]*')
password=(catCONFIG_FILE | grep -oP '(?<=^password=)[^]*')

# 如果没有用.my.cnf,那就在这里放MySQL用户名和密码
#username="root"
#password="你的密码"

# 获取数据库列表,排除系统数据库
databases=(mysql --defaults-extra-file=CONFIG_FILE -e "SHOW DATABASES" | grep -Ev "(Database|information_schema|performance_schema|mysql)")

# 检查数据库列表是否为空
if [ -z "databases" ]; then
    echo "没有找到数据库。"
    exit 2
fi

# 开始检查
echo "开始检查 MySQL 数据库..."
echo "检查结果将保存到 OUTPUT_FILE"

# 遍历数据库列表并执行 mysqlcheck,并将结果追加到输出文件
for db indatabases; do
    echo "正在检查数据库 db..."
    mysqlcheck --defaults-extra-file=CONFIG_FILE -c -u "username" "db" >> "OUTPUT_FILE" 2>&1
    if [? -ne 0 ]; then
        echo "检查数据库 db 时出错。详情请查看OUTPUT_FILE"
    else
        echo "数据库 $db 检查完成。"
    fi
done

通过检查输出记录,看是否存在有损坏的文件,如下所示:

dbxx.tabxxx
Warning  : InnoDB: The B-tree of index PRIMARY is corrupted.
Warning  : InnoDB: Index 'id' contains 12306 entries, should be 1234567890.
error    : Corrupt

dbxx.indxxx
Warning  : InnoDB: The B-tree of index idx_id is corrupted.
error    : Corrupt

尝试重建索引来解决,方法如下:

1. 使用 ALTER TABLE 语句

这是重建表上所有索引的最简单方法,但它会锁定表直到操作完成。

ALTER TABLE table_name ENGINE=ENGINE_NAME;

table_name 替换为实际的表名,ENGINE_NAME 替换为实际的表引擎,通常是 InnoDBMyISAM

2. 使用 ALTER TABLE 单独重建某个索引

如果只想重建特定的索引,可以指定索引名称:

ALTER TABLE table_name DROP INDEX index_name, ADD INDEX index_name (column_list);

table_name 替换为实际的表名,index_name 替换为索引的名称,column_list 替换为索引列的列表。

3. 使用 CREATE INDEX 语句

如果使用的是 MyISAM 存储引擎,可以使用 CREATE INDEX 来重建索引:

CREATE INDEX index_name ON table_name (column_list);

4. 使用 pt-online-schema-change 工具

对于大型表,可以使用 pt-online-schema-change 工具来在线重建索引,这允许在重建索引时继续使用表。

pt-online-schema-change \
  --charset=CHARSET \
  --keys="INDEX (column_list)" \
  D=dest_db,t=table_name \
  D=src_db,t=table_name \
  --execute

5. 使用 mysqlcheck 工具

mysqlcheck 是一个命令行工具,可以用来修复和优化表的索引:

mysqlcheck -u username -p -o -A -r /path/to/report_file

-o 参数表示优化(即重建)索引,-A 表示对所有数据库执行操作,-r 表示生成报告。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注