损坏的 MySQL 数据库,只有 innodb_force_recovery=6 才能访问

Corrupt MySQL Database, Only Accessible With innodb_force_recovery=6

MySQL 5.7 Ubuntu 16.04 LTS

数据库在我认为是不当的系统关闭后损坏,尝试恢复它的时间最糟糕。以前的系统管理员没有最近的备份,这在某种程度上是必要的,我尽我所能 repair/recover 数据库。

MySQL 仅服务器 运行s 具有:innodb_force_recovery=6

mysqldump 给出了这个错误:

Couldn't execute 'SHOW VARIABLES LIKE 'gtid_mode'': Table 'performance_schema.session_variables' doesn't exist (1146)

不能 运行 mysql_upgradeinnodb_force_recovery=6

如有相关问题,欢迎提问。

此时唯一的选择是提取数据并从转储中重新创建 InnoDB 数据库。

经常MySQL在任何页面遇到损坏时崩溃,所以最好一张一张地转储表格。

这是一个单独转储表的脚本,您可以根据自己的具体情况进行调整。如果崩溃,它将重新启动 MySQL,并在 failed.txt.

中保存 "bad" 个表的列表
set -eux

edir=export

function ensure_mysqld() {
        mysql -e 'select 1' && return

        service mysql start 

        timeout=300
        while [[ $timeout -gt 0 ]]
        do
                mysql -e 'select 1' && return
                sleep 1
                timeout=$(( $timeout - 1 ))
        done
        echo "failed to start MySQL"
        exit 1
}

for d in $(cat databases)
do
        mkdir -p $edir/$d
        set +e
        ensure_mysqld
        set -e
        for t in $(mysql -S $socket -NBe "select TABLE_NAME from information_schema.TABLES WHERE TABLE_SCHEMA='$d' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'")
        do
                ensure_mysqld
                mysqldump --skip-lock-tables $d $t > $edir/$d/$t.sql || echo "$d.$t" >> failed.txt
        done
done