本章是《Docker下MySQL主从三部曲》的终篇,前面的章节我们能够制作镜像来搭建主从同步环境,本章我们来观察binlog参数MASTER_LOG_POS;
原文地址:https://blog.csdn.net/boling_cavalry/article/details/79782008
在设置从库同步的时候一般会使用以下SQL:
CHANGE MASTER TO MASTER_HOST='172.17.0.2', \
MASTER_USER='rep', \
MASTER_PASSWORD='888888', \
MASTER_LOG_FILE='mysql-bin.000001', \
MASTER_LOG_POS=745;
今天我们的实战和上面的MASTER_LOG_FILE、MASTER_LOG_POS两个参数有关;
上一章制作从库镜像时并未设置MASTER_LOG_FILE和MASTER_LOG_POS,但是之前的文章《Docker下手工配置MySQL主从》中却又设置了这两个参数,那么在设置主从同步的时候,究竟该不该设置这两个参数呢?
前面两章实战我们已经验证过了,不设置这两个参数并不会影响主从同步,所以可以不设置,那么就剩下一个问题:设置了MASTER_LOG_FILE和MASTER_LOG_POS有什么影响?
在master容器的MySQL命令行执行show master status:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
如上所示,bin log文件名为mysql-bin.000003,在/etc/mysql/mysql.conf.d/mysqld.cnf中定义的文件路径如下:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
根据以上配置信息,我们在/var/lib/mysql目录下找到了bin log文件mysql-bin.000003,如下:
root@ae594a28192d:/var/lib/mysql# pwd
/var/lib/mysql
root@ae594a28192d:/var/lib/mysql# ls -al
total 191468
drwxr-xr-x 5 mysql mysql 4096 Apr 2 01:12 .
drwxr-xr-x 19 root root 4096 Mar 14 07:47 ..
-rw-r----- 1 mysql mysql 56 Apr 2 01:12 auto.cnf
-rw------- 1 mysql mysql 1675 Apr 2 01:12 ca-key.pem
-rw-r--r-- 1 mysql mysql 1107 Apr 2 01:12 ca.pem
-rw-r--r-- 1 mysql mysql 1107 Apr 2 01:12 client-cert.pem
-rw------- 1 mysql mysql 1675 Apr 2 01:12 client-key.pem
-rw-r----- 1 mysql mysql 1353 Apr 2 01:12 ib_buffer_pool
-rw-r----- 1 mysql mysql 50331648 Apr 2 01:13 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Apr 2 01:12 ib_logfile1
-rw-r----- 1 mysql mysql 79691776 Apr 2 01:13 ibdata1
-rw-r----- 1 mysql mysql 12582912 Apr 2 01:13 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Apr 2 01:12 mysql
-rw-r----- 1 mysql mysql 177 Apr 2 01:12 mysql-bin.000001
-rw-r----- 1 mysql mysql 3039401 Apr 2 01:12 mysql-bin.000002
-rw-r----- 1 mysql mysql 154 Apr 2 01:12 mysql-bin.000003
-rw-r----- 1 mysql mysql 57 Apr 2 01:12 mysql-bin.index
drwxr-x--- 2 mysql mysql 4096 Apr 2 01:12 performance_schema
-rw------- 1 mysql mysql 1675 Apr 2 01:12 private_key.pem
-rw-r--r-- 1 mysql mysql 451 Apr 2 01:12 public_key.pem
-rw-r--r-- 1 mysql mysql 1107 Apr 2 01:12 server-cert.pem
-rw------- 1 mysql mysql 1675 Apr 2 01:12 server-key.pem
drwxr-x--- 2 mysql mysql 12288 Apr 2 01:12 sys
root@ae594a28192d:/var/lib/mysql#
设置同步时,若MASTER_LOG_FILE有误会怎么样?来试试:
1. 进入MySQL第一从库容器,再进入MySQL命令行;
2. 执行stop slave;停止同步;
3. 执行以下SQL重新设置同步参数,其中MASTER_LOG_FILE已被改成一个不存在的文件名“mysql-bin.999999”:
CHANGE MASTER TO MASTER_HOST='masterhost', \
MASTER_USER='rep', \
MASTER_PASSWORD='888888', \
MASTER_LOG_FILE='mysql-bin.999999', \
MASTER_LOG_POS=154;
4. 执行start slave;开始同步;
5. 执行show slave status\G查看同步状态,发现”Last_IO_Error”字段的值如下,提示找不到binlog文件:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
6. 此时在主库的MySQL命令行执行SQL新增一条记录:insert into test_table(name) values (‘tom’);;
7. 回到第一从库查看test_table表,发现数据没有同步过来;
8. 去第二从库查看test_table表,数据同步正常:
小结:MASTER_LOG_FILE的值与主库同步的binlog名不一致会导致同步失败;
接下来看看MASTER_LOG_POS参数的作用,我们把之前的容器全部清除再重新来验证:
1. 在docker-compose.yml文件所在目录下执行docker-compose down,将一主二从容器全部删除;
2. 在docker-compose.yml文件所在目录下执行docker-compose up -d,像《Docker下MySQL主从三部曲之一:极速体验》一样重新创建一主二从;
3. 进入第一从库,在MySQL命令行执行stop slave;,将主从同步停止;
4. 在MySQL主库的命令行执行以下命令,创建数据库、表、新增记录:
create database test001;
use test001;
CREATE TABLE `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test_table(name) values ('jerry');
5. 执行show master status;,查出binlog文件名为mysql-bin.000003;
6. 推出MySQL命令行,执行mysqlbinlog /var/lib/mysql/mysql-bin.000003 > ~/mysql-bin.000003.txt将binlog文件转成可读的文本文件;
7. 打开文件~/mysql-bin.000003.txt,看到如下内容:
SET @@session.collation_database=DEFAULT/*!*/;
create database test001
/*!*/;
# at 322
#180402 12:37:52 server id 1 end_log_pos 387 CRC32 0xa2118048 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 387
#180402 12:37:52 server id 1 end_log_pos 628 CRC32 0x4eb6b868 Query thread_id=4 exec_time=1 error_code=0
use `test001`/*!*/;
SET TIMESTAMP=1522672672/*!*/;
CREATE TABLE `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 628
#180402 12:37:57 server id 1 end_log_pos 693 CRC32 0x37e9fbe9 Anonymous_GTID last_committed=2 sequence_number=3 rbr_only=ye
s
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 693
#180402 12:37:57 server id 1 end_log_pos 768 CRC32 0x0a4b387b Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1522672677/*!*/;
BEGIN
/*!*/;
# at 768
#180402 12:37:57 server id 1 end_log_pos 827 CRC32 0x45fec29f Table_map: `test001`.`test_table` mapped to number 108
# at 827
#180402 12:37:57 server id 1 end_log_pos 874 CRC32 0x620435ef Write_rows: table id 108 flags: STMT_END_F
BINLOG '
JSTCWhMBAAAAOwAAADsDAAAAAGwAAAAAAAEAB3Rlc3QwMDEACnRlc3RfdGFibGUAAgMPAiwBAp/C
/kU=
JSTCWh4BAAAALwAAAGoDAAAAAGwAAAAAAAEAAgAC//wBAAAABQBqZXJyee81BGI=
'/*!*/;
# at 874
#180402 12:37:57 server id 1 end_log_pos 905 CRC32 0x6128e936 Xid = 29
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
从上述内容可以看到,每次写入操作之后都会有个# at xxx这样的标记,这就是MASTER_LOG_POS对应的数字;
8. 将上面的几个关键点整理成下面的表格:
at值 | at前面的操作 |
---|---|
154 | 此位置之后会执行创建数据库的操作 |
322 | 创建数据库 |
628 | 创建表 |
874 | 向表中新增一条记录 |
接下来我们修改MASTER_LOG_POS参数试试:
1. 进入第一从库容器的MySQL命令行;
2. 执行下面的SQL,令MASTER_LOG_POS等于628,也就是不包含创建数据库和创建表的binlog内容:
CHANGE MASTER TO MASTER_HOST='masterhost', \
MASTER_USER='rep', \
MASTER_PASSWORD='888888', \
MASTER_LOG_FILE='mysql-bin.000003', \
MASTER_LOG_POS=628;
3. 进入第一从库,在MySQL命令行执行start slave;,将主从同步启动;
4. 执行show slave status\G查看同步状态,看到Last_SQL_Error字段的内容如下:
Last_SQL_Error: Error executing row event: 'Table 'test001.test_table' doesn't exist'
如上所示,MASTER_LOG_POS参数指定的AT数字之后的binlog才会被执行,之前的是不执行的;
5. MySQL命令行执行stop slave;,将主从同步停止;
6. 执行下面的SQL,令MASTER_LOG_POS等于154,也就是创建数据库之前的位置:
CHANGE MASTER TO MASTER_HOST='masterhost', \
MASTER_USER='rep', \
MASTER_PASSWORD='888888', \
MASTER_LOG_FILE='mysql-bin.000003', \
MASTER_LOG_POS=154;
7. MySQL命令行执行start slave;,将主从同步启动;
8. 查看同步状态,已经正常,再去查数据库数据,也已经同步过来了:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test001 |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test001;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test_table;
+----+-------+
| id | name |
+----+-------+
| 1 | jerry |
+----+-------+
1 row in set (0.00 sec)
到这里,对MASTER_LOG_POS参数的实战就结束了,该参数与binlog中的“at”标记对应,如果设置不当,会导致前面的SQL操作丢失,在遇到有依赖的同步操作时就会有问题;
至此,Docker下MySQL主从三部曲就全部结束了,希望能够给您的Docker实战带来一些参考,助您做出更实用的镜像;
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数