Linux上mysql错误处理之ERROR 1786 (HY000)

1.错误描述

在数据库中执行语句:CREATE TABLE mis_auto_sagaw_sub_qiyexiaoshougepinzhobak131 SELECT * FROM mis_auto_sagaw_sub_qiyexiaoshougepinzho WHERE masid IN (SELECT id FROM mis_auto_sagaw WHERE projectid=88);

发现抛出错误:CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1

Linux上mysql错误处理之ERROR 1786 (HY000)

查看这个参数的开启情况,可以使用命令:show variables like 'ENFORCE_GTID_CONSISTENCY';

Linux上mysql错误处理之ERROR 1786 (HY000)

Mysql5.6及其以上版本会默认开启该参数,当enforce_gtid_consistency=true开启时,Mysql只允许能够保障事务安全&&能够被日志记录的SQL语句才能被执行,所以这时候create ,select,同时更新事务表&&非事务表的SQL语句或事务都执行不了

2.解决方案

在配置文件将该配置关闭掉。

要想关闭它,从命令行输入命令关闭是不行的。因为它仅仅是读取参数。所以不允许修改。如果要执行命令去修改它的话,会报下面的错误。Linux上mysql错误处理之ERROR 1786 (HY000)

这时我们要找到Mysql的配置文件,如果不知道配置文件在哪儿,可以使用find / -name my.cnf   或者whereis my.cnf 而mysql的默认配置文件是/ect/my.cnf

使用find / -name my.cnf查找:

Linux上mysql错误处理之ERROR 1786 (HY000)

哇,一下子出现了这么多配置文件,那么mysql到底使用的是哪一个配置文呢?我们可以使用命令:mysql --help | grep my.cnf来查看mysql究竟使用的是哪一个配置文件。

图片中的意思是mysql会优先寻找第一个配置文件,如果找不到,再寻找第二个,直到找到有效的my.cnf,这儿Mysql使用的是/etc/my.cnf这个文件,我们打开它。

Linux上mysql错误处理之ERROR 1786 (HY000)

注释掉里面的内容。如果配置文件中没有这些参数,可以复制到配置文件中,放到mysqld下面

master_info_repository = TABLE

relay_log_info_repository = TABLE

log_bin = bin.log

sync_binlog = 1

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates

binlog_format = row

relay_log = relay.log

Wrelay_log_recovery = 1

binlog_gtid_simple_recovery = 1

slave_skip_errors = ddl_exist_errors

Linux上mysql错误处理之ERROR 1786 (HY000)

保存,重启mysql

service mysqld restart

Linux上mysql错误处理之ERROR 1786 (HY000)

重启查看生效。

3.检查配置是否生效

这时再进入mysql查看ENFORCE_GTID_CONSISTENCY 的开启状态。

show variables like 'ENFORCE_GTID_CONSISTENCY';

Linux上mysql错误处理之ERROR 1786 (HY000)

可以看到,已经关闭,然后我们再试一试刚才的建表语句。

Linux上mysql错误处理之ERROR 1786 (HY000)

OK!执行语句没有报错,也正验证了ENFORCE_GTID_CONSISTENCY 已经关闭并且生效了。

Linux上mysql错误处理之ERROR 1786 (HY000)

以上。