一、背景:

公司因为机器资源紧张,需要给测试部分腾出几台机器做测试用,需要把现有机器上的应用全部迁移到别的机器上。

经过讨论,采用Xtrabackup工具对对InnoDB做数据备份。

二、准备工作

1、安装Xtrabackup工具

1)安装依赖包

yum install libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* 

安装 perl-DBD-MySQL 时遇到了安装错误的提示:

#rpm -ivh perl-DBD-mysql-4.006-1.el5.rf.i386.rpm

warning: perl-DBD-mysql-4.006-1.el5.rf.i386.rpm: Header V3 DSA signature: NOKEY, key ID 6b8d79e6

error: Failed dependencies:

libmysqlclient.so.16 is needed by perl-DBD-mysql-4.006-1.el5.rf.i386

libmysqlclient.so.16(libmysqlclient_15) is needed by perl-DBD-mysql-4.006-1.el5.rf.i386

原因分析:因为没有安装 MySQL-shared ,mysql没有lib库,导致找不到libmysqlclient.so.16

解决办法:下载安装 MySQL-shared-compat-5.5.43-1.el7.x86_64.rpm 注意MySQL-shared 的版本不能太过,5.6以上就是libmysqlclient.so.18

2)下载安装Xtrabackup 

可以下载rpm包也可以下载源码包,如果没有特殊要求建议rpm包安装

下面介绍源码包安装方法:

1)解压     

        cd /usr/local

        tar zxvf percona-xtrabackup-2.1.5-680-Linux-x86_64.tar.gz

     2)拷贝innobackupex、xtrabackup、xtrabackup_51 工具到/usr/bin

        cp /usr/local/percona-xtrabackup-2.1.5-680-Linux-x86_64/bin/innobackupex /usr/bin/innobackupex

        cp /usr/local/percona-xtrabackup-2.1.5-680-Linux-x86_64/bin/xtrabackup  /usr/bin/xtrabackup

        cp /usr/local/percona-xtrabackup-2.1.5-680-Linux-x86_64/bin/xtrabackup_55  /usr/bin/xtrabackup_55

如果不拷贝到/usr/bin 目录下可以做个软连接。当在命令行能够tab出innobackupex 命令就表示安装成功

三、数据迁移

1、备份数据库,因为数据库比较大,可以先对数据库做备份然后再做其他操作

usr/bin/innobackupex  --user=user --password=pass --defaults-file=/etc/my.cnf --socket=/app/mydata/mysql.sock  --stream=tar /app/bak/ 2>/app/bak/mydata.log | gzip 1>/app/bak/mydata.tar.gz

备份压缩数据

因为怕在两台机器见传输出现网络问题所以,没有选择压缩传输到远程服务器,如果网络稳定或者磁盘空间不够可以选择压缩传输到远程服务器操作

/usr/bin/innobackupex --user=root --password=pass --defaults-file=/etc/my.cnf --no-timestamp --stream=tar /data/mysql_backup | gzip | ssh root@10.124.1.4" cat - > /data/mysql_backup.tgz"

2、实现数据单机多实例:

因为要迁移到的主机上已经有一个mysql数据库在跑了,所以要在这台主机上实现单机多实例。

(单机多实例的操作可以看我的另一篇微博:http://yylinux.blog.51cto.com/8831641/1677678)

1)创建一个新的目录存放数据

#mkdir /app/mydata3308

2)配置my.cnf文件,配置两个my.cnf 不同的mysql实例指向不同的my.cnf

#cp -p /etc/my.cnf /etc/my3308.cnf

#vim /etc/my3308.cnf

将port 修改为3308 和 相关path修改为对应的/app/mydata3308 的 path

3、将压缩的文件远程拷贝到目标主机

#scp weihu@10.124.1.4:/app/bak/mydata.tar.gz /apiapp/

4、数据恢复

1) 先停止数据库:mysqladmin -uroot -p -S /app/mydata/mysql.sock shotdown

2) 解压 tar -izxvf mydata.tar.gz -C /apiapp/db/   (没有db ,需要mkdir /data/back_data/db/,注意解压时一定要加上参数-i,不然没法解压)  

3) 恢复 /usr/bin/innobackupex  --defaults-file=/apiapp/db/backup-my.cnf --apply-log /apiapp/db/  (注意要指出backup-my.cnf的位置,这一步是把已经解压的数据库备份文件,和备份过程产生的redo做一下整合,保持数据的一致性,如果不做这一步数据库启动不起来)

        /usr/bin/innobackupex  --defaults-file=/etc/my3308.cnf --copy-back /apiapp/db/  (--copy-back 选项的命令从备份目录拷贝数据,索引,日志到my.cnf文   件里规定的初始位置。注意my.cnf文件中的basedir一定是空文件夹。如果不是空文件夹,执行不了)

4) 赋权 chown -R mysql:mysql /app/mydata3308

5) 重启数据库 /usr/bin/mysqld_safe --defaults-file=/etc/my3308.cnf

进入数据库查看,一切OK~