簡體   English   中英

如何在 MySQL 8 的 my.cnf 中設置 sql_mode?

[英]How to set sql_mode in my.cnf in MySQL 8?

我正在運行 MySQL 8.0.11 社區版。 我需要在 my.cnf 中設置 sql_mode 以排除 ONLY_FULL_GROUP_BY 以便它重新啟動安全。 我嘗試了以下變體:

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

無論變量名為“sql_mode”還是“sql-mode”,它們都以相同的方式失敗:

mysqld --verbose --help | grep "sql[-_]mode"
2018-06-19T15:22:51.667734Z 0 [ERROR] [MY-011071] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'
    --sql-mode=name     Syntax: sql-mode=mode[,mode[,mode...]]. See the manual
2018-06-19T15:22:51.675498Z 0 [ERROR] [MY-010119] [Server] Aborting

sql模式

看起來mysqld 處理my.cnf 並將'sql_mode' 或'sql-mode' 轉換為'sql_mode',然后它拒絕!

問題是如何解決這個問題?

SQL 模式NO_AUTO_CREATE_USER在 MySQL 8.0 中被刪除,並且不再被識別。

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-deprecations說:

刪除了以下與帳戶管理相關的功能:

  • 使用GRANT創建用戶。 相反,使用CREATE USER 遵循這種做法會使NO_AUTO_CREATE_USER SQL 模式對於GRANT語句變得無關緊要,因此它也被刪除了。

將您的 sql_mode 更改為“STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION”。 我在我的 8.0.11 沙箱實例上測試了這個,它工作正常。

sql-mode 或 sql_mode 的拼寫都可以。

使用引號或省略引號都可以。

假設“重啟安全”只是意味着永久,語法是:

sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

設置 SQL 模式

要在服務器啟動時設置 SQL 模式,請在命令行上使用 --sql-mode="modes" 選項,或在選項文件中使用sql-mode="modes" ,例如 my.cnf(Unix 操作系統)或 my .ini (Windows)。 modes是由逗號分隔的不同模式的列表。

如果它對您不起作用,則可能是您將其放在錯誤的部分下。 對於需要為[mysqld]服務器設置,如:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

步驟 1. 檢查 sql 模式:

mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

第二步,在/etc/mysql/conf.d/目錄下新建一個配置文件:

sudo nano /etc/mysql/conf.d/disable_strict_mode.cnf 

在編輯器中輸入以下文本:

[mysqld]

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

步驟 3. 重啟 MySQL:

sudo service mysql restart

步驟 4. 確認更改:

mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

NO_AUTO_CREATE_USER SQL 模式已在 MySQL 8.0 中刪除,請查看參考手冊以獲取SQL 模式完整列表

我還沒有找到使用 my.cnf 解決問題的方法。 為了 mysqld 重啟安全,我需要避免這樣做:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

我發現解決這個問題的唯一方法是設置一個環境變量:

sudo systemctl set-environment MYSQLD_OPTS="--sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sudo systemctl restart mysqld

歡迎更好的解決方案。

在最近版本的 Ubuntu/Debian 中,就我而言,我正在修改文件/lib/systemd/system/mysql.service

ExecStart=/usr/sbin/mysqld --sql-mode=NO_ENGINE_SUBSTITUTION

之后,然后只執行:

systemctl daemon-reload
systemctl restart mysql

*.cnf文件的更改沒有任何作用。

示例執行

編輯my.cnf不適用於 MySQL 8。所以我開發了一個解決方法。 我在 Ubuntu 20.04 中使用 MySQL 8

我創建了一個文件/etc/mysql/mysqlmode.sql

SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

接下來,我編輯了/etc/mysql/my.cnf並在最后添加了這些代碼行:

[mysqld]
init-file="/etc/mysql/mysqlmode.sql"

至於 MacOs Catalina,我使用 MysqlWorkbench 關閉“服務器/狀態和../ =>系統變量並搜索 sql_mode”中的“持久”復選框,如果沒有該操作,它會忽略 my.cnf 設置/

那是我的:[mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

我只是發現該選項與 my.cnf 中的“NO_AUTO_CREATE_USER”不兼容。 這可能與某些設置沖突。

以下行在 MySQL 8 中對我有用。

[mysqld] sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM