数据库系列之MySQL表ibd文件删除恢复

MySQL如何优雅的删除大表 前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是QPS急速下降,客户请求变慢。 解决办法 1.业务低峰时间手动执行删除 这个可能就需要DBA不辞辛劳,大晚上爬起来删表了。 2.先清除数据,最后再删除的方式 譬如1000万条数据,写脚本每次删除20万,睡眠一段时间,继续执行。这样也能做到对用户无感知。 3.对表文件(idb文件)做一个硬链接来加速删 阅读详情

前段时间遇到过因为mysql表ibd文件被删除后的应急处理,直接删除表文件是严厉禁止的操作,这里测试下几种情况下的应急恢复过程。


1、ibd文件被清空或误删除

1)创建表sbtest1并插入数据

CREATE TABLE `sbtest1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`k` int unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `c1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2)批量插入数据

[root@tango-GDB-DB01 sysbench-1.0]# sysbench ./tests/include/oltp_legacy/insert.lua --mysql-host=192.168.112.121 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=testdb --oltp-test-mode=complex --oltp-tables-count=1 --oltp-table-size=100000 --events=100000 --time=1000 --report-interval=1 run

3)删除ibd文件

[root@tango-GDB-DB01 testdb]# ll
-rw-r-----. 1 mysql mysql 15728640 Nov 20 19:35 sbtest1.ibd
[root@tango-GDB-DB01 testdb]# rm -f sbtest1.ibd 

以下将分为几种场景来处理以上故障。

  • 单实例mysql进程没有重启
  • 单实例mysql进程重启
  • 主从复制架构
1.1 单实例MySQL进程没有重启

1)查看mysql进程正常运行

[root@tango-GDB-DB01 ~]# service mysql status
 SUCCESS! MySQL running (1873)

2)查看Mysql数据库进程所用使用的文件句柄

[root@tango-GDB-DB01 1873]# cd /proc/1873/fd
[root@tango-GDB-DB01 fd]# ll
total 0
lr-x------. 1 root root 64 Nov 21 19:39 0 -> /dev/null
l-wx------. 1 root root 64 Nov 21 19:39 1 -> /usr/local/mysql/data/tango-GDB-DB01.err
lrwx------. 1 root root 64 Nov 21 19:39 10 -> /usr/local/mysql/data/#ib_16384_0.dblwr
lrwx------. 1 root root 64 Nov 21 19:39 11 -> /usr/local/mysql/data/#ib_16384_1.dblwr
lrwx------. 1 root root 64 Nov 21 19:39 12 -> /usr/local/mysql/data/undo_001
lrwx------. 1 root root 64 Nov 21 19:39 13 -> /tmp/ibQ3dqia (deleted)
lrwx------. 1 root root 64 Nov 21 19:39 14 -> /usr/local/mysql/data/undo_002
lrwx------. 1 root root 64 Nov 21 19:39 15 -> /usr/local/mysql/data/ibtmp1
lrwx------. 1 root root 64 Nov 21 19:39 16 -> /usr/local/mysql/data/mysql.ibd
lrwx------. 1 root root 64 Nov 21 19:39 17 -> anon_inode:[eventpoll]
lr-x------. 1 root root 64 Nov 21 19:39 18 -> pipe:[23795]
l-wx------. 1 root root 64 Nov 21 19:39 19 -> pipe:[23795]
l-wx------. 1 root root 64 Nov 21 19:39 2 -> /usr/local/mysql/data/tango-GDB-DB01.err
lrwx------. 1 root root 64 Nov 21 19:39 20 -> anon_inode:[eventfd]
lrwx------. 1 root root 64 Nov 21 19:39 21 -> socket:[23797]
lrwx------. 1 root root 64 Nov 21 19:39 22 -> socket:[23798]
lrwx------. 1 root root 64 Nov 21 19:39 23 -> socket:[23800]
l-wx------. 1 root root 64 Nov 21 19:39 24 -> /usr/local/mysql/data/binlog.000036
lrwx------. 1 root root 64 Nov 21 19:39 25 -> socket:[23801]
lrwx------. 1 root root 64 Nov 21 19:39 26 -> /usr/local/mysql/data/#innodb_temp/temp_1.ibt
lrwx------. 1 root root 64 Nov 21 19:39 27 -> /usr/local/mysql/data/#innodb_temp/temp_2.ibt
lrwx------. 1 root root 64 Nov 21 19:39 28 -> /usr/local/mysql/data/#innodb_temp/temp_3.ibt
lrwx------. 1 root root 64 Nov 21 19:39 29 -> /usr/local/mysql/data/#innodb_temp/temp_4.ibt
lrwx------. 1 root root 64 Nov 21 19:39 3 -> /usr/local/mysql/data/binlog.index
lrwx------. 1 root root 64 Nov 21 19:39 30 -> /usr/local/mysql/data/#innodb_temp/temp_5.ibt
lrwx------. 1 root root 64 Nov 21 19:39 31 -> /usr/local/mysql/data/#innodb_temp/temp_6.ibt
lrwx------. 1 root root 64 Nov 21 19:39 32 -> /usr/local/mysql/data/#innodb_temp/temp_7.ibt
lrwx------. 1 root root 64 Nov 21 19:39 33 -> /usr/local/mysql/data/#innodb_temp/temp_8.ibt
lrwx------. 1 root root 64 Nov 21 19:39 34 -> /usr/local/mysql/data/#innodb_temp/temp_9.ibt
lrwx------. 1 root root 64 Nov 21 19:39 35 -> /usr/local/mysql/data/#innodb_temp/temp_10.ibt
lrwx------. 1 root root 64 Nov 21 19:39 36 -> socket:[25252]
lrwx------. 1 root root 64 Nov 21 19:39 37 -> /usr/local/mysql/data/testdb/sbtest1.ibd (deleted)
lrwx------. 1 root root 64 Nov 21 19:39 4 -> /usr/local/mysql/data/ib_logfile0
lrwx------. 1 root root 64 Nov 21 19:39 5 -> /tmp/ibvnyRpe (deleted)
lrwx------. 1 root root 64 Nov 21 19:39 6 -> /tmp/ibTk4WGX (deleted)
lrwx------. 1 root root 64 Nov 21 19:39 7 -> /tmp/ibJF9ehq (deleted)
lrwx------. 1 root root 64 Nov 21 19:39 8 -> /usr/local/mysql/data/ibdata1
lrwx------. 1 root root 64 Nov 21 19:39 9 -> /usr/local/mysql/data/ib_logfile1

