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
替换为实际的表引擎,通常是 InnoDB
或 MyISAM
。
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
表示生成报告。