MySQL數據庫遷移詳細步驟
轉載自:http://sofar.blog.51cto.com/353572/1598364
==========================================================================================
一、背景簡介
==========================================================================================
1、問題描述
由於機房搬遷,需要對後臺DB服務器進行遷移,同時為了保證在數據遷移過程中,對線上業務不造成影響,並能夠做到秒級切換。如果我們采用普通的邏輯備份,比如:mysqldump,會存在鎖表的情況,顯然不可取。因此我們采取基於物理備份的方案,備份工具選型為:xtrabackup。
2、系統環境
IP地址 |
系統版本 |
MySQL版本 |
角色 |
172.17.138.239 |
SUSE Linux Enterprise Server 10 (x86_64) |
5.0.26 |
舊環境(臨時主) |
10.217.121.196 |
CentOS 6.3 (x86_64) |
5.0.27 |
新環境(主) |
10.217.121.216 |
CentOS 6.3 (x86_64) |
5.0.27 |
新環境(從) |
(1)、由於當前的mysql版本太舊,故備份工具推薦選擇xtrabackup-2.0.8的版本;
(2)、由於當前的系統環境太舊,官方提供的xtrabackup二進制版本無法運行,故需進行源碼編譯。
3、編譯要求
(1)、需要安裝cmake依賴庫;
(2)、需要下載一份mysql-5.1.59的源碼包,放在percona-xtrabackup-2.0.8目錄下;
(3)、libtool的版本不能高於2.4。
==========================================================================================
二、xtrabackup編譯安裝
==========================================================================================
1、編譯安裝cmake
http://wwwNaNake.org/files/v2.8/cmake-2.8.10.tar.gz
# tar -xvzf cmake-2.8.10.tar.gz
# cd cmake-2.8.10
# ./bootstrap --prefix=/usr/local
# gmake --jobs=`grep processor/proc/cpuinfo | wc -l`
# gmake install
2、編譯安裝xtrabackup
http://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz
# tar xvzf percona-xtrabackup-2.0.8.tar.gz
# cd percona-xtrabackup-2.0.8
## 將mysql-5.1.59源碼包下載到percona-xtrabackup-2.0.8目錄下,無需解壓
http://downloads.mysql.com/archives/get/file/mysql-5.1.59.tar.gz
# ./utils/build.sh innodb50
註意:
以上標註部分,需要與當前的MySQL主版本對應上,如果有不明白的,可以參考以下信息。
# cat BUILD.txt
# vim ./utils/build.sh
# cp innobackupex /usr/local/bin/
# cd src
# cp xbstream xtrabackup_51 /usr/local/bin/
# cd /usr/local/bin/
# ln -s innobackupex innobackupex-1.5.1
# ln -s xtrabackup_51 xtrabackup
==========================================================================================
三、DB數據備份
==========================================================================================
1、一些常用用法
## 如果在從端運行的話
innobackupex --user=root --defaults-file=/etc/my.cnf --slave-info --no-timestamp /data/mysql_backup
## 如果在主端運行的話
innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup
## 如果在主端運行並壓縮傳輸到遠程服務器的話
innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp --stream=tar /data/mysql_backup | gzip | ssh [email protected]" cat - > /data/mysql_backup.tgz"
註意:
我們本次的備份,直接在主DB(172.17.138.239)上進行,因為xtrabackup不會鎖表,對業務不造成影響,也會為後續的主從關系建立帶來便利。
2、備份步驟
由於本地服務器的磁盤空間所剩不多,所以本次備份采用壓縮傳輸到遠程服務器的方式。但為了更好地描述在本次備份中遇到的問題,我們先采用本地模式。
# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup
註意:
如上報錯信息,主要是因為“/etc/my.cnf”配置文件裏沒有指定basedir、datadir參數設置,導致xtrabackup找不到。
# ps aux | grep mysql[d]
註意:
根據以上信息,我們需要將以下參數添加到配置文件中(/etc/my.cnf):
basedir=/usr/local/services/mysql-5.0.26
datadir=/usr/local/services/mysql-5.0.26/var
# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup
註意:
出現這種錯誤信息,是因為備份目錄“/data/mysql_backup”已經存在,主要是由前一次操作引起的。因為xtrabackup要求備份目錄事先不能存在,需要在執行時才會自動創建。
如果我們將數據備份到本地的話(前提是服務器磁盤空間足夠多),執行以下命令即可:
# rm -rf /data/mysql_backup
# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup
在恢復的時候,將本地的備份數據rsync同步到遠程服務器,然後采用xtrabackup進行恢復即可。
但考慮到本地磁盤空間不足,故本次數據遷移,我們采用壓縮傳輸到遠程服務器的備份方式(此種方法比較慢^_^),執行以下命令即可:
innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp --stream=tar /data/mysql_backup | gzip | ssh [email protected] "cat - > /data/mysql_backup.tgz"
## 本地服務器上的備份信息輸出
## 遠程服務器上的文件信息
註意:
以上數據備份時間可能會比較長,推薦放在深夜進行,第二天來恢復 ^_^
==========================================================================================
四、DB數據恢復
==========================================================================================
1、安裝mysql-5.0.27環境
http://cdn.mysql.com/archives/mysql-5.0/mysql-5.0.27.tar.gz
# /usr/sbin/groupadd mysql
# /usr/sbin/useradd mysql -g mysql -s /sbin/nologin
# mkdir -p /data/dbdata/{data,binlog,relaylog,otherlog} /var/run/mysql
# chown -R mysql:mysql /data/dbdata /var/run/mysql
# cd /usr/local/src
# tar xvzf mysql-5.0.27.tar.gz
# cd mysql-5.0.27
# ./configure --prefix=/usr/local/mysql \
--datadir=/data/dbdata/data \
--enable-thread-safe-client \
--enable-assembler \
--enable-local-infile \
--with-charset=utf8 \
--with-collation=utf8_general_ci \
--with-extra-charsets=all \
--with-unix-socket-path=/var/run/mysql/mysql.sock \
--without-debug \
--with-embedded-server \
--with-big-tables
# make --jobs=`grep processor/proc/cpuinfo | wc -l`
# make install
# cp ./support-files/mysql.server /etc/init.d/mysqld
# chmod +x /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
# cd /usr/local
# mv mysql mysql-5.0.27
# ln -s mysql-5.0.27 mysql
# chmod +w /usr/local/mysql
# chown -R mysql:mysql /usr/local/mysql/
# vim /etc/ld.so.conf
/usr/local/mysql/lib/mysql
# /sbin/ldconfig
# cd /etc
# rm -f my.cnf && ln -s my_old.cnf my.cnf
# vim my.cnf
……
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
……
註意:
以上我們故意在開始部署MySQL環境時,將表空間文件分配的少一些,這樣可以讓MySQL啟動的快一些,同時也為接下來的恢復操作以作區別。也需要註意一下以下附件中的參數“bind-address”、“server-id”。
# cd /usr/local/mysql
# ./bin/mysql_install_db --datadir=/data/dbdata/data --user=mysql
# service mysqld start
2、編譯安裝xtrabackup
在此省略,可以參考之前的步驟,或者直接將之前編譯後的二進制文件拷貝過來即可。
3、DB數據恢復
# mkdir -p /data/mysql_backup
# tar -ixvzf /data/mysql_backup.tgz -C /data/mysql_backup
註意:
在做tar解壓操作時,一定要加上“-i”參數。
# service mysqld stop
# cd /data/dbdata
# mv data data.old && mkdir data
# rm -rf binlog/*
# cd /etc
# rm my.cnf && ln -s my_new.cnf my.cnf
……
innodb_data_file_path =ibdata1:2000M;ibdata2:2000M;ibdata3:2000M;ibdata4:2000M;ibdata5:2000M;ibdata6:2000M;ibdata7:2000M;ibdata8:2000M;ibdata9:2000M;ibdata10:2000M;ibdata11:2000M;ibdata12:2000M;ibdata13:2000M;ibdata14:2000M;ibdata15:2000M;ibdata16:2000M;ibdata17:2000M;ibdata18:2000M;ibdata19:2000M;ibdata20:2000M;ibdata21:2000M;ibdata22:2000M;ibdata23:2000M;ibdata24:2000M;ibdata25:2000M;ibdata26:2000M;ibdata27:2000M;ibdata28:2000M;ibdata29:2000M;ibdata30:2000M;ibdata31:2000M;ibdata32:2000M;ibdata33:2000M;ibdata34:2000M;ibdata35:2000M;ibdata36:2000M;ibdata37:2000M;ibdata38:2000M;ibdata39:2000M;ibdata40:2000M;ibdata41:2000M;ibdata42:2000M;ibdata43:2000M;ibdata44:2000M;ibdata45:2000M;ibdata46:2000M;ibdata47:2000M;ibdata48:2000M;ibdata49:2000M;ibdata50:2000M;ibdata51:2000M;ibdata52:2000M;ibdata53:2000M;ibdata54:2000M;ibdata55:2000M;ibdata56:2000M;ibdata57:2000M;ibdata58:2000M;ibdata59:2000M;ibdata60:2000M;ibdata61:2000M;ibdata62:2000M;ibdata63:2000M;ibdata64:2000M;ibdata65:2000M;ibdata66:2000M;ibdata67:2000M;ibdata68:2000M;ibdata69:2000M;ibdata70:2000M;ibdata71:2000M;ibdata72:2000M;ibdata73:2000M;ibdata74:2000M;ibdata75:2000M;ibdata76:2000M;ibdata77:2000M;ibdata78:2000M;ibdata79:2000M;ibdata80:2000M;ibdata81:2000M;ibdata82:2000M;ibdata83:2000M;ibdata84:2000M;ibdata85:2000M;ibdata86:2000M;ibdata87:2000M;ibdata88:2000M;ibdata89:2000M;ibdata90:2000M;ibdata91:2000M;ibdata92:2000M;ibdata93:2000M;ibdata94:2000M;ibdata95:2000M;ibdata96:2000M;ibdata97:2000M;ibdata98:2000M;ibdata99:2000M;ibdata100:2000M;ibdata101:2000M;ibdata102:2000M;ibdata103:2000M;ibdata104:2000M;ibdata105:2000M;ibdata106:2000M;ibdata107:2000M;ibdata108:2000M;ibdata109:2000M;ibdata110:2000M;ibdata111:2000M;ibdata112:2000M;ibdata113:2000M;ibdata114:2000M;ibdata115:2000M;ibdata116:2000M;ibdata117:2000M;ibdata118:2000M;ibdata119:2000M;ibdata120:2000M;ibdata121:2000M:autoextend
innodb_log_file_size = 256M
innodb_log_files_in_group = 2
……
註意:
以上參數要和舊環境對應,否則無法啟動,如果參數“innodb_log_files_in_group”在舊環境沒有設置,此處可以忽略不設置,默認值為2。也需要註意一下以下附件中的參數“bind-address”、“server-id”。
# innobackupex --apply-log /data/mysql_backup
# innobackupex --copy-back /data/mysql_backup
# cp -a /usr/local/src/mysql-5.0.27/sql/share/* /data/dbdata/data/mysql/
註意:
以上步驟必須進行,否則會報錯,導致啟動失敗。
# chown -R mysql:mysql /data/dbdata/data
# service mysqld start
## 至於另一臺服務器(10.217.121.216)的DB數據恢復,可以將“10.217.121.196”上的解壓數據同步過來,然後按照同樣的方式進行恢復即可
# rsync -arvPz -e "ssh -lroot -p36000" /data/mysql_backup/ 10.217.121.216:/data/mysql_backup/
4、主從關系建立
(1)、DB賬號恢復
將“172.17.138.239”的“mysql”數據庫導出,然後導入到“10.217.121.196”
將“172.17.138.239”的從DB的“mysql”數據庫導出,然後導入到“10.217.121.216”
(2)、“10.217.121.196”與“10.217.121.216”主從關系建立
在“10.217.121.196”上的操作:
# mysql -uroot -e "grant replication slave on *.* to [email protected] identified by ‘repl123456‘;"
# mysql -uroot -e "flush privileges;"
# mysql -uroot -e "show master status\G"
在“10.217.121.216”上的操作:
# mysql -uroot -e "change master to master_host=‘10.217.121.196‘,master_user=‘repl‘,master_password=‘repl123456‘,master_log_file=‘XXX‘,master_log_pos=XXX;"
# mysql -uroot -e "start slave;"
# mysql -uroot -e "show slave status\G"
註意:
以上標註部分,需要根據實際情況填寫即可。
(3)、“172.17.138.239”與“10.217.121.196”主從關系建立
在“172.17.138.239”上的操作:
# mysql -uroot -e "grant replication slave on *.* to [email protected] identified by ‘repl123456‘;"
# mysql -uroot -e "flush privileges;"
# mysql -uroot -e "show master status\G"
在“10.217.121.196”上的操作:
# cat /data/mysql_backup/xtrabackup_binlog_info
# mysql -uroot -e "change master to master_host=‘172.17.138.239‘,master_user=‘repl‘,master_password=‘repl123456‘,master_log_file=‘TaeSupport.001635‘,master_log_pos=436953160;"
# mysql -uroot -e "start slave;"
# mysql -uroot -e "show slave status\G"
最終的主從關系如下:
172.17.138.239 à 10.217.121.196 à 10.217.121.216
Mater Master Slave Slave
註意:
以上3臺DB的配置文件“/etc/my.cnf”中的“server-id”參數,必須保持不相同,否則你懂得 ^_^
業務側切換時,只需指向新的主DB“10.217.121.196”即可,待確認無誤後,停掉之前建立的“172.17.138.239”與“10.217.121.196”主從關系,而“10.217.121.196”與“10.217.121.216”主從關系需保留不動。
==========================================================================================
五、一些問題總結
==========================================================================================
1、由於MySQL-5.0.26的版本存在較多BUG,官方已不提供下載,所以本次的新環境采用MySQL-5.0.27;
2、之前嘗試遷移到5.1、5.5系列版本,但在做主從設置時,總會報錯,嘗試了MySQL-5.0.37版本也不行,這也驗證了MySQL-5.0.26的確存在BUG的可能性;
3、目前我們在MySQL-5.0.26與MySQL-5.0.27之間建立主從關系是可以的,但個人還是比較推薦5.5系列的版本,接下來可以嘗試在MySQL-5.0.27與MySQL-5.5.X之間建立主從;
4、本次遷移工作也比較耗時,主要是涉及到太多表空間文件,其實邏輯數據也沒那麽多,個人覺得之前的舊環境下的“innodb_data_file_path”參數設置不是太合理,可以考慮對ibdata進行瘦身和配置調整;
5、在遷移過程中,卻發現之前的64為環境下,運行的卻是32位版本的MySQL,這樣就會導致一個問題,就算你在64位環境下,內存再多,而你的緩沖池大小最多也只能設置到4G。
MySQL數據庫遷移詳細步驟