一、背景:
公司因爲機器資源緊張,需要給測試部分騰出幾臺機器做測試用,需要把現有機器上的應用全部遷移到別的機器上。
經過討論,採用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 [email protected]" 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 [email protected]:/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~