恢复MySQL备份后出现连接错误及InnoDB损坏问题求助
我知道已有类似问题被提出,但相关解决方案对我无效或我无法理解。上周断网后我无法访问网站,按网上建议恢复MySQL备份文件后,网站加载时出现以下错误:
警告: mysqli_real_connect(): 读取问候包时出错。PID=19756,位于 C:\xampp\htdocs\wp-includes\wp-db.php 第1753行
警告: mysqli_real_connect(): (HY000/2006): MySQL服务器已断开连接,位于 C:\xampp\htdocs\wp-includes\wp-db.php 第1753行
致命错误: 最大执行时间120秒已超出,位于 C:\xampp\htdocs\wp-includes\wp-db.php 第1753行
MySQL端口为3306,我此前将Apache端口改为8090,原本运行正常。
wp-db.php的1752和1753行代码如下:
if ( WP_DEBUG ) { mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
是否是恢复备份导致该行出问题?
附MySQL错误日志:
2022-09-12 9:56:32 0 [说明] InnoDB: 从检查点LSN=304941开始崩溃恢复 2022-09-12 9:56:32 0 [说明] InnoDB: 128个回滚段中的128个处于活动状态 2022-09-12 9:56:32 0 [说明] InnoDB: 已移除临时表空间数据文件: "ibtmp1" 2022-09-12 9:56:32 0 [说明] InnoDB: 为临时表创建共享表空间 2022-09-12 9:56:32 0 [说明] InnoDB: 将文件'C:\xampp\mysql\data\ibtmp1'的大小设置为12 MB。正在物理写入整个文件;请稍候... 2022-09-12 9:56:32 0 [说明] InnoDB: 文件'C:\xampp\mysql\data\ibtmp1'的大小现在为12 MB 2022-09-12 9:56:32 0 [说明] InnoDB: 等待清除操作开始 2022-09-12 9:56:32 0 [说明] InnoDB: 10.4.24已启动;日志序列号304950;事务ID 220 2022-09-12 9:56:32 0 [说明] InnoDB: 从C:\xampp\mysql\data\ib_buffer_pool加载缓冲池 2022-09-12 9:56:32 0 [说明] 插件'FEEDBACK'已禁用 2022-09-12 9:56:32 0 [错误] InnoDB: 页[页ID: space=1, page number=3]的日志序列号59112243是未来值!当前系统日志序列号304959 2022-09-12 9:56:32 0 [说明] 服务器套接字已在IP: '::'上创建 2022-09-12 9:56:32 0 [错误] InnoDB: 你的数据库可能已损坏,或者你可能复制了InnoDB表空间但未复制InnoDB日志文件。请参考InnoDB恢复模式相关文档了解强制恢复的信息 2022-09-12 9:56:32 0 [错误] InnoDB: 页[页ID: space=2, page number=0]的日志序列号396671是未来值!当前系统日志序列号304959
从MySQL错误日志看,核心问题是InnoDB日志序列号(LSN)不匹配,提示数据库可能损坏,或者恢复备份时只还原了表空间文件,没同步对应的InnoDB日志文件(ib_logfile0、ib_logfile1)。网站的连接错误和超时都是因为MySQL服务无法正常处理请求导致的。
步骤1:强制InnoDB恢复
- 停止XAMPP中的MySQL服务
- 找到MySQL的配置文件
my.ini(通常在C:\xampp\mysql\bin或C:\xampp\mysql\data目录下) - 在
[mysqld]区块添加一行:innodb_force_recovery = 1- 提示:如果1级恢复无效,可以逐步尝试2、3、4级(5、6级可能导致数据丢失,谨慎使用)
- 启动MySQL服务,尝试登录phpMyAdmin或用命令行连接数据库
- 如果能成功连接,立即导出整个数据库(用phpMyAdmin的导出功能,选择SQL格式,勾选"添加DROP TABLE语句")
步骤2:重建干净的数据库环境
- 再次停止MySQL服务
- 删除
C:\xampp\mysql\data目录下的以下文件:ib_logfile0、ib_logfile1(InnoDB日志文件)ibdata1(InnoDB共享表空间)- 注意:不要删除你的数据库文件夹和
mysql、performance_schema、information_schema这些系统库文件夹
- 移除之前添加的
innodb_force_recovery配置,或者把它改成0 - 启动MySQL服务,此时InnoDB会自动重建新的日志文件和共享表空间
- 创建一个新的空数据库,然后导入步骤1中导出的SQL备份文件
步骤3:验证WordPress配置
检查wp-config.php中的数据库配置是否正确:
define('DB_NAME', '你的数据库名'); define('DB_USER', '数据库用户名'); define('DB_PASSWORD', '数据库密码'); define('DB_HOST', 'localhost'); // 或者127.0.0.1:3306 define('DB_CHARSET', 'utf8mb4'); define('DB_COLLATE', '');
确认端口3306没有被其他程序占用,可以用命令netstat -ano | findstr :3306查看占用情况。
问题根源
恢复备份时,如果直接复制数据库文件夹(物理备份),但没有同时复制对应的InnoDB日志文件,就会导致LSN不匹配。因为InnoDB的日志文件记录了未提交的事务,表空间文件和日志文件的LSN必须一致才能正常启动。另外,断网导致的异常关机可能已经损坏了原有的数据库文件,备份恢复操作又加剧了这个问题。
内容的提问来源于stack exchange,提问作者ricochetpasta

