成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

My.cnf 增加一個配置項,MySQL 不能啟動了

數據庫 MySQL
對于官方文檔里說明 MySQL 支持的系統變量,如果我們在配置文件(My.cnf)中增加了一個系統變量,MySQL 啟動時報 Unknown Variable xxx 錯誤,說明這個系統變量不支持通過配置文件配置。

有一天,同事問了我一個來自客戶的問題:在 my.cnf 中增加系統變量 foreign_key_checks 之后,MySQL 就啟動不了了。

我們嘗試通過 SET 命令修改 foreign_key_checks,成功了。查看官方文檔,明明也是有這個系統變量的:

圖片圖片

為什么把 foreign_key_checks 加到配置文件里就不行了呢?

這就觸及到我的盲區了,同時也勾起了我的好奇心,搞清楚這個問題勢在必行。

研究一番之后,發現并不是只有 foreign_key_checks 存在這種情況,還有一些系統變量也是這樣的,不能加到配置文件里,只能通過 SET 命令修改。

如果你也對這個問題感到好奇,我們就一起來探個究竟吧。

本文基于 MySQL 8.0.32 源碼。

1、問題復現

在 my.cnf 中增加系統變量:

foreign_key_checks = 0

然后,啟動 MySQL,結果:啟動失敗。查看 error.log,能看到如下錯誤信息:

unknown variable 'foreign_key_checks = 0'

官方文檔里說 MySQL 支持這個系統變量,MySQL 說我不認識它,是不是有點奇怪?

不過,不管怎樣,我們已經復現了這個問題,接下來,繼續追根溯源。

2、原理介紹

MySQL 中,每個系統變量都會在代碼里定義,foreign_key_checks 定義如下:

圖片圖片

我最開始懷疑是 SESSION_VAR 的問題,調試了一遍,發現 SESSION_VAR 是無辜的,它并不是導致 MySQL 無法識別配置文件中 foreign_key_checks 的元兇。

調試過程中,發現了另一個疑似兇手,就是紅框里的 NO_CMD_LINE。

為了驗證我的推測,又在代碼中搜索了其它帶有 NO_CMD_LINE 標志的系統變量,在其中發現了一個比較眼熟的家伙(autocommit):

圖片圖片

為了確認 autocommit 是否也會導致 MySQL 啟動失敗,修改了配置文件:

# foreign_key_checks = 0
autocommit = 0

注釋掉配置文件中的 foreign_key_checks,加上了 autocommit,結果 MySQL 啟動成功了。

完了,NO_CMD_LINE 看起來也不像兇手,探索之路就此進入了尷尬的局面。

又經過一番漫長的東調西試,發現了 autocommit 的秘密:autocommit 有兩處定義,上面截圖是 sql/sys_vars.cc 里的定義,還有一處位于 sql/mysqld.cc 文件。

圖片圖片

為了驗證 MySQL 能識別配置文件中的 autocommit,是因為 my_long_options 中增加了 autocommit 的定義,我把 my_long_options 中的 autocommit 刪掉了,然后啟動 MySQL,結果失敗。

不過,遺憾的是,并沒有報 unknown variable 錯誤,而是觸發了一個斷言錯誤,和配置文件無關,這條路徑驗證失敗。

為了繼續驗證我的推測,在 sql/sys_vars.cc 中增加了一個帶有 NO_CMD_LINE 標志的自定義系統變量,并加到配置文件中,然后,啟動 MySQL,結果:啟動失敗,報錯:unknown variable xxx。

接著,我又在 sql/mysqld.cc 的 my_long_options 中增加了這個自定義的系統變量,然后,啟動 MySQL,結果:啟動成功。

這就證明了我的推測:sql/sys_vars.cc 中定義的系統變量,如果包含了 NO_CMD_LINE,MySQL 啟動過程中不能識別。

這種系統變量加入 sql/mysqld.cc 的 my_long_options 數組之后,MySQL 啟動過程中就能識別了,autocommit 就是這么干的。

另外,調試過程中還有另一個發現:sql/mysqld.cc 的 my_long_early_options 數組,也具有和 my_long_options 一樣的功能。

