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
查看这个参数的开启情况,可以使用命令:show variables like 'ENFORCE_GTID_CONSISTENCY';
Mysql5.6及其以上版本会默认开启该参数,当enforce_gtid_consistency=true开启时,Mysql只允许能够保障事务安全&&能够被日志记录的SQL语句才能被执行,所以这时候create ,select,同时更新事务表&&非事务表的SQL语句或事务都执行不了
2.解决方案
在配置文件将该配置关闭掉。
要想关闭它,从命令行输入命令关闭是不行的。因为它仅仅是读取参数。所以不允许修改。如果要执行命令去修改它的话,会报下面的错误。
这时我们要找到Mysql的配置文件,如果不知道配置文件在哪儿,可以使用find / -name my.cnf 或者whereis my.cnf 而mysql的默认配置文件是/ect/my.cnf
使用find / -name my.cnf查找:
哇,一下子出现了这么多配置文件,那么mysql到底使用的是哪一个配置文呢?我们可以使用命令:mysql --help | grep my.cnf来查看mysql究竟使用的是哪一个配置文件。
图片中的意思是mysql会优先寻找第一个配置文件,如果找不到,再寻找第二个,直到找到有效的my.cnf,这儿Mysql使用的是/etc/my.cnf这个文件,我们打开它。
注释掉里面的内容。如果配置文件中没有这些参数,可以复制到配置文件中,放到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
保存,重启mysql
service mysqld restart
重启查看生效。
3.检查配置是否生效
这时再进入mysql查看ENFORCE_GTID_CONSISTENCY 的开启状态。
show variables like 'ENFORCE_GTID_CONSISTENCY';
可以看到,已经关闭,然后我们再试一试刚才的建表语句。
OK!执行语句没有报错,也正验证了ENFORCE_GTID_CONSISTENCY 已经关闭并且生效了。
以上。