一. 先配置好一个主从案例

配置主从

注意:my.cnf中加入一行配置:

[mysqld]
# 这个参数表示启用 binlog 功能,并指定 binlog 的存储目录
log-bin=javaboy_logbin
# 设置 binlog_format 格式
binlog_format=STATEMENT
# 设置一个 binlog 文件的最大字节
# 设置最大 100MB
max_binlog_size=104857600
# 设置了 binlog 文件的有效期(单位:天)
expire_logs_days = 7
# binlog 日志只记录指定库的更新(配置主从复制的时候会用到)
binlog-do-db=db01
# binlog 日志不记录指定库的更新(配置主从复制的时候会用到)
#binlog-ignore-db=javaboy_no_db
# 写缓存多少次,刷一次磁盘,默认 0 表示这个操作由操作系统根据自身负载自行决定多久写一次磁盘
# 1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘
sync_binlog=0

log-bin:同步的日志路径及文件名,一定注意这个目录要是 MySQL 有权限写入的(我这里是偷懒了,直接放在了下面那个datadir下面)。
binlog-do-db:要同步的数据库名,当从机连上主机后,只有这里配置的数据库才会被同步,其他的不会被同步。
server-id: MySQL 在主从环境下的唯一标志符,给个任意数字,注意不能和从机重复。修改 binlog_format 的值为 STATEMENT,这一点很关键。

二.进行一致性的测试

接下来创建db01数据库

mysql主键保证唯一的原理_MySQL

数据表user表中加入一条数据
INSERT INTO USER VALUES(1,UUID(),'zhangsan'); 同理再加入一条

查看主机的数据库中存储的UUID

mysql主键保证唯一的原理_数据库_02

查看从机的数据库中存储的UUID

mysql主键保证唯一的原理_数据库_03

因为前面设置了binglog_format的格式,现在这里就显示了主机从机数据不一致。

三.主从不一致分析:

我们知道,MySQL 主从同步最主要的依据就是 binlog 1.master 将自己的 binlog 发给 slave 2.slave 重放之后获取和 master 一致的数据。

那我们就来看看 master 生成的 binlog 是啥样子。
我们按照事件的方式来看一下 binlog,命令格式如下:

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

这个表示以事件的方式来查看binlog,涉及到了几个参数:

log_name:可以指定要查看的 binlog 日志文件名,如果不指定的话,表示查看最早的 binlog 文
件。
pos:从哪个 pos 点开始查看,凡是 binlog 记录下来的操作都有一个 pos 点,这个其实就是相当
于我们可以指定从哪个操作开始查看日志,如果不指定的话,就是从该 binlog 的开头开始查看。
offset:这是是偏移量,不指定默认就是 0。
row_count:查看多少行记录,不指定就是查看所有。

查看命令如下(我这里就从 pos 为 154 的位置开始)

先看一下你现在binlog是叫什么名字 :
show master status

mysql主键保证唯一的原理_mysql主键保证唯一的原理_04

再看一下我们binlog里面的日志 :
show binlog events in 'binlog.000002' ;

mysql主键保证唯一的原理_MySQL_05

新增两条数据的日志如上。
从上图中可以看到,记录在binlog原文中的日志是:
use db01;
INSERT INTO user VALUES(2,UUID(),‘zhangsan1’);
这句SQL将来同步到slave之后,slave照着执行以下,那必然出现执行结果不一致的问题,因为uuid()函数每次执行结果都不一样。

四.解决主从不一致

设置 binlog_format 格式

上面由于我们设置了这行配置
binlog_format=STATEMENT
致使我们主从不一致

我们把这行配置改为:
binlog_format=ROW
即可

有点草率的结束了,这里有个插件始终装不好,没法进行下一步