损坏的 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_upgrade
与 innodb_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
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_upgrade
与 innodb_force_recovery=6
如有相关问题,欢迎提问。
此时唯一的选择是提取数据并从转储中重新创建 InnoDB 数据库。
经常MySQL在任何页面遇到损坏时崩溃,所以最好一张一张地转储表格。
这是一个单独转储表的脚本,您可以根据自己的具体情况进行调整。如果崩溃,它将重新启动 MySQL,并在 failed.txt
.
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