服务器崩溃导致mysql启动一会儿后自动关闭,一时排查不到问题,而mysqldump等备份工具还未来得及备份完成,或者是备份遇到了表空间文件损坏导致中断,所以需要通过ibd文件抢救尚未损坏的表数据。
大致过程为:
- 1 创建数据表a(需要从原环境dump出ddl语句)
- 2 discard
ALTER TABLE t1 DISCARD TABLESPACE;
- 3 将数据表文件a.ibd拷贝到数据库的目录下,注意要将文件授权给mysql
- 4 import
ALTER TABLE t1 IMPORT TABLESPACE;
参考官方手册Moving or Copying InnoDB Tables:
https://dev.mysql.com/doc/refman/5.7/en/innodb-migration.html
This section describes techniques for moving or copying some or all InnoDB
tables to a different server or instance. For example, you might move an entire MySQL instance to a larger, faster server; you might clone an entire MySQL instance to a new replica server; you might copy individual tables to another instance to develop and test an application, or to a data warehouse server to produce reports.
On Windows, InnoDB
always stores database and table names internally in lowercase. To move databases in a binary format from Unix to Windows or from Windows to Unix, create all databases and tables using lowercase names. A convenient way to accomplish this is to add the following line to the [mysqld]
section of your my.cnf
or my.ini
file before creating any databases or tables:
[mysqld]
lower_case_table_names=1
Techniques for moving or copying InnoDB
tables include:
-
Importing Tables
-
MySQL Enterprise Backup
-
Copying Data Files (Cold Backup Method)
-
Restoring from a Logical Backup
Importing Tables
A table that resides in a file-per-table tablespace can be imported from another MySQL server instance or from a backup using the Transportable Tablespace feature. See Section 14.6.1.3, “Importing InnoDB Tables”.
MySQL Enterprise Backup
The MySQL Enterprise Backup product lets you back up a running MySQL database with minimal disruption to operations while producing a consistent snapshot of the database. When MySQL Enterprise Backup is copying tables, reads and writes can continue. In addition, MySQL Enterprise Backup can create compressed backup files, and back up subsets of tables. In conjunction with the MySQL binary log, you can perform point-in-time recovery. MySQL Enterprise Backup is included as part of the MySQL Enterprise subscription.
For more details about MySQL Enterprise Backup, see Section 28.1, “MySQL Enterprise Backup Overview”.
Copying Data Files (Cold Backup Method)
You can move an InnoDB
database simply by copying all the relevant files listed under “Cold Backups” in Section 14.19.1, “InnoDB Backup”.
InnoDB
data and log files are binary-compatible on all platforms having the same floating-point number format. If the floating-point formats differ but you have not used FLOAT
or DOUBLE
data types in your tables, then the procedure is the same: simply copy the relevant files.
When you move or copy file-per-table .ibd
files, the database directory name must be the same on the source and destination systems. The table definition stored in the InnoDB
shared tablespace includes the database name. The transaction IDs and log sequence numbers stored in the tablespace files also differ between databases.
To move an .ibd
file and the associated table from one database to another, use a RENAME TABLE
statement:
RENAME TABLE db1.tbl_name TO db2.tbl_name;
If you have a “clean” backup of an .ibd
file, you can restore it to the MySQL installation from which it originated as follows:
-
The table must not have been dropped or truncated since you copied the
.ibd
file, because doing so changes the table ID stored inside the tablespace. -
Issue this
ALTER TABLE
statement to delete the current.ibd
file:ALTER TABLE tbl_name DISCARD TABLESPACE;
-
Copy the backup
.ibd
file to the proper database directory. -
Issue this
ALTER TABLE
statement to tellInnoDB
to use the new.ibd
file for the table:ALTER TABLE tbl_name IMPORT TABLESPACE;
Note
The
ALTER TABLE ... IMPORT TABLESPACE
feature does not enforce foreign key constraints on imported data.
In this context, a “clean” .ibd
file backup is one for which the following requirements are satisfied:
-
There are no uncommitted modifications by transactions in the
.ibd
file. -
There are no unmerged insert buffer entries in the
.ibd
file. -
Purge has removed all delete-marked index records from the
.ibd
file. -
mysqld has flushed all modified pages of the
.ibd
file from the buffer pool to the file.
You can make a clean backup .ibd
file using the following method:
-
Stop all activity from the mysqld server and commit all transactions.
-
Wait until
SHOW ENGINE INNODB STATUS
shows that there are no active transactions in the database, and the main thread status ofInnoDB
isWaiting for server activity
. Then you can make a copy of the.ibd
file.
Another method for making a clean copy of an .ibd
file is to use the MySQL Enterprise Backup product:
-
Use MySQL Enterprise Backup to back up the
InnoDB
installation. -
Start a second mysqld server on the backup and let it clean up the
.ibd
files in the backup.
Restoring from a Logical Backup
You can use a utility such as mysqldump to perform a logical backup, which produces a set of SQL statements that can be executed to reproduce the original database object definitions and table data for transfer to another SQL server. Using this method, it does not matter whether the formats differ or if your tables contain floating-point data.
To improve the performance of this method, disable autocommit
when importing data. Perform a commit only after importing an entire table or segment of a table.