MySQL 常见数据拆分办法
在生产环境中,由于业务的增长或者业务的拆分,DBA经常需要拆库操作。那么我们常见的拆库手段有哪些呢?
我这里提供几种解决办法:
1.使用mysqldump把表逻辑倒出,然后再source到其它地方
2.使用xtrabackup把表、或者库逻辑备份出,然后再recovery出一个实例
3.使用MySQL自带的表空间转移(Transport)[这个需要MySQL5.6.6以上版本支持]
I:先来看一下MySQL的Transport表空间的特性吧
比如我们要把 tab_test1从db_A移动到db_B,那么我们需要做这么一系列动作:
Step1:usedb_A;showcreatetabletab_test1;(首先,拿到需要的表结构)
Step2:usedb_B;createtabletab_test1;altertaletab_test1discardtablespace;(discardtablespace就是把ibd文件删掉,只留下.frm文件)(其次,到目标库删除掉idb文件)
Step4:usedb_A;flushtabletest122forexport;(把相关表的内存数据写入到数据库)
Step5:拷贝tab_test1.ibd文件到db_B/ 目录下;(操作系统层执行拷贝ibd文件操作)
Step6:usedb_A;unlocktables;(源库上解锁表)
Step7:usedb_B;altertabletab_test1importtablespace;(目标库执行表空间导入)
执行完上边几个步骤,我们就完成了在库之间迁移某些个表的操作了。
II:再来看一下xtrabackup导出部分表,以达到迁移目的
Step1:我们需要使用xtrabackup备份部分表
nohupperl/home/ddb/tmp/xtrabackup/bin/innobackupex-1.5.1--ibbackup=/home/tmp/xtrabackup/bin/xtrabackup_55--user=root--password=123--defaults-file=/home/my.cnf --slave-info --tables-file=/mnt/back_tables.txt/mnt/backup_1
Step2: 应用日志,进行恢复操作
nohupperl/home/tmp/percona-xtrabackup-2.1.9-Linux-x86_64/bin/innobackupex-1.5.1--ibbackup=/home/tmp/percona-xtrabackup-2.1.9-Linux-x86_64/bin/xtrabackup_55--export--apply-log--defaults-file=/home/node-1-1/backup-my.cnf/home/node-1-1/>/tmp/r.log2>&1&
Step3:重新起实例,配置复制关系,只复制部分表
my.cnf文件配置:Replicate_Wild_Do_Table/Replicate_Wild_Ignore_Table
执行完上边几个步骤,我们就完成了表的迁移操作,并且新起了个实例,达到了分库的目的。
III:最后我们就看一下mysqldump的姿势吧
额,这个就不多啰嗦了吧,mysqldump做的事情就是一些逻辑的导出,倒出来的数据我们是可以用人肉可见的。 这个需要注意的一点就是 --single-transcation选项
关于以上几种办法,我们在实际工作中需要考虑服务器的资源、内存容量等,需要结合实际情况来使用合适的办法进行拆库操作。