需求:
因?yàn)樵瓉淼呐f數(shù)據(jù)庫A老舊,需要裁撤。目前計(jì)劃搭建一個新的庫B,首先讓新庫B成為舊庫A的從庫,之后反轉(zhuǎn),裁撤掉舊庫A,讓新庫B成為主庫。
問題:
A庫是另外一個庫的從庫,并且A庫中混合著innodb和myisam引擎庫表。目前新庫B打算同步A庫中一部分庫表,另外的庫表放棄。B庫主要從事離線數(shù)據(jù)統(tǒng)計(jì)。
準(zhǔn)備階段:
a.下載mysql庫,配置好新庫B。
b. 備份/etc/my.cnf.3306文件為?/etc/my.cnf.3306.bak
c. 修改 /etc/my.cnf.3306 配置文件里的參數(shù)
? ? 1. server_id 是mysql的身份ID(主從配置用到辨別mysql身份的), 修改 server_id 為一個和IP相關(guān)隨機(jī)數(shù)。
? ? 2. log_slave_updates=1;決定是否本slave庫是否要將更新寫入bin-log,如果slave可能成為主庫需要設(shè)置。
? ? 3. innodb_flush_log_at_trx_commit=2;事務(wù)等操作是否實(shí)時(shí)同步到bin-log(容災(zāi)和性能)
? ? 4. sync_binlog =1;二進(jìn)制日志同步到磁盤的頻率(數(shù)據(jù)容災(zāi))
啟動新庫B:
cd /usr/local/mysql/bin/;
mysqld_safe --defaults-file=/etc/my.cnf.3306 --user=mysql &
鎖住主庫:
? ? ? ? ?flush tables with read lock;
主庫拉取快照:
方案1、
方法:邏輯備份,將表鎖住,然后使用tar命令拷貝。
問題:要拷貝的數(shù)據(jù)太多,文件太大。tar命令拷貝之后,出現(xiàn)文件大小不一致,解壓失敗的情況。經(jīng)過嘗試,最終放棄,問題太多了。tar命令打包,新機(jī)器解包失敗,scp拷貝文件,出現(xiàn)文件大小不一致。
方案2、
方法:使用mysqldump命令導(dǎo)出數(shù)據(jù)。
一次導(dǎo)出,mysqldump ?--master-data=1 --opt --databases?demo_stat > data.demo.sql。結(jié)果數(shù)據(jù)量太大,磁盤空間不足了!
方案3、
方法:使用mysqldump命令導(dǎo)出數(shù)據(jù)。分批導(dǎo)出,分批入到新庫中。
這是最終方案。
從庫導(dǎo)入快照:
mysql -uroot < databases.sql
并查看databases.sql中的 CHANGE MASTER語句,確定binlog文件名和pos
在主庫上為從庫創(chuàng)建用戶:
grant replication slave, replication client on *.* to replication@'b.b.b.b' identified by '123456';
在從庫上設(shè)置主庫:
mysql > change master to master_host='a.a.a.a', master_user='replication', master_password='123456', master_port=3306, master_log_file='mysqlslave-log.013445', master_log_pos=185073000, master_connect_retry=10;
mysql > slave start;
解鎖主庫:
? ? ? 關(guān)閉shell。
后期觀察:
挑一個庫表,查看備份數(shù)據(jù)是否完整。
可能遇到問題:
1、Last_IO_Error: error connecting to master 'replication
Slave_IO_Running: Connecting
? ? ?原因:用戶密碼錯誤。
2、數(shù)據(jù)量過大,遷移時(shí)間太久,機(jī)器太舊。采用邏輯備份的時(shí)候,由于tar命令版本不一致,舊機(jī)器用的是tar?1.15.1,新機(jī)器用的是 tar?1.26,打出來的包有可能解不了。
3、Last_Error: Error 'Duplicate entry '567828' for key 'PRIMARY'' on query. Default database:...
? ? ? ?原因:是某個庫沒有更新,繼續(xù)鎖表,拷貝到新的機(jī)器上。
結(jié)束!