3)这个表在一定的时间范围内,还是可以进行DML操作

mysql> insert into sbtest1(k,c,pad) values(100,100,100);
Query OK, 1 row affected (0.01 sec)

4)为了保险起见,建议将这个表进行lock操作,只能read操作

mysql> lock table sbtest1 read;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into sbtest1(k,c,pad) values(100,100,100);
ERROR 1099 (HY000): Table 'sbtest1' was locked with a READ lock and can't be updated

5)将句柄中的ibd文件拷贝到data目录

[root@tango-GDB-DB01 fd]# cp /proc/1873/fd/37 /usr/local/mysql/data/testdb/sbtest1.ibd

6)对拷贝文件赋权

[root@tango-GDB-DB01 testdb]# ll
total 30752
-rw-r-----. 1 root root 15728640 Nov 21 20:49 sbtest1.ibd
[root@tango-GDB-DB01 testdb]# chown mysql:mysql sbtest1.ibd
[root@tango-GDB-DB01 testdb]# ll
total 30752
-rw-r-----. 1 mysql mysql 15728640 Nov 21 20:49 sbtest1.ibd

如果不执行此步,在重启mysql时候会提示:

[Warning] [MY-012197] [InnoDB] Unable to open './testdb/sbtest1.ibd'

7)可以看到文件已经完全找回去了。这个时候,可以将表的read lock释放了

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into sbtest1(k,c,pad) values(100,100,101);
Query OK, 1 row affected (0.01 sec)

8)重启mysql,查看mysql日志,没有异常报错信息。

[root@tango-GDB-DB01 testdb]# service mysql restart

为什么能通过这种方式恢复rm掉的ibd文件呢,主要是因为用rm命令删除的时候,Mysql数据库进程还在持有被删除的ibd文件的句柄,也就是在/proc/{mysql_pid}/pd目录下可以找到,如果这个时候重启了Mysql数据库实例,Mysql进程就会释放掉删除文件的句柄,此时就访问不到被删除的文件了。但是很多时候管理人员是不知道后台做了什么操作,因为从业务表象上看表的访问时正常的,所以不可避免会出现重启进程的情况出现。

1.2 单实例MySQL进程重启

1)清空ibd文件后重启mysql,提示错误:

