首页 > 数据库 >MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量

MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量

时间:2023-04-20 15:47:13浏览次数:39  
标签:executed MySQL sec master mysql innobackupex 从库 purged gtid

问题描述:

使用innobackupex 搭建主从的步骤如下:

1.主库使用 innobackupex 备份并 apply-log
2.将备份文件拷贝至从库,从库清空datadir目录,并使用 innobackupex 进行 copy-back
3.从库根据备份目录中的 xtrabackup_binlog_info 的GTID信息来设置 gtid_purged 变量。
4.从库 change master 并 start slave.

在下面的场景中,确少了第3步,导致主从数据发生了不一致:

  1. 主库上创建表 t1007 并插入一条记录:

mysql> create table t1007(id int);
Query OK, 0 rows affected (0.02 sec)
 
mysql> flush binary logs;
Query OK, 0 rows affected (0.02 sec)
 
mysql> insert into t1007 values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> show global variables like '%gtid%';
+----------------------------------+---------------------------------------------+
| Variable_name                    | Value                                       |
+----------------------------------+---------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                          |
| enforce_gtid_consistency         | ON                                          |
| gtid_executed                    | b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-7338 |
| gtid_executed_compression_period | 1000                                        |
| gtid_mode                        | ON                                          |
| gtid_owned                       |                                             |
| gtid_purged                      | b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-16   |
| session_track_gtids              | OFF                                         |
+----------------------------------+---------------------------------------------+
8 rows in set (0.00 sec)

=======
# cat xtrabackup_binlog_info 
mysql-bin.000010        456     b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-7338
==================
  1. 主库使用innobackupex备份并在从库恢复

  2. 从库change master 并 start slave


mysql>  show global variables like '%gtid%';
+----------------------------------+---------------------------------------------+
| Variable_name                    | Value                                       |
+----------------------------------+---------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                          |
| enforce_gtid_consistency         | ON                                          |
| gtid_executed                    | b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-7337 |
| gtid_executed_compression_period | 1000                                        |
| gtid_mode                        | ON                                          |
| gtid_owned                       |                                             |
| gtid_purged                      | b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-7337 |
| session_track_gtids              | OFF                                         |
+----------------------------------+---------------------------------------------+
8 rows in set (0.00 sec)
 
 
mysql> change master to master_user='mysqlsync',
    -> master_password='xxxxxxxx',
    -> master_port=3306,
    -> master_host='197.0.xx.xxx',
    -> MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
 
mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                              |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1759 | Sending passwords in plain text without SSL/TLS is extremely insecure.                                                                                                                                                                                                               |
| Note  | 1760 | Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> start slave;
Query OK, 0 rows affected (0.06 sec)
 
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
..
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
..
           Retrieved_Gtid_Set: b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:7338
            Executed_Gtid_Set: b0dd0ee8-ffd9-11e9-8d1c-005056aa8c82:1-7338
                Auto_Position: 1
...
1 row in set (0.00 sec)
 
mysql> select * from xiaoyan.t1007;
+------+
| id   |
+------+
|    1 |
|    1 |
+------+
2 rows in set (0.00 sec)

可以看到从库查到到 t1007 有两条记录,至此主从数据已经不一致了,但是没有任何报错。

原因如下:
主库上的 insert 语句的事务编号是 7338,从库恢复之后可以看到从库的 gtid_executed 为 1-7337 ,因此建立主从关系之后从库会再做一次 7338号事务,因此相当于又做了一次插入,加上表本身的一条记录,结果是两条记录。

为那么从库的 gtid_executed 不是 1-7338 呢?因为它是从主库备份恢复过来的,主库备份的时候实际上是备份的 表 mysql.gtid_executed 的数据,在上一篇文章 中说过,这个表记录并不准确,它和实际执行过的 GTID 不一样,它不包含活动的 BINLOG 中的 GTID 。 主库上 7338 号事务完成后并没有 flush binary logs,因此 mysql.gtid_executed 中只有 1-7337.

