物理复制mysql表
   2022-09-09 17:47:17
假设现在的目标是在db1库下,复制一个跟表t相同的表r,具体的执行步骤如下:
1. 执行 create table r like t,创建一个相同表结构的空表;
2. 执行alter table r discard tablespace,这时候r.ibd文件会被删除;
3. 执行flush table t for export,这时候db1目录下会生成一个t.cfg文件;
4. 在db1目录下执行cp t.cfg r.cfg; cp t.ibd r.ibd;这两个命令(这里需要注意的是,拷贝得到的 两个文件,MySQL进程要有读写权限);
5. 执行unlock tables,这时候t.cfg文件会被删除;
6. 执行alter table r import tablespace,将这个r.ibd文件作为表r的新的表空间,
由于这个文件的数据内容和t.ibd是相同的,所以表r中就有了和表t相同的数据。
有以下几个注意点:
1. 在第3步执行完flsuh table命令之后,db1.t整个表处于只读状态,直到执行unlock tables命令后才释放读锁;
2. 在执行import tablespace的时候,为了让文件里的表空间id和数据字典中的一致,会修改r.ibd的表空间id。而这个表空间id存在于每一个数据页中。因此,如果是一个很大的文件
(比如TB级别),每个数据页都需要修改,所以你会看到这个import语句的执行是需要一些
时间的。当然,如果是相比于逻辑导入的方法,import语句的耗时是非常短的。