快速创建一个MySQL从库的方法
以快速创建一个MySQL从库的需求出发,如下几种备选方案:
环境:
node1 主库
node2 新服务器,需要做成node1从库 (node1已经配置免密码SSH登陆到node2)
软件版本:
CentOS7 64位
MySQL 官方5.6版本,数据库的用户名和密码都是root
都安装了percona-xtrabackup
0 弱鸡版:【最耗时间】
mysqldump -uroot -proot -q --single-transaction -A --master-data=2 > /root/all.sql # 备份
mysql -uroot -proot < /root/all.sql # 还原
这种方式最简单的,不多说。
1 初级版:
innobackupex --user=root --password=root --socket=/var/lib/mysql/mysql.sock --parallel=4 --no-timestamp /root/bak
缺点速度慢,备份的文件较大。好处是相对于mysqldump而言,这个工具能并行备份操作。
scp /root/bak root@node2:/root # 将/root/bak这个压缩后的文件scp到目标主机node2,
然后去node2解压命令如下:
mkdir /tmp/mysql # /tmp/mysql 这是个临时存放拷贝过来的数据库解压文件目录,和mysql的自己的datadir没有任何关系
cat /root/bak | lz4 -d | xbstream -x -C /tmp/mysql
innobackupex --apply-log /tmp/mysql/# 导入数据后,还要执行下整理操作
innobackupex --copy-back /tmp/mysql/ # 将整理好的数据库文件导入到原先的mysql datadir里
chown mysql.mysql /data/mysql/ -R
/etc/init.d/mysql start 这样一台mysql就启动好了
2 lz4加速版:
yum install lz4 -y # 先在2台主机上安装这个压缩工具,性能比gzip、bzip2强很多。
node1上备份:
innobackupex --user=root \
--password=root \
--socket=/var/lib/mysql/mysql.sock \
--parallel=4 \
--no-timestamp \
--stream=xbstream . | lz4 -B4 > /root/bak
scp /root/bak root@node2:/root # 将/root/bak这个压缩后的文件scp到目标主机node2,
然后去node2执行如下命令:
mkdir /tmp/mysql
cat /root/bak | lz4 -d | xbstream -x -C /tmp/mysql
innobackupex --apply-log /tmp/mysql/# 导入数据后,还要执行下整理操作
innobackupex --copy-back /tmp/mysql/ # 将整理好的数据库文件导入到原先的mysql datadir里
chown mysql.mysql /data/mysql/ -R
/etc/init.d/mysql start 这样一台mysql就启动好了
3 管道加强版:
innobackupex --user=root \
--password=root \
--parallel=4 \
--socket=/var/lib/mysql/mysql.sock \
--no-timestamp \
--stream=xbstream . |\
lz4 -B4 |\
ssh root@node2 \
"cat - > /tmp/bak"
# 上面这条命令是直接压缩并备份到远程的/tmp目录下
然后到node2上去还原:
mkdir /tmp/mysql
cat /tmp/bak | lz4 -d -B7 | xbstream -x -C /tmp/mysql
innobackupex --apply-log /tmp/mysql/# 导入数据后,还要执行下整理操作
innobackupex --copy-back /tmp/mysql/ # 将整理好的数据库文件导入到原先的mysql datadir里
chown mysql.mysql /data/mysql/ -R
/etc/init.d/mysql start 这样一台mysql就启动好了
4 直接备份到远程同时还原版: 【推荐使用方法4】
首先需要在node2上创建个/tmp/mysql目录,不然node1备份文件发送过去没目录存放。
然后再node1上执行:
innobackupex --user=root \
--password=root \
--parallel=4 \
--socket=/var/lib/mysql/mysql.sock \
--no-timestamp \
--stream=xbstream . |\
lz4 -B4 |\
ssh node2 \
"cat - | lz4 -d -B7 | xbstream -x -C /tmp/mysql"