因此,如果主库上有事务在进行,大多数情况下,备份出来的 gtid_executed 都不准确。
在搭建从库时,需要查看 xtrabackup_binlog_info 文件,该文件中的 gtid_executed 才准确,需要在start slave之前 先 reset maset ,并 set global gtid_purged 为 xtrabackup_binlog_info中的值。

标签:executed,MySQL,sec,master,mysql,innobackupex,从库,purged,gtid
From: https://www.cnblogs.com/whiteY/p/17337046.html

相关文章

  • 48 结束语 | 点线网面,一起构建MySQL知识网络
    时光流逝,这是专栏的最后一篇文章。回顾整个过程,如果用一个词来描述,就是“没料到”:我没料到文章这么难写,似乎每一篇文章都要用尽所学;我没料到评论这么精彩,以致于我花在评论区的时间并不比正文少;我没料到收获这么大,每一次被评论区的提问问到盲点,都会带着久违的兴奋去分析代码。......
  • 47 直播回顾 | 林晓斌:我的 MySQL 心路历程【无音频】
    在专栏上线后的11月21日,我来到极客时间做了一场直播,主题就是“我的MySQL心路历程”。今天,我特意将这个直播的回顾文章,放在了专栏下面,希望你可以从我这些年和MySQL打交道的经历中,找到对你有所帮助的点。这里,我先和你说一下,在这个直播中,我主要分享的内容:我和MySQL打交道的经历;......
  • MySQL常用命令
    查询所有数据库名![image]showdatabases;(https://img2023.cnblogs.com/blog/2805463/202304/2805463-20230420144431240-201364771.png)(使用哪个数据库)use[databasename];(查询数据库下的所有表名)showtables;(查询表中数据)select*from[tablename];(查询表结构)des[tab......
  • MySQL 优化
    Mysql优化总的来说就是尽量提高索引的利用率,和减少全表扫描尽量拆分查询,在程序中处理,一般不要过多连表链接查询一般都是用左小表链接右大表,看情况用左链接还是内连接利用redis进行缓存,并提高缓存命中使用explain进行检查检查索引使用情况,尽量将条件放......
  • Fedora 8下的MySQL源码安装手记
    评:系统开发计划改变!弃PostgreSQL!拥抱MySQL!当然前提是依然支持BerkeleyDB作为存储引擎的MySQL版本,5.1.12版本的MySQL已经正式将BDB从数据库引擎列表中扫地出门,虽然MySQL宣称这和Oracle收购Sleepycat没有任何关系,但是Oracle发面称是公司内部BDB开发团队要求取消支持的,所以也不太清......
  • MySQL InnoDB Architecture 简要介绍
    MySQLInnoDB存储引擎整体架构图:一、内存存储结构 1、BufferPoolbufferpool是主内存中的一块儿存储区域,用于存储访问的表及索引数据。这样从内存中直接访问获取使用的数据可以极大的提升访问效率。在一些特殊专用的服务里,几乎80%的内存区域都被赋于bufferpool。为了......
  • mysql重连,连接丢失:The Last Packet Successfully Received From the Server
    源:http://nkcoder.github.io/评:1.1错误信息:Causedby:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Thelastpacketsuccessfullyreceivedfromtheserverwas20,820,001millisecondsago.Thelastpacketsentsuccessfullytotheserverwas20,82......
  • Mysql经mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案
    评:MySQL的默认设置下,当一个连接的空闲时间超过8小时后,MySQL就会断开该连接,而c3p0连接池则以为该被断开的连接依然有效。假设你的数据库是mysql,如果数据源配置不当,将可能发生经典的“8小时问题”。原因是mysql在默认情况下,如果发现一个连接的空闲......
  • Oracle MySQL Server 拒绝服务漏洞(CVE-2023-21912) 修复
    CVE编号公告标题和摘要最高严重等级受影响的软件CVE-2023-21912OracleMySQLServer拒绝服务漏洞未经身份验证的远程攻击者可通过MySQL协议网络访问MySQLServer,成功利用此漏洞可导致目标MySQLServer挂起或频繁重复崩溃,造成拒绝服务攻击重要MySQLServer<=5.7.41......
  • 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中num列没有null值,然......