xtrabackup快速创建MySQL5.7 slave
一、一般创建slave
(1)在主库上面运行innobackupex命令,将MySQL备份到bak目录
innobackupex --user=root
--password=mysql
--socket=/data/mysql_3306/mysql.sock
--no-timestamp bak
(2)把备份好的bak目录scp拷贝到另外一台机器的/dbdata/bak目录
scp -rp bak servier208:/data/bak
(3)去备机上把备份的目录prepare好
innobackupex --apply-log bak
(4)把prepare好的备份目录拷贝回数据目录
innobackupex --copy-back bak
(5)修改数据目录权限,启动MySQL
chown -R mysql:mysql /dbdata/mysql
service mysql start
(6)change master追主库(data目录下,xtrabackup_binlog_info记录了日志位置)
mysql> change master to ...
mysql> start slave;
mysql> show slave status\G
如果数据目录有500G,可能你需要几个小时,网络不好或者系统资源紧张,可能十几个小时才能完成。
2. 思考
可不可以快一些,怎么做才能在最短时间内备份MySQL并还原出一台从机呢?可以做哪些优化呢?
直接备份到远程服务器同时还原(全程中间无落盘)
innobackupex \
--defaults-file=/db/mysql_3307/my.cnf \
--host=localhost \
--user=innobk \
--password=mysql \
--parallel=4 \
--stream=xbstream \
--no-timestamp \
--socket=/usr/local/mysql/3307/mysql.sock \
/data/backup/3307/full |
lz4 -B4 |
ssh server2
"cat - | lz4 -d -B7 | xbstream -x -C /dbdata/mysql"
这里所有的备份、压缩和传输到远程以及解压缩都在几个管道连起来,可以理解为这些操作都是在并行执行。
(1)不占用远程更多的空间,其它方案远程服务器解压完成后才能删除压缩文件;
(2)充分利用了Linux的管道操作,甚至脚本化,非常高效
实际备份以及还原时间和服务器网络、磁盘以及数据库中的数据本身关系较大。。
==========================完整流程===================================
使用xtrabackup --backup选项进行备份后,数据文件并不一致,因为它们在程序运行时被复制在不同的时间,并且在发生这些情况时可能会被更改。 如果您尝试使用这些数据文件启动InnoDB,它将检测到损坏并自动崩溃,以防止在损坏的数据上运行。
xtrabackup -prepare步骤使得文件在一段时间内完美地保持一致,所以您可以在其上运行InnoDB。
完整流程如下:
第一步:
然后在备机上。(说明,在备份之前,我已经在slave上创建了一个新的实例,并配置好了my.cnf,随时可以启动的,所以进入到data目录下,删除data目录所有文件。必须保证data目录为空。)用脚本创建一个实例,然后不启动,删除data目录下文件即可。
第二步:
innobackupex --user=root
--password=mysql
--parallel=4
--socket=/data/mysql_3306/mysql.sock
--no-timestamp
--stream=xbstream .|
lz4 -B4 |
ssh server208
"cat - | lz4 -d -B7 | xbstream -x -C /data/mysql_3307/data/"
说明:4线程并行备份,xbstream流式备份,lz4压缩,ssh传送到server208,同时208用lz4解压到/data/mysql_3307/data/,这就是数据目录。
第三步:
Prepare处理(备机上):
xtrabackup --prepare --target-dir=/data/mysql_3307/data/
第四步:
chown -R mysql:mysql /data/mysql_3307/data/
启动MySQL。/etc/init.d/mysqld_3307 start
建立复制,先查看备份时的log位置。
[root@test208 ~]# cat /data/mysql_3307/data/xtrabackup_binlog_info
bin.000045 1154 effb7aa4-2576-11e7-89b4-5254001f508d:1-41177
登录MySQL
mysql> change master to master_host='192.168.0.207',
master_user='repl',
master_password='mysql',
master_port=3306,
master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
清理日志信息。
mysql> reset master ;
Query OK, 0 rows affected (0.02 sec)
配置忽略日志的位置。
mysql> set @@global.gtid_purged='effb7aa4-2576-11e7-89b4-5254001f508d:1-41177';
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
然后确认复制态。
确认当前复制位置,以及确认相关数据是否正确。
完美!