看腻了就来听听视频演示吧:https://www.bilibili.com/video/BV1Bp4y1F7kd/
- MyISAM引擎可单独将 *.MYD和 *.MYI 拷贝到远程服务器上
- InnoDB引擎受限于版本(MySQL5.5)无法直接拷贝.ibd文件,因为在ibdata1文件保存有表的字典信息,在ibd文件保存有事务ID和日志序列号,只能用dump方式。
操作步骤:
- 获取备份表DDL,统计数据集(用于恢复后校样)
- 锁表,导出表对应的数据字典文件
- 备份表对应的数据文件和数据字典文件
- 解锁,恢复表的相关业务操作
- 在恢复环境上创建该表DDL(测试演练在同一环境故先删表再重建该表)
- 关闭该表的数据空间,即会删除该表的ibd数据文件
- 将备份数据文件和数据字典文件copy到对应数据目录下
- 应用表空间恢复数据并进行恢复后检查
- 验证恢复的数据集
直接上案例模拟演示:
# MySQL 6+ 可以直接拷贝的前提条件是独立表空间,即innodb_file_per_table=1
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
# 查看测试表DDL
mysql> show create table t12\G
*************************** 1. row ***************************
Table: t12
Create Table: CREATE TABLE `t12` (
`pid` bigint(20) unsigned NOT NULL DEFAULT '0',
`pname` varchar(20) DEFAULT NULL,
`project` varchar(20) DEFAULT NULL,
`tvalue` decimal(5,2) DEFAULT NULL,
`unit` varchar(8) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 查看测试表数据
mysql> select * from t12;
+-----+--------+---------+--------+------+
| pid | pname | project | tvalue | unit |
+-----+--------+---------+--------+------+
| 1 | 王五 | 身高 | 172.34 | cm |
| 2 | 王五 | 体重 | 69.52 | kg |
| 3 | 王五 | 年龄 | 22.00 | 岁 |
| 4 | 赵六 | 身高 | 170.52 | cm |
| 5 | 赵六 | 体重 | 80.52 | kg |
| 6 | 赵六 | 年龄 | 26.00 | 岁 |
+-----+--------+---------+--------+------+
6 rows in set (0.00 sec)
# 表加全局读锁,即把.cfg数据字典文件导出到磁盘上
mysql> flush tables t12 for export;
Query OK, 0 rows affected (0.00 sec)
# 拷贝数据目录对应库名下的 t12.ibd 和 t12.cfg文件,然后修改属性
[root@db01 mdb]# mkdir /tmp/mysql_back
[root@db01 mdb]# ll t12.*
-rw-r----- 1 mysql mysql 585 Sep 2 16:16 t12.cfg
-rw-r----- 1 mysql mysql 8690 Sep 2 16:11 t12.frm
-rw-r----- 1 mysql mysql 98304 Sep 2 16:11 t12.ibd
[root@db01 mdb]# cp t12.ibd /tmp/mysql_back
[root@db01 mdb]# cp t12.cfg /tmp/mysql_back
[root@db01 mdb]# chown -R mysql.mysql /tmp/mysql_back/t12.*
[root@db01 mdb]# ll /tmp/mysql_back/t12.*
-rw-r----- 1 mysql mysql 585 Sep 2 16:18 /tmp/mysql_back/t12.cfg
-rw-r----- 1 mysql mysql 98304 Sep 2 16:18 /tmp/mysql_back/t12.ibd
# 解锁,模拟删表
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table t12;
Query OK, 0 rows affected (0.00 sec)
# 创建原表结构
mysql> CREATE TABLE `t12` (
-> `pid` bigint(20) unsigned NOT NULL DEFAULT '0',
-> `pname` varchar(20) DEFAULT NULL,
-> `project` varchar(20) DEFAULT NULL,
-> `tvalue` decimal(5,2) DEFAULT NULL,
-> `unit` varchar(8) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
# 关闭表的数据空间并会删除其数据文件t12.ibd
mysql> alter table t12 discard tablespace;
Query OK, 0 rows affected (0.01 sec)
# 再把备份的t12.ibd 和 t12.cfg文件拷贝过来
[root@db01 mdb]# mv /tmp/mysql_back/t12.cfg .
[root@db01 mdb]# mv /tmp/mysql_back/t12.ibd .
[root@db01 mdb]# ll t12.*
-rw-r----- 1 mysql mysql 585 Sep 2 16:18 t12.cfg
-rw-r----- 1 mysql mysql 8690 Sep 2 16:26 t12.frm
-rw-r----- 1 mysql mysql 98304 Sep 2 16:18 t12.ibd
# 应用表空间恢复数据并进行恢复后检查
mysql> alter table t12 import tablespace;
Query OK, 0 rows affected (0.01 sec)
mysql> check table t12;
+---------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+-------+----------+----------+
| mdb.t12 | check | status | OK |
+---------+-------+----------+----------+
1 row in set (0.00 sec)
# 验证数据是否恢复回来
mysql> select * from t12;
+-----+--------+---------+--------+------+
| pid | pname | project | tvalue | unit |
+-----+--------+---------+--------+------+
| 1 | 王五 | 身高 | 172.34 | cm |
| 2 | 王五 | 体重 | 69.52 | kg |
| 3 | 王五 | 年龄 | 22.00 | 岁 |
| 4 | 赵六 | 身高 | 170.52 | cm |
| 5 | 赵六 | 体重 | 80.52 | kg |
| 6 | 赵六 | 年龄 | 26.00 | 岁 |
+-----+--------+---------+--------+------+
6 rows in set (0.00 sec)
MySQL的binlog系列和奇技操作:
先来聊聊MySQL的binlog文件解析
接着说说mysqlbinlog解析工具如何做数据恢复
再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能
接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能
借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能
再来介绍另一个binlog文件解析的第三方工具my2sql
顺带来聊聊MySQL误删ibdata数据文件的恢复
MySQL大表直接复制文件的copy方式