背景
某些场景下会将日志记录到数据库中,而日志的体量是很大的,随着时间的推移总归是要将数据进行归档的,而归档库如果在初期没有规划好,空间不够用,这就涉及到大量的数据库文件迁移,而数据文件的拷贝成本是最低的,那么如何将数据库文件直接拷贝到新库就是一个问题了,接下来就是如何解决这个问题。
基本原理
在目标库创建表结构相同的库表,使用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 root@10.10.10.2
##执行异步拷贝文件,有异常会输出到copy_log.file文件中
nohup scp /opt/yhwch/data/pay/pay_info.ibd root@10.10.10.2:/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