开发者社区> powdba> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MySQL启用GTID的限制

简介: 开启 GTID 之后,会由部分的限制,内容如下: 更新非事务引擎表GTID 同步复制是基于事务的,所以 MyISAM 存储引擎不支持,这可能导致多个 GTID 分配给同一个事务。 使用GTID时,使用非事务性存储引擎(如MyISAM)对表的更新不能在与使用事务性存储引擎(如InnoDB)的表的更新相同的语句或事务中进行。
+关注继续查看

开启 GTID 之后,会由部分的限制,内容如下:

更新非事务引擎表GTID

同步复制是基于事务的,所以 MyISAM 存储引擎不支持,这可能导致多个 GTID 分配给同一个事务。 使用GTID时,使用非事务性存储引擎(如MyISAM)对表的更新不能在与使用事务性存储引擎(如InnoDB)的表的更新相同的语句或事务中进行。

mysql> CREATE TABLE error (ID INT) ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO error VALUES(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> CREATE TABLE hello (ID INT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO hello VALUES(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> SET AUTOCOMMIT = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE hello SET id = 3 WHERE id =2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> UPDATE error SET id = 3 WHERE id =2;
ERROR 1785 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions,and never in the same statement as updates to transactional tables.

CREATE TABLE … SELECT语句不支持

因为该语句会被拆分成 CREATE TABLE 和 INSERT 两个事务,并且这个两个事务被分配了同一个 GTID,这会导致 INSERT 被备库忽略掉。

mysql> CREATE TABLE hello ENGINE=InnoDB AS SELECT * FROM hello;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

Temporary tables事务内部不能执行

创建临时表语句,但可以在事务外执行,但必须设置 set autocommit=1 。另外 procedures, functions, and triggers在使用GTID时不能 CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 语句

mysql> CREATE TEMPORARY TABLE test(id INT);
ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.

mysql> SET AUTOCOMMIT = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE test(id INT);
Query OK, 0 rows affected (0.04 sec)

与临时表相关的包括了 CREATE/DROP TEMPORARY TABLE 临时表操作。

总结

实际上,一般启动 GTID 时,可以启用 enforce-gtid-consistency 选项,从而在执行上述不支持的语句时,将会返回错误。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Centos7安装Mysql、九条命令搞定
本文介绍Centos7如何安装Mysql,以及如何卸载Mysql。
45 0
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
471 0
mysql8的免安装版(绿色版)安装工作与卸载以及mysql大小写敏感问题
mysql8的免安装版(绿色版)安装工作与卸载以及mysql大小写敏感问题
248 0
CentOS7环境,安装MySQL
CentOS7环境,安装MySQL
34 0
Windows下安装MySQL 空密码登录失败问题的解决办法
Windows下安装MySQL 空密码登录失败问题的解决办法
101 0
Windows 平台安装 MySQL 8.x
Windows 平台安装 MySQL 8.x
40 0
linux_day02(安装mysql 8.0数据库和远程登陆)
CRT终端操作 winscp软件(上传软件到Linux服务器中,alt+p,还可以下载Linux的软件到本地)
107 0
终于有人将MySQL的安装讲明白了
终于有人将MySQL的安装讲明白了
30 0
MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)
MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)
530 0
+关注
powdba
powdba@woqutech
文章
问答
文章排行榜
最热
最新
相关电子书
更多
好的 MySQL 兼容可以做到什么程度
立即下载
MySQL 5.7让优化更轻松
立即下载
PostgresChina2018_张启程_为什么我们抛弃MongoDB和MySQL,选择PgSQL
立即下载