2021-11-21T09:30:19.873859Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2021-11-21T09:30:19.874006Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.25) starting as process 2078
2021-11-21T09:30:19.887308Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-11-21T09:30:21.106799Z 1 [ERROR] [MY-012224] [InnoDB] Header page consists of zero bytes in datafile: ./testdb/sbtest1.ibd, Space ID:0, Flags: 0. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
2021-11-21T09:30:21.125942Z 1 [ERROR] [MY-012237] [InnoDB] Corrupted page [page id: space=66, page number=0] of datafile './testdb/sbtest1.ibd' could not be found in the doublewrite buffer.
2021-11-21T09:30:21.126361Z 1 [ERROR] [MY-013183] [InnoDB] Assertion failure: fil0fil.cc:6077:err == DB_SUCCESS || err == DB_INVALID_ENCRYPTION_META thread 140142532699904
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
09:30:21 UTC - mysqld got signal 6 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x6380c20
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7f7579e11cf0 thread_stack 0x46000
/usr/local/mysql/bin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x2e) [0x2079c3e]
/usr/local/mysql/bin/mysqld(handle_fatal_signal+0x323) [0x10616b3]
/lib64/libpthread.so.0(+0xf630) [0x7f7587eda630]
/lib64/libc.so.6(gsignal+0x37) [0x7f7585eef3d7]
/lib64/libc.so.6(abort+0x148) [0x7f7585ef0ac8]
/usr/local/mysql/bin/mysqld() [0xdafadb]
/usr/local/mysql/bin/mysqld(Fil_shard::ibd_open_for_recovery(unsigned int, std::string const&, fil_space_t*&)+0x4fd) [0x249706d]
/usr/local/mysql/bin/mysqld(Fil_system::open_for_recovery(unsigned int)+0x99) [0x24977b9]
/usr/local/mysql/bin/mysqld(fil_tablespace_redo_extend(unsigned char*, unsigned char const*, page_id_t const&, unsigned long, bool)+0x9c) [0x249805c]
/usr/local/mysql/bin/mysqld() [0x220b094]
/usr/local/mysql/bin/mysqld() [0x220e349]
/usr/local/mysql/bin/mysqld(recv_recovery_from_checkpoint_start(log_t&, unsigned long)+0x20d6) [0x22129c6]
/usr/local/mysql/bin/mysqld(srv_start(bool)+0x1bf8) [0x22fcbb8]
/usr/local/mysql/bin/mysqld() [0x2167507]
/usr/local/mysql/bin/mysqld(dd::bootstrap::DDSE_dict_init(THD*, dict_init_mode_t, unsigned int)+0x81) [0x1d83521]
/usr/local/mysql/bin/mysqld(dd::upgrade_57::do_pre_checks_and_initialize_dd(THD*)+0x18b) [0x204f8cb]
/usr/local/mysql/bin/mysqld() [0x1111b76]
/usr/local/mysql/bin/mysqld() [0x25aef7c]
/lib64/libpthread.so.0(+0x7ea5) [0x7f7587ed2ea5]
/lib64/libc.so.6(clone+0x6d) [0x7f7585fb79fd]

2)尝试删除ibd文件,重启mysql提示错误:

The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
2021-11-21T09:42:50.756717Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2021-11-21T09:42:50.756869Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.25) starting as process 2532
2021-11-21T09:42:50.769934Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-11-21T09:42:53.337067Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 0 for {space: 66, page_no:1688} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.337371Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 1 for {space: 66, page_no:1689} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.337731Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 2 for {space: 66, page_no:1690} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.338022Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 3 for {space: 66, page_no:1691} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.338316Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 4 for {space: 66, page_no:1692} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.338665Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 5 for {space: 66, page_no:1693} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.338974Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 6 for {space: 66, page_no:1694} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.339286Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 7 for {space: 66, page_no:1695} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.339834Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 8 for {space: 66, page_no:1696} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.340661Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 9 for {space: 66, page_no:1697} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.340923Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 10 for {space: 66, page_no:1698} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.341152Z 1 [Warning] [MY-013541] [InnoDB] Doublewrite page 11 for {space: 66, page_no:1699} could not be restored. File name unknown for tablespace ID 66
2021-11-21T09:42:53.341412Z 1 [ERROR] [MY-012179] [InnoDB] Could not find any file associated with the tablespace ID: 66
2021-11-21T09:42:53.341728Z 1 [ERROR] [MY-012964] [InnoDB] Use --innodb-directories to find the tablespace files. If that fails then use --innodb-force-recovery=1 to ignore this and to permanently lose all changes to the missing tablespace(s)
2021-11-21T09:42:53.442823Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2021-11-21T09:42:53.843317Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2021-11-21T09:42:53.843895Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2021-11-21T09:42:53.844653Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-11-21T09:42:53.965610Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.25)  MySQL Community Server - GPL.