概括來說,NO_CMD_LINE 是一扇門,my_long_options、my_long_early_options 是兩扇窗,某個系統變量被 NO_CMD_LINE 關起來閉門思過之后,如果開了其中一扇窗,這個系統變量就可以從窗戶上逃出來了。

3、簡單的分辨方法

有些系統變量能在配置文件中配置,有些變量又不能,我們想知道哪些變量能,哪些變量不能,除了擼代碼還有別的方法嗎?

當然是有的,用這個命令就可以:

/path/mysqld --verbose --help | grep "xxx"

例如,查看 foreign_key_checks 是否能通過配置文件配置:

./mysqld --verbose --help | grep "foreign-key-checks"

執行命令沒有任何輸出,說明 foreign_key_checks 不能通過配置文件配置。

查看 autocommit 是否能通過配置文件配置:

./mysqld --verbose --help | grep "autocommit"

# 輸出如下
--autocommit Set default value for autocommit (0 or 1)
            (Defaults to on; use --skip-autocommit to disable.)

輸出結果中有 --autocommit balabala,說明 autocommit 能通過配置文件配置。

注意:grep 后面系統變量名中的下劃線需要替換為中劃線,例如 foreign-key-checks。

4、總結

對于官方文檔里說明 MySQL 支持的系統變量,如果我們在配置文件(my.cnf)中增加了一個系統變量,MySQL 啟動時報 unknown variable xxx 錯誤,說明這個系統變量不支持通過配置文件配置。

另一種分辨方法是執行 /path/mysqld --verbose --help | grep "xxx" 命令,如果輸出結果中沒有 --xxx balabala 這樣的信息,也可以說明這個系統變量不支持通過配置文件配置。

本文轉載自微信公眾號「一樹一溪」,可以通過以下二維碼關注。轉載本文請聯系一樹一溪公眾號。

責任編輯:姜華 來源: 一樹一溪
相關推薦

2010-05-21 13:41:40

MySQL配置參數

2011-08-22 16:08:48

2010-02-04 11:02:54

2017-06-05 08:18:32

MySQL互聯網標準

2011-07-11 14:03:29

linuxmysql

2010-02-22 09:33:37

Ubuntu MySQ

2018-02-07 15:14:50

MySQL面試配置文件

2011-07-18 08:57:13

MySQLwait_timeouDBCP

2017-05-11 11:30:43

MySQL查詢速度

2015-09-14 14:49:39

MySQLMariaDBLinux

2022-08-29 08:01:01

MySQL配置Windows

2021-09-26 05:25:33

邊緣計算IoT

2011-07-08 09:38:10

服務器mysql同步備份

2019-12-24 11:00:51

FedoraLive CD系統運維

2010-09-16 15:57:00

PPPoA配置

2017-05-10 16:09:12

MySQL數據庫查詢

2017-08-01 08:28:46

4G服務器MySQL

2022-05-16 08:17:36

裝飾器模式

2022-09-14 10:16:12

MyBatis加密解密

2009-05-08 09:32:27

JavaWeb編程框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线精品一区二区三区 | 色黄视频在线 | 秋霞电影院午夜伦 | 午夜视频在线观看网址 | 亚洲国产一区二区三区 | 亚洲欧美国产精品久久 | 国产精品久久久久久婷婷天堂 | 午夜欧美 | 国产a视频 | 亚洲视频中文字幕 | 黄色一级大片在线免费看产 | 黄色av观看| 成年人视频在线免费观看 | 成人高清在线视频 | 亚洲成人精品视频 | 欧美激情五月 | 一级欧美 | 久久精品视频一区二区三区 | 激情五月激情综合网 | 中文字幕亚洲无线 | 91热爆在线观看 | 日本激情一区二区 | 天天色图| 日韩中文一区 | 狼人伊人影院 | 在线视频一区二区三区 | 成人中文字幕在线观看 | 日本精品久久 | 亚洲传媒在线 | 亚洲 欧美 日韩 在线 | 中文字幕日韩在线观看 | 成人在线观看黄 | 日韩欧美视频 | 国产一伦一伦一伦 | 美美女高清毛片视频免费观看 | 精品欧美一区二区三区精品久久 | 亚洲性人人天天夜夜摸 | 91毛片网| 色综合一区二区三区 | 精品视频一区二区三区 | 国产精品自产拍在线观看蜜 |