美文网首页
Mysql直接复制表空间到其他数据库

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

作者: 至爱雅鸿_e631 | 来源:发表于2022-04-07 10:03 被阅读0次

    背景

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

    基本原理

    在目标库创建表结构相同的库表,使用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
    

    相关文章

      网友评论

          本文标题:Mysql直接复制表空间到其他数据库

          本文链接:https://www.haomeiwen.com/subject/pvqtsrtx.html