3)尝试innodb_force_recovery恢复

从上面可以看到mysql无法正常启动,此时尝试innodb_force_recovery恢复数据库。innodb_force_recovery默认为0,innodb_force_recovery可以设置1到6。较大的值包括较小值所有功能。例如,3包含1和2的所有功能。

设置innodb_force_recovery值等于或小于3,MySQL数据库的表是相对安全,此时仅丢失了损坏的单个页面上的某些数据。设置成4或更大的值是非常危险的,此时可能会导致页数据永久损坏。为保护数据,InnoDB会在innodb_force_recovery大于4时阻止INSERT,UPDATE或DELETE操作。innodb_force_recovery设置为0或更大时会将InnoDB置于只读模式。

  • innodb_force_recovery=1(SRV_FORCE_IGNORE_CORRUPT )

    此时MySQL数据库即使检测到损坏的page也可以运行。可以尝试使SELECT * FROM tab跳过损坏的索引记录和页面,可以恢复没有损坏的业务数据。

  • innodb_force_recovery=2(SRV_FORCE_NO_BACKGROUND )

    阻止master thread和任何purge threads运行。如果在purge操作期间发生崩溃,则此恢复值将阻止它。

  • innodb_force_recovery=3(SRV_FORCE_NO_TRX_UNDO )

    在crash recovery之后不执行事务rollbacks。

  • innodb_force_recovery=4(SRV_FORCE_NO_IBUF_MERGE )

    防止insert buffer合并操作,不计算 tablestatistics。此时可能会永久损坏数据文件,需要删除并重新创建所有二级索引。

  • innodb_force_recovery=5(SRV_FORCE_NO_UNDO_LOG_SCAN

    启动数据库时不检查undo logs:InnoDB甚至将未完成的事务都视为已提交。此值可能会永久损坏数据文件。将InnoDB设置为只读。

  • innodb_force_recovery=6(SRV_FORCE_NO_LOG_REDO )

    不进行与恢复有关的redo log前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,从而可能导致 B 树和其他数据库结构遭受更多破坏。将InnoDB设置为只读。

4)将innodb_force_recovery设置为3后重启mysql后会提示信息:

2021-11-21T09:51:00.885712Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.25) starting as process 2755
2021-11-21T09:51:00.898658Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-11-21T09:51:02.536329Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-11-21T09:51:02.663827Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 66, name 'testdb/sbtest1', file './testdb/sbtest1.ibd' is missing!
2021-11-21T09:51:02.666281Z 1 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2021-11-21T09:51:02.666753Z 1 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2021-11-21T09:51:02.667161Z 1 [ERROR] [MY-012216] [InnoDB] Cannot open datafile for read-only: './testdb/sbtest1.ibd' OS error: 71
2021-11-21T09:51:02.669023Z 1 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2021-11-21T09:51:02.669538Z 1 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2021-11-21T09:51:02.670040Z 1 [ERROR] [MY-012216] [InnoDB] Cannot open datafile for read-only: './testdb/sbtest1.ibd' OS error: 71
2021-11-21T09:51:02.706609Z 1 [Warning] [MY-010005] [Server] Skip re-populating collations and character sets tables in InnoDB read-only mode.
2021-11-21T09:51:02.722699Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
2021-11-21T09:51:02.723545Z 2 [Warning] [MY-011018] [Server] Skip updating information_schema metadata in InnoDB read-only mode.
2021-11-21T09:51:02.725217Z 0 [Warning] [MY-010970] [Server] Skipped updating resource group metadata in InnoDB read only mode.
2021-11-21T09:51:02.725765Z 0 [Warning] [MY-010970] [Server] Skipped updating resource group metadata in InnoDB read only mode.
2021-11-21T09:51:02.861962Z 0 [System] [MY-010229] [Server] Starting XA crash recovery...
2021-11-21T09:51:02.867876Z 0 [System] [MY-010232] [Server] XA crash recovery finished.
2021-11-21T09:51:03.026461Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-11-21T09:51:03.027069Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-11-21T09:51:03.061947Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.25'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server - GPL.

