MySQL GTID 一致性违规
MySQL GTID consistency violation
我正在尝试从 select 语句创建一个 table,它给我一个 GTID 一致性冲突。 [HY000][1786] Statement violates GTID consistency: CREATE TABLE ... SELECT.
create TABLE tags_mentions as
select t.*, st.ts, m.user_id_from, m.user_id_to from Tags as t join Mentions as m
on t.status_id = m.status_id AND m.user_id_from != m.user_id_to
left join Statuses as st on t.status_id = st.status_id;
什么是 GTID 一致性,如何修复 SQL 语句以避免违规?
从这里开始https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html
Since only transactionally safe statements can be logged when --enforce-gtid-consistency
is enabled, it follows that the operations listed here cannot be used with this option:
CREATE TABLE ... SELECT
statements
CREATE TEMPORARY TABLE
statements inside transactions
- Transactions or statements that update both transactional and non-transactional tables
您似乎强制设置了 GTID。所以这种说法是不允许的。
CREATE TABLE ... SELECT
对于基于语句的复制是不安全的。使用基于行的复制时,此语句实际上记录为两个单独的事件 — 一个用于创建 table,另一个用于将行从源 table 插入到新的 [=16] =] 刚刚创建。
当这个语句在一个事务中执行时,在某些情况下这两个事件可能会收到相同的事务标识符,这意味着包含插入的事务被slave跳过。因此,使用基于 GTID 的复制时不支持 CREATE TABLE ... SELECT
。
如果您想以其他方式修复错误,您可以简洁地创建 table 并单独插入:
CREATE TABLE new_table LIKE old_table;
INSERT new_table SELECT * FROM old_table;
如果不想复制到slave上,可以关闭binlog:
set sql_log_bin=0;
create table ... select ...
我正在尝试从 select 语句创建一个 table,它给我一个 GTID 一致性冲突。 [HY000][1786] Statement violates GTID consistency: CREATE TABLE ... SELECT.
create TABLE tags_mentions as
select t.*, st.ts, m.user_id_from, m.user_id_to from Tags as t join Mentions as m
on t.status_id = m.status_id AND m.user_id_from != m.user_id_to
left join Statuses as st on t.status_id = st.status_id;
什么是 GTID 一致性,如何修复 SQL 语句以避免违规?
从这里开始https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html
Since only transactionally safe statements can be logged when
--enforce-gtid-consistency
is enabled, it follows that the operations listed here cannot be used with this option:
CREATE TABLE ... SELECT
statementsCREATE TEMPORARY TABLE
statements inside transactions- Transactions or statements that update both transactional and non-transactional tables
您似乎强制设置了 GTID。所以这种说法是不允许的。
CREATE TABLE ... SELECT
对于基于语句的复制是不安全的。使用基于行的复制时,此语句实际上记录为两个单独的事件 — 一个用于创建 table,另一个用于将行从源 table 插入到新的 [=16] =] 刚刚创建。
当这个语句在一个事务中执行时,在某些情况下这两个事件可能会收到相同的事务标识符,这意味着包含插入的事务被slave跳过。因此,使用基于 GTID 的复制时不支持 CREATE TABLE ... SELECT
。
如果您想以其他方式修复错误,您可以简洁地创建 table 并单独插入:
CREATE TABLE new_table LIKE old_table;
INSERT new_table SELECT * FROM old_table;
如果不想复制到slave上,可以关闭binlog:
set sql_log_bin=0;
create table ... select ...