MySQL 删除ibdata1时怎么恢复

标题:MySQL InnoDB数据恢复,丢失ibdata1时怎么安全恢复

废话在前:

恭喜你,当你看到这篇文章的时候,说明有可能 你心里已经有一万匹🐎在奔腾了。千万不要乱删除ibdata1,有些博客无脑抓取、复制其他人的博客乱发文章,比如:

在磁盘满了的情况下,不能删除ibdata1文件,或者在删除的时候该备份(但是磁盘都满了,一般都备份不到了,本人血泪教训)。

原因:由于innoDB将表数据字典存储在ibdata1中,当ibdata1改变时,ID就无法对应上,所以就会找不到表。

再来说怎么解决

如果你的mysql在删除ibdata1后还没有启动的时候,这个时候还可以靠进程试着恢复:

# 误删数据文件和重做日志文件
[root@dba ~]# cd /mysqldata/data/
[root@dba data]# ll ib*
-rw-r----- 1 mysql mysql      809 Nov 19 03:22 ib_buffer_pool
-rw-r----- 1 mysql mysql 79691776 Feb 23 07:17 ibdata1
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:18 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:18 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Feb 23 07:06 ibtmp1
[root@dba data]# rm -f ib*
[root@dba data]# ll ib*
ls: cannot access ib*: No such file or directory

# 查找MySQL进程pid
[root@dba data]# netstat -ntlp | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      7424/mysqld         
# 确认进程具柄还没释放
[root@dba data]# ll /proc/7424/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 Feb 23 07:33 10 -> /mysqldata/data/ibdata1 (deleted)
lrwx------ 1 root root 64 Feb 23 07:33 4 -> /mysqldata/data/ib_logfile0 (deleted)
lrwx------ 1 root root 64 Feb 23 07:33 9 -> /mysqldata/data/ib_logfile1 (deleted)

# 前端关闭业务或甚至只读模式
flush tables with read lock;
# 将脏页尽快刷入磁盘
set global innodb_max_dirty_pages_pct = 0;
# 查看binlog日志写入情况,确保File和Position值没变化
show master status;
# 查看InnoDB状态信息确保脏页已刷入磁盘
show engine innodb status\G;

# 将未释放的具柄号复制回原目录文件
[root@dba data]# cp /proc/7424/fd/10 /mysqldata/data/ibdata1
[root@dba data]# cp /proc/7424/fd/4 /mysqldata/data/ib_logfile0
[root@dba data]# cp /proc/7424/fd/9 /mysqldata/data/ib_logfile1
# 修改用户属性
[root@dba data]# chown mysql.mysql ib*
[root@dba data]# ll /mysqldata/data/ib*
-rw-r----- 1 mysql mysql 79691776 Feb 23 07:41 /mysqldata/data/ibdata1
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:41 /mysqldata/data/ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:41 /mysqldata/data/ib_logfile1

# 解锁,看是否需要重启MySQL服务
mysql> unlock tables;

如果你已经启动了mysql,那么再次恭喜你 又加大了难度,ibdata1在mysql启动和关闭的时候写入数据,如果在删除了ibdata1文件下,启动了mysql,那么ibdata1文件会自动创建。那么就需要想别的办法来恢复数据:

此时你所有的数据都还是存在的,只是缺少了一个ibdata1文件,而innoDB将表数据字典存储在ibdata1中,所以你需要重新建立表字段、结构等(注意:所有格式、编码都需要和以前一致)

CREATE TABLE table_name ...; # 这里的表格式 必须和之前的严格一致,否则会造成数据乱码
ALTER TABLE table_name DISCARD TABLESPACE; # 去除表空间( 会删除 table_name.idb ) 
# 复制原数据 table_name.idb 到数据目录下 ( 这一步建议先停止MySQL服务器,复制完成再开启 ) 
ALTER TABLE table_name IMPORT TABLESPACE; # 导入表空间 

# DISCARD TABLESPACE 相当于清空新表数据 
# IMPORT TABLESPACE 相当于从文件导入数据

最后还是希望你能完整快速的恢复数据。下篇详细介绍方法二恢复数据!!!

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MySQL 中,ibdata1 是 InnoDB 存储引擎的系统表空间,它存储了表、索引和事务等的元数据信息。因为 ibdata1 文件的大小是动态增长的,所以如果不进行定期清理,它可能会占据大量的磁盘空间。下面是一些清理 ibdata1 的方法: 1. 清理未使用的 InnoDB 表 使用以下命令可以查找未使用的 InnoDB 表: ``` SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') AND ENGINE = 'InnoDB' AND TABLE_NAME NOT IN ( SELECT DISTINCT TABLE_NAME FROM information_schema.statistics WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') ); ``` 如果查询结果为空,则表示所有 InnoDB 表都在使用中,否则需要进一步分析并删除未使用的表。 2. 清理 InnoDB 日志文件 在 MySQL 中,InnoDB 存储引擎会生成两个日志文件:ib_logfile0 和 ib_logfile1。这些日志文件记录了 InnoDB 存储引擎的所有操作,包括事务的提交和回滚。如果这些日志文件过大,可以通过以下命令清理: ``` SET GLOBAL innodb_fast_shutdown = 0; ``` 然后重启 MySQL 服务器,这样会清理掉不必要的日志文件。 3. 重建 InnoDB 表 如果 InnoDB 表中存在大量已删除的数据,可以通过以下方法进行重建: ``` ALTER TABLE table_name ENGINE=InnoDB; ``` 这样可以重建表并清理掉已删除的数据。 4. 导出并重新导入数据库 如果以上方法无法清理 ibdata1 文件,可以考虑将数据库导出为 SQL 文件,删除数据库并重新创建一个空的数据库,然后再将 SQL 文件重新导入。这样可以清理掉所有不必要的数据和元数据信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

騒周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值