5)此时数据库只有查询操作,不能执行增删改(insert,update,delete)的操作。

mysql> insert into tango.test01 values(20,20,10);
ERROR 1881 (HY000): Operation not allowed when innodb_force_recovery > 0.

6)登录到mysql中还是能看到表sbtest1,但是访问时候会提示如下报错:

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| sbtest1          |
+------------------+
1 row in set (0.01 sec)

mysql> select count(1) from sbtest1;
ERROR 1812 (HY000): Tablespace is missing for table `testdb`.`sbtest1`.

先删除该表:

drop table sbtest1;

再重建

mysql> use testdb;
Database changed
mysql> CREATE TABLE `sbtest1` (
    ->   `id` int unsigned NOT NULL AUTO_INCREMENT,
    ->   `k` int unsigned NOT NULL DEFAULT '0',
    ->   `c` char(120) NOT NULL DEFAULT '',
    ->   `pad` char(60) NOT NULL DEFAULT '',
    ->   PRIMARY KEY (`id`),
    ->   KEY `c1` (`k`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=8591563 DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| sbtest1          |
+------------------+
1 row in set (0.00 sec)

至此数据库状态恢复正常,但是表数据已经丢失。

1.3 主从复制架构

1)配置主从同步复制,主从同步配置参考“数据库系列之MySQL主从复制环境部署”

##主节点信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

##从节点状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.112.121
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 156
               Relay_Log_File: tango-GDB-DB02-relay-bin.000002
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 156
              Relay_Log_Space: 542
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101
                  Master_UUID: 33069334-e5d2-11eb-9eef-000c298b8089
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.02 sec)

2)创建库testdb和表sbtest1并插入数据

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| sbtest1          |
+------------------+
1 row in set (0.00 sec)

mysql> 
mysql> 
mysql> select count(1) from testdb.sbtest1;
+----------+
| count(1) |
+----------+
|     2835 |
+----------+
1 row in set (0.06 sec)

3)删除表ibd文件

[root@tango-GDB-DB01 testdb]# ll
total 12288
-rw-r-----. 1 mysql mysql 12582912 Nov 21 09:43 sbtest1.ibd
[root@tango-GDB-DB01 testdb]# rm -f sbtest1.ibd

4)此时重启mysql提示错误信息

2021-11-21T01:44:57.655311Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 74, name 'testdb/sbtest1', file './testdb/sbtest1.ibd' is missing!
2021-11-21T01:44:57.740055Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
2021-11-21T01:44:58.184794Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-11-21T01:44:58.185393Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-11-21T01:44:58.244657Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.25'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server - GPL.
2021-11-21T01:45:07.507786Z 8 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2021-11-21T01:45:07.507937Z 8 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2021-11-21T01:45:07.507960Z 8 [ERROR] [MY-012216] [InnoDB] Cannot open datafile for read-only: './testdb/sbtest1.ibd' OS error: 71
2021-11-21T01:45:07.508345Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `testdb`.`sbtest1` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
2021-11-21T01:45:07.508830Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `testdb`.`sbtest1` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
2021-11-21T01:45:10.485517Z 8 [Warning] [MY-012049] [InnoDB] Cannot calculate statistics for table `testdb`.`sbtest1` because the .ibd file is missing. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html for how to resolve the issue.
(END)

5)在主节点访问表会提示

mysql> select count(1) from testdb.sbtest1;
ERROR 1812 (HY000): Tablespace is missing for table `testdb`.`sbtest1`.

在从节点访问表是有正常返回值

mysql> select count(1) from testdb.sbtest1;
+----------+
| count(1) |
+----------+
|    28417 |
+----------+
1 row in set (0.06 sec)

6)将从节点的ibd文件拷贝到主节点

[root@tango-GDB-DB02 testdb]# scp sbtest1.ibd  192.168.112.121:/usr/local/mysql/data/testdb/

7)修改文件属性

[root@tango-GDB-DB01 testdb]# ll
total 15360
-rw-r-----. 1 root root 15728640 Nov 21 09:49 sbtest1.ibd
[root@tango-GDB-DB01 testdb]# chown mysql:mysql sbtest1.ibd
[root@tango-GDB-DB01 testdb]# ll
total 15360
-rw-r-----. 1 mysql mysql 15728640 Nov 21 09:49 sbtest1.ibd

8)重启mysql后访问表

mysql> select count(1) from testdb.sbtest1;
ERROR 1812 (HY000): Tablespace is missing for table `testdb`.`sbtest1`.

