Mysql重建超大從庫

1 說明

簡介:本方法可在不停止主庫,不鎖表的情況下,快速完成超大從庫的重建

環(huán)境:以下代碼的環(huán)境為Centos 6.x,其他環(huán)境請自行查詢對應(yīng)的安裝包。

原理:innobackupex可在不影響主庫正常運行的情況下,進行物理備份(mysqldump為邏輯備份,速度慢很多,對于巨額數(shù)據(jù)量備份簡直是災(zāi)難),配合壓縮神器pigz進行傳輸,備份速度變得更快!

2 具體實例

2.1 軟件安裝

主從庫都需要安裝好相同的mysql版本及innobackupex,pigz

2.1.1 導(dǎo)入文件

(1)安裝innobackupex時的依賴包:perl-DBD-MySQL-4.013-3.el6.x86_64.rpm, libev-4.03-3.el6.x86_64.rpm

(2)壓縮神器:pigz-2.3.4.tar.gz

2.1.2 安裝pigz

#wget http://zlib.net/pigz/pigz-2.3.4.tar.gz

tar -xvzf pigz-2.3.4.tar.gz

cd pigz-2.3.4

make

cd ..

mv pigz-2.3.4 /usr/local/

ln -s /usr/local/pigz-2.3.4/pigz /usr/bin/

ln -s /usr/local/pigz-2.3.4/unpigz /usr/bin/

2.1.3 安裝innobackupex

#wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.3/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm

rpm -ivh libev-4.03-3.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

2.2 具體命令

說明:確保導(dǎo)出數(shù)據(jù)前,主庫已開啟二進制日志

2.2.1 主庫導(dǎo)出并傳輸?shù)綇膸欤?/h3>

2.2.1.1 從庫操作:

mv /home/mysql/data/ /home/mysql/data_bak/? #備份mysql原數(shù)據(jù)文件夾

mkdir /home/mysql/data/? #mysql的數(shù)據(jù)文件夾

chmod -R 777 /home/mysql/data/? #保證主庫對此文件夾(從庫)有權(quán)限,可忽略此命令

2.2.1.2 主庫操作

#如數(shù)據(jù)量大,建議在screen下執(zhí)行導(dǎo)出命令

yum -y install screen

screen -R mysql_backup

mkdir /home/mysql/backup

innobackupex --user=backup --password=*** --stream=xbstream --defaults-file=/usr/local/mysql/data/3306/my.cnf --socket=/usr/local/mysql/tmp/3306/mysql.sock --parallel=2 --tmpdir=/home/mysql/backup? /home/mysql/backup 2>>/home/mysql/backup/xbstreambackup.log | pigz -2 -p 6 -c | ssh -p 9922? mysql@10.32.59.207 "unpigz |xbstream -x -C /home/mysql/data/"

注:/home/mysql/data/是從庫的數(shù)據(jù)目錄,記得提前清空或重建

2.2.2 從庫恢復(fù)及啟動

2.2.2.1 恢復(fù)從庫數(shù)據(jù)

#保證從庫mysql已經(jīng)停止,

yum -y install screen

screen -R mysql_restore

innobackupex? --defaults-file=/home/mysql/data/backup-my.cnf --parallel=2 --apply-log /home/mysql/data/? #從庫恢復(fù)數(shù)據(jù)

2.2.2.2 重建從庫的日志目錄,啟動從庫。

cp /home/mysql/data_bak/auto.cnf? /home/mysql/data/? #拷貝從庫本機原有的auto.cnf

cp 主庫的my.cnf? /etc/my.cnf? #拷貝主庫my.cnf到從庫,并修改server_id

chown -R mysql.mysql /home/mysql/data

/etc/init.d/mysqld start

2.2.3 添加主備同步

2.2.3.1 主庫設(shè)置

echo "grant replication slave on *.* to 'repl'@"${db_slave_ip}" identified by 'zabbix_repl';" | mysql -uroot -p${MysqlPassword}

echo "flush privileges;" | mysql -uroot -p${MysqlPassword}

2.2.3.2 從庫設(shè)置

cat /home/mysql/data/xtrabackup_binlog_info #獲取到binlog和pos位置

update.001822? 387886382

#根據(jù)上步的結(jié)果,設(shè)置主備同步的開始點

echo "CHANGE MASTER TO

