MySQL主从复制中创建复制用户时机的讨论他们会分别创建复制用户,发现两种方式都能成功建立复制。针对这种现象,进行了一轮验证,观察不同方式创建复制用户对主从复制的影响。一般来说,最常用的方法是在设置主从复制之前在主库中创建一个复制用户,然后做一个Xtrabackup物理全量备份,然后从从库中恢复并建立主从。除此之外,还有哪些方法呢?对主从复制有什么影响?一起来看看吧。确认MySQL版本为5.7.32,主库:10.186.60.62,从库:10.186.60.68。为了演示方便,搭建主从复制时使用mysqldump做逻辑备份。场景一:只在主库创建复制用户1.备份主库,复制到从库/usr/local/mysql5732/bin/mysqldump--single-transaction--master-data=2-Bzlm-S/tmp/mysql3332.sock-p>zlm.sqlscpzlm.sqlroot@10.186.60.68:~2。从数据库登录执行importmysql>sourcezlm.sql由于没有使用参数--set-gtid-purged=off,所以导出的语句会包含HaveSET@@GLOBAL.GTID_PURGED='xxxx:1-xx'和执行它。导入前需要对从库执行resetmaster。3.主库创建复制用户mysql>createuserrepl1identifiedby'repl1';4、从库配置主从复制,启动mysql>changemastertomaster_host='10.186.60.62',master_port=3332,master_user='repl1',master_password='repl1',master_auto_position=1;mysql>startslave;启动复制后,报错1045。不是密码错误,而是replication用户没有配置replicationslave权限。repl1用户在master数据库上授权后(grantreplicationslaveon*.*torepl1;),重启复制就正常了。主从复制正常后,从库上也会创建复制用户repl1。从库上还没有创建复制用户repl1,正常设置主从复制。为什么?因为changemasterto语句中指定的master_user是主库上的replication用户,从库通过这个用户连接到主库。同步,开启复制线程后,在主库上创建复制用户的语句会在从库上回放,所以复制用户也会存在于从库上。结论1设置主从复制时,不需要在从库创建复制用户,只需要在主库创建,复制用户就会同步到从库。场景二:主从数据库单独创建复制用户(create语句)1.主库做备份,复制到从库(gtid_purged=xxxx:1-23)2.从库执行导入3.master数据库创建一个replication用户并赋权mysql>createuserrepl2identifiedby'repl2';mysql>grantreplicationslaveon*.*torepl2;4.从数据库创建复制用户由于不想在从库上生成从库的uuid写入的binlog事务,所以这里设置sql_log_bin=0,让事务不记录到binlog中,因为当数据库管理平台管理高可用集群,通常不允许有主库不存在的GTID事务。5、从库配置主从复制,启动mysql>changemastertomaster_host='10.186.60.62',master_port=3332,master_user='repl2',master_password='repl2',master_auto_position=1;mysql>启动从站;因为已经创建了从库,为了复制用户,事务回放到主库的时候会报错1396。可以使用createuser语句创建重复用户以进行身份??验证。解析主库的binlog,启动复制后执行的第一个事务是24createuser语句。结论2从库导入备份后,在主从库分别创建复制用户,从库执行创建用户的事务时,复制会中断。场景三:主从数据库单独创建复制用户(grant语句)1.主库做备份,复制到从库(gtid_purged=xxxx:1-28)2.从库执行import3.master数据库创建一个复制用户mysql>grantreplicationslaveon*.*repl3identifiedby'repl3';4.创建从库复制用户5.配置主从复制从库启动mysql>changemastertomaster_host='10.186.60.62',master_port=3332,master_user='repl2',master_password='repl2',master_auto_position=1;mysql>启动从站;这次开始复制后没有报错。为什么使用grant语句创建用户,而不是create语句?create和grant语句都会产生事务并记录在binlog中,不同的是grant语句是一个近似幂等的操作,而create语句不是。解析主库的binlog,29和30是重复执行grant的事务。观察showslavestauts\G,29和30这两个事务也是从库重放的,重复执行不会影响主从复制。但需要注意的是,在MySQL8.0中,grant创建用户的语法已经被禁止了。结论3从数据库中导入备份并使用grant语句在主从库创建用户后,回放从库时不会中断复制。小结1、根据以上验证结果,在设置主从复制时,可以通过多种方式创建复制用户,但有些方法存在一定的局限性,比如分别在主从实例上创建复制用户。虽然执行创建用户的grant语句不会造成复制中断,但这并不是标准的MySQL用户创建语法。在MySQL8.0中被认为是语法错误,所以不推荐使用这种方式搭建主从。2.如何创建复制用户使用Create语句创建用户时,1.在主库中创建复制用户后进行备份,然后配置主从。2.备份后,只在主库创建复制用户,然后配置主从(推荐)主从库创建复制用户,首先要在会话级别设置sql_log_bin=0,并且然后配置主从Grant语句创建用户(MySQL5.7及以下版本)1.主库先创建复制用户并备份,然后配置主从2.只在主库创建复制用户,然后configuremaster-slave(recommended)3.为主从数据库创建复制用户,然后配置主从
