Mysql直接复制表空间到其他数据库

背景

某些场景下会将日志记录到数据库中,而日志的体量是很大的,随着时间的推移总归是要将数据进行归档的,而归档库如果在初期没有规划好,空间不够用,这就涉及到大量的数据库文件迁移,而数据文件的拷贝成本是最低的,那么如何将数据库文件直接拷贝到新库就是一个问题了,接下来就是如何解决这个问题。

基本原理

在目标库创建表结构相同的库表,使用discard tablespace 命令将表空间卸掉,再从源库将ibd文件直接拷贝的目标数据库的数据目录下,在用import tablespace挂载新的表空间就可以了,import的执行时间和表的大小成正比,越大时间越持久。

操作步骤

假设从数据库A(数据文件目录为/opt/yhwch/data,数据库名为pay,ip为10.10.10.1)将表pay_info拷贝到数据库B(数据文件目录为/opt/yhwch/data,数据库名为pay,ip为10.10.10.2)

1.登录数据库B创建 pay_info

此处省略命令。

2.卸掉表空间

命令为 alter table pay_info discard tablespace; ,这个命令很快,执行完成后,到/opt/yhwch/data/pay数据库目录下确认pay_info表的ibd文件是否已被删除。

3.拷贝idb文件

有时候文件比较大,为了避免客户端连接中断导致拷贝失败,使用后台任务拷贝文件。

## 登录A机器设置免密登录
##生成秘钥
ssh-keygen -t rsa
##将秘钥发送到目标服务器,并根据提示数据目标服务器密码,搞定后用ssh测试一下,能直接登录就行
ssh-copy-id [email protected]
##执行异步拷贝文件,有异常会输出到copy_log.file文件中
nohup scp /opt/yhwch/data/pay/pay_info.ibd [email protected]:/opt/yhwch/data/pay/ > copy_log.file  2>&1 &
##检查任务是否完成
ps -ef |grep scp

4.重新挂载表空间

直接使用后台运行挂载,挂载完成后就能愉快的查询了

##挂载命令
nohup mysql -uroot -p'你的密码'  -e 'alter table pay.pay_info import tablespace' > import_log.file  2>&1 &
##检查任务是否完成
ps -ef |grep import

你可能感兴趣的:(Mysql直接复制表空间到其他数据库)