MASTER_HOST='10.44.66.19',

MASTER_USER='repl',

MASTER_PASSWORD='zabbix_repl',

MASTER_PORT=3306,

MASTER_LOG_FILE='update.001822',

MASTER_LOG_POS=387886382;" | mysql -uroot -p123321

echo "start slave;" | mysql -uroot -p123321

echo "show slave status\G;" | mysql -uroot -p123321 2>/dev/null | grep -E "Slave_IO_Running|Slave_SQL_Running"

2.3 參考:

http://blog.51yip.com/mysql/1650.html

http://blog.itpub.net/27099995/viewspace-1295099/

http://www.2cto.com/database/201504/390859.html

3 操作記錄

3.1 zabbix-db-slave從庫重建

主庫備份及傳輸?shù)綇膸?

time: 75分鐘

data: 358G(/home/mysql/data/)

eth0 speed: 180Mpbs

從庫恢復(fù)時間:27分鐘

3.2 xx管理系統(tǒng)

3.2.1 主從庫例子

# 在主庫和從庫的/etc/my.cnf添加

[mysqld]

server-id = 1 # 主數(shù)據(jù)庫端ID號,主從不同

log-bin = mysql-bin # 日志文件名

#/etc/init.d/mysqld restart

3.2.2 從庫例子:

rpm -ivh libev-4.03-3.el6.x86_64.rpm

rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

#wget http://zlib.net/pigz/pigz-2.3.4.tar.gz

tar -xvzf pigz-2.3.4.tar.gz

cd pigz-2.3.4

make

cd ..

mv pigz-2.3.4 /usr/local/

ln -s /usr/local/pigz-2.3.4/pigz /usr/bin/

ln -s /usr/local/pigz-2.3.4/unpigz /usr/bin/

/etc/init.d/mysqld stop

mv /var/lib/mysql /var/lib/mysql_bak

mkdir /var/lib/mysql

chmod 777 /var/lib/mysql

useradd zengzp

passwd zengzp

# 請完成下一節(jié)(主庫例子)后,執(zhí)行以下從庫恢復(fù)數(shù)據(jù)

innobackupex --defaults-file=/var/lib/mysql/backup-my.cnf --parallel=2 --apply-log /var/lib/mysql

chown -R mysql.mysql /var/lib/mysql

cp 主庫的my.cnf? /etc/my.cnf? #拷貝主庫my.cnf到從庫,并修改server_id

/etc/init.d/mysqld start

cat /var/lib/mysql/xtrabackup_binlog_info

update.001822? 387886382

#根據(jù)上步的結(jié)果,設(shè)置主備同步的開始點

echo "CHANGE MASTER TO

MASTER_HOST='10.42.79.148',

MASTER_USER='repl',

MASTER_PASSWORD='mysql_repl',

MASTER_PORT=3306,

MASTER_LOG_FILE='update.001822',

MASTER_LOG_POS=387886382;" | mysql -uroot -p

echo "start slave;" | mysql -uroot -p

echo "show slave status\G;" | mysql -uroot -p 2>/dev/null | grep -E "Slave_IO_Running|Slave_SQL_Running"

3.2.3 主庫例子:

rpm -ivh libev-4.03-3.el6.x86_64.rpm

rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

#wget http://zlib.net/pigz/pigz-2.3.4.tar.gz

tar -xvzf pigz-2.3.4.tar.gz

cd pigz-2.3.4

make

cd ..

mv pigz-2.3.4 /usr/local/

ln -s /usr/local/pigz-2.3.4/pigz /usr/bin/

ln -s /usr/local/pigz-2.3.4/unpigz /usr/bin/

cd /tmp

mkdir mysql_tmp

innobackupex --user=root --password='' --stream=xbstream --socket=/var/lib/mysql/mysql.sock --parallel=2 --tmpdir=/tmp/mysql_tmp? /tmp/mysql_tmp 2>>/tmp/mysql_tmp/xbstreambackup.log | pigz -2 -p 6 -c | ssh -p 9922? zengzp@10.42.71.219 "unpigz |xbstream -x -C /var/lib/mysql"

echo "grant replication slave on *.* to 'repl'@"10.42.71.219" identified by 'mysql_repl';" | mysql -uroot -p

echo "flush privileges;" | mysql -uroot -p

3.3 xx采購系統(tǒng)

