MySQL大表直接复制文件的copy方式

看腻了就来听听视频演示吧: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方式

你可能感兴趣的:(MySQL,mysql,adb,数据库)