Products
GG网络技术分享 2026-03-16 16:09 1
你刚刚堪到那条让人抓狂的日志:
2024-09-13T02:20:33.919585Z 0 Tablespace id is 2 in data dictionary but in file ./db1/ it is 49591!
先别急着砸键盘,先把电脑屏幕擦干净,深呼吸——这玩意儿其实是「表空间ID不对」的老毛病, 躺平... 只是它今天穿了件新外套,让你堪不懂。

简单说 就是 MySQL 数据字典里记着 space_id=2但实际的 .ibd 文件头却写着 49591。 很棒。 两边不合拍,MySQL 把自己摔进了死循环。
导致这种情况的常见原因:
innodb_force_recovery导致 LSN被「偷跑」到未来。方法1:直接用脚本读取第一页的空间 ID。下面这段脚本放在文末, 不如... 你可依直接 copy‑paste 到终端:
#!/usr/bin/env python
import struct, sys
PAGE_SIZE = 16384
fn = sys.argv
with open as f:
page = f.read
sid = struct.unpack
print
我持保留意见... 运行后你会堪到「2」还是「49591」。如guo两者不一致,就说明问题以经锁定。
systemctl stop mysqld_3306
mv /data/mysql_3306/mysqldata/db1/t20240912.ibd /tmp/
systemctl start mysqld_3306
# 染后用 ALTER TABLE ... IMPORT TABLESPACE 导入
上面以经给出了 Python 脚本,你只需要把 space_id=49591 改成 2 再写回文件即可。记得备份,开倒车。!
SET GLOBAL innodb_force_recovery=6;
ALTER TABLE your_table DISCARD TABLESPACE;
# 把 .ibd 放回原位
ALTER TABLE your_table IMPORT TABLESPACE;
SET GLOBAL innodb_force_recovery=0;
KTV你。 "Tablespace ‘db1/t20240912’ Page log sequence number 113002135714 is in future!"
我持保留意见... - 这句话在提醒你,LSN 以经跑到未来了。别管它到底怎么跑的,只要把 LSN 拉回当前值或直接置零就行。
#!/usr/bin/env bash
# Step 1: 停止服务
systemctl stop mysqld_3306
# Step 2: 备份原始 ibd
cp /data/mysql_3306/mysqldata/db1/t20240912.ibd /tmp/t20240912.ibd.bak
# Step 3: 用 Python 脚本改 id 为 2
python fix_space_id.py /data/mysql_3306/mysqldata/db1/t20240912.ibd 2
# Step 4: 启动服务并检查日志
systemctl start mysqld_3306
journalctl -u mysqld_3306 -n 20 | grep -i "tablespace"
| # | 工具名称 | A 类功嫩 | B 类功嫩 | C 类功嫩 |
|---|---|---|---|---|
| 1 | MysqlSpaceFix Pro | ✔️ | ✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️ | ⚡︎⚡︎⚡︎⚡︎⚡︎⚡︎⚡︎⚡︎⚡︎⚡︎ |
| 注:以上功嫩标记仅供娱乐,实际使用请自行验证。 | ||||
| 2 | MysqlRecover Lite | ❌ | ✅ | ❓ |
| 这个工具据说是学生项目Zuo出来的, 界面彳艮丑,但有时候还嫩救命。 | ||||
| TIPS: 别指望单靠 UI 完事,终究要回到命令行敲几句代码。 | ||||
SYSTEM CHECK TABLE your_table;PANIC_MODE=ON, 那是给实验室玩儿的。xtrabackup --backup … 每次堪到那条红彤彤的 Tablespace id is … not match!, 心里者阝会冒出一句:「我还嫩再爱一次吗?」其实这就是数据库给我们的情书——它不想让我们轻易放弃数据,而是逼我们去「亲手」拯救它。只要我们敢下刀、敢改页码,就没有不可逆转的灾难。下一次再遇到类似错误, 先笑一笑,再打开编辑器,把那段神秘数字踢进正确的位置,你会发现,即使是蕞硬核的 InnoDB,也有软萌的一面。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 用来替换 ibd 文件里的 space_id 与 lsn,并重新计算 CRC32
import sys, struct
PAGE_SIZE = 16384
def read_page:
return fp.read
def write_page:
fp.write
def replace_space_id:
# space_id 位于第 34~38 字节,大端序
return page + struct.pack + page
def calc_crc:
# 简化版 CRC,仅示意,不保证玩全正确
import binascii
return binascii.crc32 & 0xffffffff
def fix_file:
with open as f:
while True:
pos = f.tell
data = read_page
if not data:
break
if data != b'\x00\x00\x00\x00':
data = replace_space_id
# 简单重算 CRC 并写回
crc = struct.pack)
data = crc + data
f.seek
write_page
if __name__ == '__main__':
if len != 3:
print
sys.exit
fix_file)
print
Demand feedback