說明:因為數(shù)據(jù)量較小,使用原生的gzip替換pigz

3.3.1 主從庫例子

# 在主庫和從庫的/etc/my.cnf添加

[mysqld]

server-id = 1 # 主數(shù)據(jù)庫端ID號,主從不同

log-bin = mysql-bin # 日志文件名

#/etc/init.d/mysqld restart

3.3.2 從庫例子:

rpm -ivh libev-4.03-3.el6.x86_64.rpm

rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

/etc/init.d/mysqld stop

mv /home/mysql/data/ /home/mysql/data_bak/? #備份mysql原數(shù)據(jù)文件夾

mkdir /home/mysql/data/? #mysql的數(shù)據(jù)文件夾

chmod -R 777 /home/mysql/data/? #保證主庫對此文件夾(從庫)有權(quán)限,可忽略此命令

useradd zengzp

passwd zengzp

# 請完成下一節(jié)(主庫例子)后,執(zhí)行以下從庫恢復(fù)數(shù)據(jù)

innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --parallel=2 --apply-log /home/mysql/data

chown -R mysql.mysql /home/mysql/data

cp 主庫的my.cnf? /etc/my.cnf? #拷貝主庫my.cnf到從庫,并修改server_id

/etc/init.d/mysqld start

cat /home/mysql/data/xtrabackup_binlog_info

mysql-bin.000004? ? ? ? 23361038

#根據(jù)上步的結(jié)果,設(shè)置主備同步的開始點

echo "CHANGE MASTER TO

MASTER_HOST='11.2.88.3',

MASTER_USER='repl',

MASTER_PASSWORD='mysql_repl',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql-bin.000004',

MASTER_LOG_POS=23361038;" | mysql -uroot -p

echo "start slave;" | mysql -uroot -p

echo "show slave status\G;" | mysql -uroot -p 2>/dev/null | grep -E "Slave_IO_Running|Slave_SQL_Running"

3.3.3 主庫例子:

rpm -ivh libev-4.03-3.el6.x86_64.rpm

rpm -ivh perl-DBD-MySQL-4.013-3.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

cd /tmp

mkdir mysql_tmp

# 添加gzip壓縮,傳輸時間明顯減小為65s(5.1G)

innobackupex --user=root --password='' --stream=xbstream --socket=/home/mysql/tmp/mysql.sock --parallel=4 --tmpdir=/tmp/mysql_tmp? /tmp/mysql_tmp 2>>/tmp/mysql_tmp/xbstreambackup.log | gzip | ssh -p 9922? zengzp@11.4.88.37 "gzip -d | xbstream -x -C /home/mysql/data"

echo "grant replication slave on *.* to 'repl'@"11.4.88.37" identified by 'mysql_repl';" | mysql -uroot -p

echo "flush privileges;" | mysql -uroot -p

4 附

多線程gzip壓縮神器—pigz

特點:

1) pigz默認用法(默認并發(fā)線程是邏輯cpu個數(shù))可比gzip快5.3倍,CPU消耗則是gzip的8倍,壓縮比則相當(dāng);

2) 支持并行的gzip。并發(fā)8線程對比4線程提升:41.2%,16線程對比8線程提升:27.9%,32線程對比16線程提升:3%;

3) 在對壓縮效率要求較高、但對短時間內(nèi)CPU消耗較高不受影響的場景,使用pigz非常合適。

pig默認用當(dāng)前邏輯cpu個數(shù)來并發(fā)壓縮,無法檢測個數(shù)的話,則并發(fā)8個線程。

安裝pigz

wget http://zlib.net/pigz/pigz-2.3.3.tar.gz

tar -xvzf pigz-2.3.3.tar.gz

#如果提示不是gz格式,請嘗試? tar -xvf pigz-2.3.3.tar.gz

cd pigz-2.3.3.tar.gz

make

如果報錯 pigz.c:(.text.startup+0xca): undefined reference to `deflateEnd' gcc

請在第八行$(CC) $(LDFLAGS) -o pigz $^ -lpthread -lm 后面添加-lz選項,表示link libz

壓縮:

tar cvf - 目錄名 | pigz -9 -p 24 > file.tgz

pigz:用法-9是壓縮比率比較大,-p是指定cpu的核數(shù)。

解壓:

pigz -d file.tgz

tar -xf --format=posix file

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容