1. 程式人生 > >Linux上mysql錯誤處理之ERROR 1786 (HY000)

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 已經關閉並且生效了。