使用XtraBackup热备份搭建MySQL主从同步

使用XtraBackup热备份搭建MySQL主从同步

1 背景描述

  • 生产环境一台MYSQL主库,没有搭建从库,急需搭建从库
  • 每天已有innobackupex备份

2 方案

  • 利用innobackupex全备和增量备份搭建MYSQL主库

3 数据库版本

  • 主库:mysql 5.5.54
  • 从库:mysql 5.7.25(为了以后升级)

4 搭建步骤

  搭建的步骤如下图所示:

 

(1)将数据库备份拷贝到从库上

(2)在从库上安装好MYSQL数据库,安装过程略

(3)停止从库的MYSQL实例,删除从库数据库里面的文件,保留目录结构

1. 我的从数据库安装在/u02/my3306下, 目录结构如下

$ tree -L 1
.
├── data ├── log ├── my.cnf ├── run └── tmp​

将data数据文件,log中的binlog,ibdata1文件均删除掉

2. 我的主库的备份文件如下:

 

# ll
total 24
drwxr-x--- 9 mysql mysql 4096 Nov 14 15:14 20191110_0_full
drwxr-x--- 9 mysql mysql 4096 Nov 14 15:14 20191111_1_incremental
drwxr-x--- 9 mysql mysql 4096 Nov 14 15:15 20191112_2_incremental
drwxr-x--- 9 mysql mysql 4096 Nov 14 15:15 20191113_3_incremental
drwxr-x--- 9 mysql mysql 4096 Nov 14 15:15 20191114_4_incremental

 

3. 使用innobackupex【安装innobackupex步骤可参考  https://www.cnblogs.com/doctormo/p/12321989.html 】恢复到从库

​# innobackupex --apply-log --redo-only 20191110_0_full
# innobackupex --apply-log --redo-only --incremental-dir=20191111_1_incremental 20191110_0_full
# innobackupex --apply-log --redo-only --incremental-dir=20191112_2_incremental 20191110_0_full
# innobackupex --apply-log --redo-only --incremental-dir=20191113_3_incremental 20191110_0_full
# innobackupex --apply-log  --incremental-dir=20191114_4_incremental 20191110_0_full
# innobackupex --apply-log  20191110_0_full
# innobackupex --defaults-file=/u02/my3306/my.cnf --copy-back  20191110_0_full

 4. 修改数据库目录属组权限

# chown -R mysql.mysql /u02/my3306

5. 启动数据库

su - mysql -c "/usr/local/mysql/bin/mysqld_safe --defaults-file=/u02/my3306/my.cnf &"

6. 打开​​​​​20191114_4_incremental【最后一个增量备份目录】下的 xtrabackup_binlog_info ,里面有备份的时候主库的binglog和postion。

$ cat xtrabackup_binlog_info 
mysql-bin.000617        31060438

7. 在主库上创建同步的账号

# mysql -uroot -p -S /u02/my3306/run/mysql.sock
mysql> grant replication slave on *.* to 'repl'@'xxx' identified by 'xxxx';​

8. 在从库上执行change master 命令

change master to master_host = 'xxx',master_user = 'repl', master_password = 'xxxx',master_port = 3306, master_log_file = 'mysql-bin.000617', master_log_pos = 31060438;​​

注:如果是使用GTID的话,在从库首先使用reset master; 然后需要查询备份的时候的xtrabackup_info文件的binlog_pos = filename 'xxx', position 'xxx', GTID of the last change 'xxx:1-132464' 这一行,获取到GTID的值, 接着在从库中执行set @@GLOBAL.GTID_PURGED="

xxx:1-132464"; 这里的GLOBAL.GTID_PURGED的值就是GTID of the last change 'xxx:1-132464' 的值, 接着执行

change master to master_host = 'xxx',master_user = 'repl', master_password = 'xxxx',master_port = 3306, MASTER_AUTO_POSITION = 1; 就可以了。

至此,主从搭建完成。​​

(4)若同步中出现以下报错,需要执行以下命令

# mysql_upgrade -u root -p -S /u02/my3306/run/mysql.sock
【主库:5.5 从库 5.7】​

(5)这个备份也可以配合binlog日志,恢复到指定时间点。
如果有误删除数据的情况发生的话,也是可以通过这种方法,配和在线的binlog日志,恢复到指定的时间点。

比如场景如下:备份是在凌晨2点进行的,第二天中午11点,开发误drop了一张表​​​

步骤如下:

​​1. 先按照步骤1,2,3 搭建好一个应用了备份的数据库

2. ​​把增量备份后的binlog日志解析成sql文件,如

# mysqlbinlog --start-position=31060438 mysql-bin.000006 >> /tmp/tmp.sql​
# cat ​ /tmp/tmp.sql | grep -C 20 -i "drop table "

找到drop语句之前的binlog位置,加入位置为41060438

3. ​​ 然后将binlog日志恢复成sql文件

# mysqlbinlog --start-position=31060438 --stop-position=41060438 mysql-bin.000006 > /tmp/tmp2019.sql​​

4. 数据库中执行该sql文件。

# mysql -uroot -p  < ​ /tmp/tmp2019.sql​

5. 将drop表的数据导出,导到生产库中​。

posted @ 2020-02-17 15:21  xuege  阅读(522)  评论(0编辑  收藏  举报