Mysql重建超大从库

1 说明

简介:本方法可在不停止主库,不锁表的情况下,快速完成超大从库的重建

环境:以下代码的环境为Centos 6.x,其他环境请自行查询对应的安装包。

原理:innobackupex可在不影响主库正常运行的情况下,进行物理备份(mysqldump为逻辑备份,速度慢很多,对于巨额数据量备份简直是灾难),配合压缩神器pigz进行传输,备份速度变得更快!

2 具体实例

2.1 软件安装

主从库都需要安装好相同的mysql版本及innobackupex,pigz

2.1.1 导入文件

(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 具体命令

说明:确保导出数据前,主库已开启二进制日志

2.2.1 主库导出并传输到从库:

2.2.1.1 从库操作:

mv /home/mysql/data/ /home/mysql/data_bak/  #备份mysql原数据文件夹

mkdir /home/mysql/data/  #mysql的数据文件夹

chmod -R 777 /home/mysql/data/  #保证主库对此文件夹(从库)有权限,可忽略此命令

2.2.1.2 主库操作

#如数据量大,建议在screen下执行导出命令

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  [email protected] "unpigz |xbstream -x -C /home/mysql/data/"

注:/home/mysql/data/是从库的数据目录,记得提前清空或重建

2.2.2 从库恢复及启动

2.2.2.1 恢复从库数据

#保证从库mysql已经停止,

yum -y install screen

screen -R mysql_restore

innobackupex  --defaults-file=/home/mysql/data/backup-my.cnf --parallel=2 --apply-log /home/mysql/data/  #从库恢复数据

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 主库设置

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 从库设置

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

update.001822  387886382

#根据上步的结果,设置主备同步的开始点

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从库重建

主库备份及传输到从库:

time: 75分钟

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

eth0 speed: 180Mpbs

从库恢复时间:27分钟

3.2 xx管理系统

3.2.1 主从库例子

# 在主库和从库的/etc/my.cnf添加

[mysqld]

server-id = 1 # 主数据库端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

# 请完成下一节(主库例子)后,执行以下从库恢复数据

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

#根据上步的结果,设置主备同步的开始点

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  [email protected] "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采购系统

说明:因为数据量较小,使用原生的gzip替换pigz

3.3.1 主从库例子

# 在主库和从库的/etc/my.cnf添加

[mysqld]

server-id = 1 # 主数据库端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原数据文件夹

mkdir /home/mysql/data/  #mysql的数据文件夹

chmod -R 777 /home/mysql/data/  #保证主库对此文件夹(从库)有权限,可忽略此命令

useradd zengzp

passwd zengzp

# 请完成下一节(主库例子)后,执行以下从库恢复数据

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

#根据上步的结果,设置主备同步的开始点

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  [email protected] "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默认用法(默认并发线程是逻辑cpu个数)可比gzip快5.3倍,CPU消耗则是gzip的8倍,压缩比则相当;

2) 支持并行的gzip。并发8线程对比4线程提升:41.2%,16线程对比8线程提升:27.9%,32线程对比16线程提升:3%;

3) 在对压缩效率要求较高、但对短时间内CPU消耗较高不受影响的场景,使用pigz非常合适。

pig默认用当前逻辑cpu个数来并发压缩,无法检测个数的话,则并发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的核数。

解压:

pigz -d file.tgz

tar -xf --format=posix file

你可能感兴趣的:(Mysql重建超大从库)