此时提示表空间丢失

9)执行import将表空间加入

mysql> alter table testdb.sbtest1 import tablespace;
mysql>  select count(1) from testdb.sbtest1;
+----------+
| count(1) |
+----------+
|    28417 |
+----------+
1 row in set (0.06 sec)

10)备节点重新设置,否则会出现如下错误信息

               Last_SQL_Errno: 1813
               Last_SQL_Error: Error 'Tablespace 'testdb/sbtest1' exists.' on query. Default database: 'testdb'. Query: 'alter table testdb.sbtest1 import tablespace'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101

重新设置复制点

mysql> stop slave; 
CHANGE MASTER TO MASTER_HOST='192.168.112.121',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_LOG_FILE='mysql-bin.000008',
MASTER_LOG_POS=3915236;

此时可以正常同步数据了。

1.4 总结
  1. 在单节点MySQL环境下,当出现误操作删除表的ibd文件,如果能够及时发现在mysql进程没有重启之前是可以恢复数据的,但是很多情况下并没有及时的发现并重启了进程,此时虽然能恢复数据库但是删除的数据已经无法恢复了。
  2. 在主从复制架构下,因为有从库存在,当出现误操作的时候可以通过从库的数据进行主库ibd文件的恢复。
  3. 出现这种误操作还是因为对操作的危害性认知不够,而正常的空间释放是通过truncate表等数据库操作来进行的,不是直接暴力的对文件进行删除操作。在实际的生产运行环境,这种行为是严厉禁止的。

参考资料:

  1. https://blog.youkuaiyun.com/weixin_42551260/article/details/113303546
  2. https://blog.youkuaiyun.com/qq_40907977/article/details/114842270
  3. “数据库系列之MySQL主从复制环境部署”

转载请注明原文地址:https://blog.youkuaiyun.com/solihawk/article/details/121783207
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

通过.frm 和.ibd 批量恢复mysql数据 其次,mysql数据库必须是按表存放数据的,默认不是,但是大家生产肯定是按分表设置的吧,如果不是,则无法这样恢复数据。然后在mysqlfrm所在的目录打开命令行,复制粘贴上面的命令到命令行执行,在sql文件夹得到.sql文件(sql文件夹要先创建好)首先找到网站源码里对数据库连接的config文件,将其参数改为我们自己建立的数据库。.ibd文件存了每个表的元数据,包括表结构的定义等。先将.frm文件的文件名提取出来,他们的文件名对应着一个数据表。然后将要恢复的数据库的.ibd文件复制到新建数据库的目录下。 阅读详情

相关推荐

【MySQL】MySQL8.0 ibd2sdi 根据ibd文件恢复表结构

ibd文件 在8之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件。而在8的时候全都存到了ibd文件里。。。。。。 如果你把mysql搞崩了…比如我手贱把preformance_shcema表删了…相信这回帮到你。 ibd2sdi Oracle 将frm文件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),S...

HaYa 7994

解决MySQL数据库意外崩溃导致数据库文件损坏或意外删除数据库文件导致无法启动问题

MySQL版本:5.7 查看mysql启动日志: 2021-09-26T09:00:39.404326Z 1 [ERROR] [MY-012179] [InnoDB] Could not find any file associated with the tablespace ID: 380 2021-09-26T09:00:39.404490Z 1 [ERROR] [MY-012964] [InnoDB] Use --innodb-directories to find the tablespace

哇哇哇,真的学到了!!! 7774

MySQL8.0 ibd2sdi 根据ibd文件恢复表结构

ibd文件 在8之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件。而在8的时候全都存到了ibd文件里。。。。。。 如果你把mysql搞崩了…比如我手贱把preformance_shcema表删了…相信这回帮到你。 ibd2sdi Oracle 将frm文件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被写在ibd文件内部,它是数据字典包含的信息的一个冗余副本。 为了从IBD文件中提取SDI信息,Oracle

u011790603的博客 4613

【msyql 】占用硬盘太大 ,那些文件可以清理

从目录内容来看,这台 MySQL 服务器上主要是调度平台的数据库。这个文件是,随着时间推移,日志量会非常大。

一个写了10年bug的程序员日常笔记。 1160

数据恢复新姿势——通过ibd和frm文件恢复数据

