建设个商城网站需要多少钱,哪个网站有做兼职的,网站开发 职位,软件开发工程师绩效考核指标实验环境此次实验的环境如下MySQL 5.7.25Redhat 6.10操作系统账号:mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储#xff0c;这节根据官方文档我们说GTID的生命周…实验环境此次实验的环境如下MySQL 5.7.25Redhat 6.10操作系统账号:mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储这节根据官方文档我们说GTID的生命周期1. GTID生命周期这里以一个事务从主库执行到从库应用的过程来讲解1.1 主库提交事务被分配GTID当主库执行和提交一个事务后该事务会被分配一个GTID(主库uuid和最小的未被使用过的事务号)之后会被写入到二进制日志文件中其位置在具体事务之前如果一个事务没有被写入二进制文件例如被过滤掉或者是只读的则不会被分配GTID1.2 主库GTID写入二进制文件分配GTID后该GTID会在提交的时候以Gtid_log_event 事件的形式写入二进制日志文件中其位置在具体事务之前当日志发生切换或者数据库关闭时该GTID会被写入到mysql.gtid_executed表中我们可以通过mysqlbinlog命令看出1.3 主库写入到GLOBAL.gtid_executed系统变量中在提交时还会将该GTID加入到GLOBAL.gtid_executed系统变量中该变量是个GTID集合代表目前为止所有被执行过的事务主要用于复制中我们也可以同如下命令查看show master status;
1.4 从库接收主库GTID事务当二进制日志被传输到备库后会被储存在relay 日志中从库会读取该GTID并设置gtid_next变量为该GTID这样就告诉备库下一个执行的事务必须为该GTID需要注意的是该变量是session级别的1.5 从库应用主库GTID事务在接收到主库GTID事务并设置好gtid_next后如果没有其他进程在执行的话从库执行该GTID事务如果同时有多个进程执行该事务则会选择其中一个(如多线程复制)我们可以查询gtid_owned系统变量来确认select GLOBAL.gtid_owned
由于该事务已经被主库分配了GTID所以从库上的该事务不会被分配GTID而是使用gtid_next变量的值1.6 从库写入二进制文件日志由于从库重新执行了来自主库的事务所以他也会写日志到从库的二进制日志文件中这里分两种情况如果从库启用了二进制日志功能则和1.2步骤一致如果从库未启用二进制日志功能则会将gtid和对应的事务语句写入到mysql.gtid_executed表中需要注意的是如果未开启二进制日志功能MySQL 5.7及之前只有DML操作是原子级别的DDL并不是意味着如果MySQL发生异常数据可能会变得不一致MySQL 8.0后所有操作都支持1.7 从库写入到GLOBAL.gtid_executed系统变量中同样的在提交后从库也会将该GTID写入到从库的gtid_executed系统变量中2. 多线程复制如果启用了多线程复制(slave_parallel_workers 0),由于是并行执行的GTID事务每个线程负责不同的GTID这时gtid_executed变量的值可能会有GAP系统会自动更新这些值3. 什么动作会被分配GTID所有的数据库更改(DML或DDL)都会被分配GTID数据库的新增删除修改也会被分配GTID非事务型的修改也会被记录下来如果在写入过程中发生异常则会记录一个incident事件如下操作可能会让一个事务分配多个GTID一个存储过程包含多个事务drop table语句一次包含多个表CREATE TABLE … SELECT 语句他会被分配一个create table GTID和一个insert GTID7. 参考资料本专题内容翻译自官方文档并结合自己的环境16.1.3.2 GTID Life Cycledev.mysql.com