标签:主库 事务 slave 传统 复制 gtid mysql 主从 GTID
1.普通主从复制:
普通主从复制主要是基于二进制日志文件位置的复制,因此主必须启动二进制日志记录并建立唯一的服务器ID,复制组中的每个服务器都必须配置唯一的服务器ID.
如果您省略server-id(或者明确地将其设置为其默认值0),则主设备将拒绝来自从设备的任何连接.
2.GTID 主从:
基本概念
MySQL 5.6 的新特性之一,全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联.此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的.所有交易和所有GTID之间都有一对一的映射关系 .
它由服务器ID以及事务ID组合而成.这个全局事务ID不仅仅在原始服务器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的.
正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠.
一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致.
在传统的主从复制slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制).GTID用来代替classic的复制方法,不在使用binlog+pos开启复制.
而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制.
mysql的主从复制是十分经典的一个应用,但是主从之间总会有数据一致性(data consistency )的问题,一般情况从库会落后主库几个小时,
而且在传统一主多从(mysql5.6之前)的模型中当master down掉后,我们不只是需要将一个slave提成master就可以,还要将其他slave的同步目的地从以前的master改成现在master,
而且bin-log的序号和偏移量也要去查看,这是十分不方便和耗时的,但mysql5.6引入gtid之后解决了这个问题.
3.GTID 的优势:
(1) 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的.
(2) 简单的实现 failover,不用以前那样在需要找 log_file 和 log_pos.
(3) 更简单的搭建主从复制,确保每个事务只会被执行一次.
(4) 比传统的复制更加安全.
(5) GTID 的引入,让每一个事务在集群事务的海洋中有了秩序,使得 DBA 在运维中做集群变迁时更加方便,能够做到胸有成竹心中有数.
4.GTID 的限制:
因为基于 GTID 的复制依赖于事务,所以在使用 GTID 时,有些 MySQL 特性是不支持的。
(1) 不允许在一个 SQL 同时更新一个事务引擎和非事务引擎的表;
事务中混合多个存储引擎,就会产生多个 GTID。当使用 GTID 时,如果在同一个事务中,更新包括了非事务引擎(如 MyISAM)和事务引擎(如 InnoDB)表的操作,就会导致多个 GTID 分配给了同一个事务。
(2) 主从库的表存储引擎必须是一致的;
主从库的表存储引擎不一致,就会导致数据不一致。如果主从库的存储引擎不一致,例如一个是事务存储引擎,一个是非事务存储引擎,则会导致事务和 GTID 之间一对一的关系被破坏,结果就会导致基于 GTID 的复制不能正确运行;
(3) 不支持 create table … select 语句复制(主库直接报错)
由于使用基于行模式的复制时,create table ...select 语句会被记录为两个单独的事件(会生成两个 sql),一个是 DDL 创建表 SQL,一个是 insert into 插入数据的 SQL。由于 DDL 会导致自动提交,所以这个 sql 至少需要两个 GTID,但是 GTID 模式下,只能给这个 sql 生成一个 GTID,如果强制执行会导致和上面(2)中一样的结果。
(4) 在一个复制组中,必须要求统一开启 GTID 或是关闭 GTID;
(5) 开启 GTID 需要重启(5.6 需要,5.7 中不需要)
(6) 开启 GTID 后,就不能在使用原来的传统的复制方式;
(7) 不支持 create temporary table 和 drop temporary table 语句;
使用 GTID 复制时,不支持 create temporary table 和 drop temporary table ,但是在 autocommit=1 情况下可以创建临时表,MASTER 创建临时表不产生 GTID 信息,所以不会同步到 SLAVE 上,但是删除临时表时,产生 GTID 会导致主从复制中断。
(8) 不推荐在 GTID 模式的实例上进行 mysql_upgrade;
因为 mysql_upgrade 的过程要创建或修改系统表(非事务引擎),所以不建议在开启 GTID 的模式的实例上使用带有--write-binlog 选项的 mysql_upgrade;
(9) 不支持 sql_slave_skip_counter;
配置:
环境:
主数据库
CentOS8/RedHat8
IP-192.168.233.129
Hostname-Lynk
有数据
副数据库
CentOS8/RedHat8
IP-192.168.233.247
Hostname-Hyrule
无数据
给从库授权
#以下操作在主库进行 mysql> CREATE USER 'repl'@'192.168.233.247' IDENTIFIED BY 'repl123'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.233.247'; Query OK, 0 rows affected (0.00 sec)
确保数据一致
#新开一个终端,对主库锁表,防止配置期间有其他人写入,锁表期间不能关闭终端或退出mysql交互式命令行 mysql> FLUSH TABLES WITH READ LOCK; #全备主库 [root@lynk ~]# mysqldump -uroot -plynk123~ --all-databases > /opt/all-201902271749.sql #复制备份文件到从库 [root@lynk ~]# scp /opt/all-201902271749.sql root@192.168.233.247:/opt/ #在从库恢复主库的备份 [root@Hyrule ~]# mysql -uroot -plynk123~ < /opt/all-201902271749.sql
配置主库
[root@lynk ~]# vim /etc/my.cnf #添加以下内容 #数据库服务器唯一标识符,主库的server-id值必须比从库的大 server_id=1 gtid_mode=on #强制gtid一致性,开启后对于特定create table不被支持 enforce_gtid_consistency=on log_bin=master-binlog log-slave-updates=1 binlog_format=row skip_slave_start=1 #结束主库锁表状态,只要退出另一个终端中mysql交互式命令行就行了 mysql> quit #重启主库 [root@lynk ~]# systemctl restart mysqld
配置从库
[root@Hyrule ~]# vim /etc/my.cnf #添加以下内容 gtid_mode=on enforce_gtid_consistency=on server_id=2 log-bin=slave-binlog log-slave-updates=1 binlog_format=row skip_slave_start=1 #重启从库 [root@Hyrule ~]# systemctl restart mysqld #配置主从复制 mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.233.129', -> MASTER_USER='repl', -> MASTER_PASSWORD='repl123', -> MASTER_PORT=3306, -> MASTER_AUTO_POSITION = 1; Query OK, 0 rows affected, 2 warnings (0.03 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status \G #确保以下两项是Yes Slave_IO_Running: Yes Slave_SQL_Running: Yes
标签:主库,事务,slave,传统,复制,gtid,mysql,主从,GTID 来源: https://www.cnblogs.com/Mariko/p/14765855.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。