一、背景 1.1、需求来源 需要给客户将生产环境的数据恢复到测试环境,但是线上环境的xtrabackup全备数据量太大,拷贝下来比较麻烦,并且需要恢复的数据只有整库中的两张表的数据,所以客户只是将全备中的对应表的ibd文件以及frm文件拷贝下来了,要求根据ibd文件以及frm文件进行数据恢复。 1.2、环境介绍 数据库版本:MySQL-5.7.22 数据库要求:innodb_file...

woqutechteam的博客 2580

STM32CubeIDE(CUBE-MX hal库)----RTC时钟断电保持与时间校准实战

本文详细介绍了在STM32CubeIDE中使用CUBE-MX和HAL库实现RTC时钟断电保持与时间校准的实战方法。通过硬件配置、后备寄存器(BKP)操作及软件校准策略,确保嵌入式设备在断电后仍能保持准确时间,适用于智能电表、环境监测等物联网应用场景。

weixin_29189373的博客 216

导入数据磁盘满重启失败解决过程

导入数据磁盘满重启失败解决过程 # mysqlimport 导入数据磁盘满,登录 mysql 想执行 purge binary logs,但执行 show binary logs 已卡死 systemctl stop mysql # stop mysql 后错误日志如下 tail -f /var/log/mysql/error.log 2022-02-08T01:29:23.513307Z 135 [ERROR] [MY-010907] [Server] ...

repoman的博客 1811

ansys非线性分析中接触类型

不分离(No Separation)‌:法向始终保持接触不分离,切向允许自由滑动,属于线性接触,适合需要法向约束、允许微小切向位移的场景,比如过盈配合的简化模拟。有摩擦(Frictional)‌:法向允许分离,切向根据用户设置的摩擦系数计算摩擦力,是工程中最符合实际机械接触的类型,绝大多数装配体分析都选择该类型。无摩擦(Frictionless)‌:法向允许接触面分离,切向无摩擦、允许自由滑动,适合模拟理想润滑的光滑接触面,图中当前选择的就是该类型。非线性接触(需要多次迭代,属于真正的非线性接触行为)‌。

qq_15963745的博客 71

mysql recovery = 4_使用innodb_force_recovery解决MySQL崩溃无法启动的问题

昨天电脑忽然开不开机,反复了几次,进行了磁盘检测后进去了系统,之后发现没啥毛病(装在C盘的输入法有点问题,怀疑可能是C盘所在的固态出了问题),第二天本地的MySQL一直不连接上,服务器上远程连接正常,首先到服务里看果然mysql没有启动,尝试手动启动,发现启动不了,于是去看日志 报的错很奇怪,有找不到表空间,有报错InnoDB is in read only mode.。找了很多解决方法都无法启动...

weixin_42236938的博客 1733

UDPProbe UDP端口存活探测(发送特征包+响应分析)、UDP服务识别

qDebug() << "收到响应:" << ip.toString() << ":" << port << " 服务:" << serviceName << " 响应长度:" << response.size();qDebug() << "开始探测:" << targetIp << ":" << port << " 超时时间:" << timeout << "ms";qInfo() << "\n==================== UDP探测结果 ====================";

寒寒豆豆软件公司的博客 146

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 291

mysql 启动失败 必须删除idb文件_mysql利用frm和idb文件恢复数据库

一、将data目录下的对应的数据库目录复制备份到另外一个地方[[emailprotected] /]# mkdir /home/cp -r /home/mysql-5.7.26/data/hl_central_sms_deduction/ /home/data_bak/二、连接MYSQL,删除原来的数据库,新建一个跟同名的数据库mysql>create database hl_centra...

weixin_36070282的博客 1170

apollo-慢速车向左绕行

当主车前方出现其他车辆时,通过左侧车道对前车绕行。

是菜鸟o的博客 309

mysql ibd文件恢复数据 支持ibd批量恢复

该工具,能够读取.ibd文件并将其转换为可执行的SQL,从而实现数据恢复。解析.ibd文件:读取并解析.ibd文件中的数据结构。生成SQL脚本:将解析到的数据转换为SQL插入语句。恢复数据:通过执行生成的SQL脚本,将数据重新导入数据库。

qq_24396737的博客 1759

Carla运行显示The following component(s) are required to run this program:DirectX Runtime |nvapi64.dll没有被

Carla运行显示The following component(s) are required to run this p 参考: 【1】EPIC 启动游戏提示The following component(s) are required to run this program:... - 『悬赏问答区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cnhttps://www.52pojie.cn/thread-1485651-1-1.html ...

anananajiushiwo的博客 5万+

汽车UDS诊断之诊断会话控制服务(0x10)深度剖析

DiagnosticSessionControl就是诊断会话控制。 请求消息定义 A_Data类型 参数名称 Cvt 字节值 助记符 #1 诊断会话控制请求SID M 0x10 DSC #2 子功能=[诊断会话类型] M 0x00-0xFF LEV_DS_ ...

心骗小白话的博客 7418

Mysql数据库如何利用.ibd文件恢复数据

Mysql数据库利用.ibd文件恢复数据整体操作说明:首先在目标数据库创建一张新表,表结构与原表结构一致。接着删除新建表的表空间。然后将原数据库的.ibd文件复制到目标数据库文件夹下,并修改文件权限。最后重新导入表空间。

zgs_888的博客 4456

数据分享|2023年OSM道路数据(全国,分省,分市)

首先这个工作非常有必要的,因为我们正常使用的道路的分类都是基于包括城市快速路、城市主干路、城市次干路这个体系的,大家对于这个分类体系应该更熟悉,但是OSM地图的道路分类又不是完全按这个来的,所以非常有必要重新分类;搞清楚道路类型是我们使用道路数据做很多工作的基础,比如我们在使用道路数据的时候,经常需要预估道路的行车速度,而这个速度一般就是根据道路类型来的,比如高架路的车速肯定就比城市支路快很多!下载分为两种情况,第一种是下载小区域的数据,比如下载一个街区的数据,第二种为下载整个中国范围的。

JData_Engineer的博客 4305

从ibd文件恢复MySQL数据

从ibd文件恢复MySQL数据

2026也要一起加油鸭 2198

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Navicat通过frm、ibd文件恢复mysql表数据

一、应用背景 一般正式数据库服务环境都有定时备份功能,例如我的阿里云MySql数据库服务器设置是每天备份一次,保留最近7天的数据。而我用的数据库引擎是 InnoDB,这种引擎下备份的数据表文件是frm、ibd格式的数据,直接拷贝是无法使用的。那么我们可以通过以下操作恢复某个数据表的数据(以user表作为示例)。 二、数据恢复 1、已知数据表结构 (1)、新建一个数据...

搁浅在PHP沙滩上的博客 6173

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL通过frm文件和ibd文件恢复数据

有时候可能手误删除了某表,想着能恢复原来的表结构及数据,这时候可以通过之前的frm文件和ibd文件恢复; frm文件:表的结构信息 ibd文件:表的字段值信息 以上文件默认均在mysql安装目录data文件夹下对应的数据库名文件夹中 第一步:创建同名表(如果连表明都忘记了那就GG了) net start mysql启动mysql创建同名表,记得字段个数的话就直接创建记得的N个字段,字段名...

weixin_41688518的博客 3846

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

用ibd文件恢复mysql数据库数据

问题:服务器上mysql数据库损坏 报错: 查看.err文件: [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist 发现mysql.user文件的确丢失了,,,, 现在的首要任务是恢复数据,尝试在无法启动服务的情况下恢复数据  现状:本地保存有很久之前的备...

u012720552的专栏 2601

mysql导入(ibd文件)

mysql官方文档

qq_42695907的博客 2万+

MySQL 5.7 通过frm和ibd文件恢复数据

dbsake恢复表结构, 重载ibd文件恢复表数据

我爱吃稀饭的博客 2468

MySQL仅从.frm和.ibd文件恢复数据

前言 MySQL的数据库其相关文件都会存放在安装目录下data文件夹下的同命文件夹中,不用的存储引擎创建的表其文件也不一样,下面来认识下这些数据库文件。 db.opt 用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。 .frm 与表相

真新镇的涅法雷姆 1万+

【MySQL】从frm和ibd文件恢复数据

参考文章: MySQL 利用frm文件和ibd文件恢复表数据https://www.jb51.net/article/208438.htm MySQL通过frm和ibd恢复表结构和数据的办法【基于Linux和MySQL5.6.23测试】https://www.cnblogs.com/silentdoer/p/14689588.html 假设要恢复的备份表文件为test.frm和test.ibd 从frm文件中恢复表结构 进入mysql mysql -u root -p Enter pa..

CS之路 4070
上一篇: 容器云系列之Docker容器监控工具Prometheus
下一篇: 容器云系列之基于Docker的Ansible自动化运维实现
solihawk
博客等级 码龄17年 7995粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值