博客 / 詳情

返回

小心my.cnf中重複系統變量設置帶來困擾

我們知道MySQL對不同位置的my.cnf文件的讀取順序是有優先級的. 那麼問題來了, 如果同一個my.cnf中, 不同位置出現了兩個相同系統變量/參數, MySQL會讀取哪一個系統變量呢? 是不是一個很有意思的問題!

那麼我們先來看看,在測試環境的my.cnf中, 我們以變量server_id為例子,

server_id=1002

我們在my.cnf中新增了一個server_id=1003,如下所示

...................................
server_id=1002
...................................
server_id=1003

然後重啓MySQL服務後,此時,檢查系統變量server_id. 經過驗證發現靠後位置的系統變量生效了, 而前面的系統變量被"覆蓋"了.

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1003  |
+---------------+-------+
1 row in set (0.01 sec)

mysql> 

一般來説,這種情況比較少見, 而且也容易排查, 如下所示.

$ grep server_id my.cnf
server_id=1002
server_id=1003

介紹一個我遇到的案例, 搭建MySQL InnoDB Cluster時,需要在my.cnf中設置參數server_id, 但是之前的my.cnf中設置了server-id系統變量/參數,而在不知情的情況下(沒有仔細檢查,系統變量太多,搜索的時候只搜索了關鍵詞server_id)設置了server_id系統變量後,重啓MySQL實例發現系統變量/參數沒有生效. 剛開始挺納悶的.仔細檢查好久後才發現這個問題.所以,這裏有衍生了另外一個問題,系統變量要統一一致,不要有些用"中劃線",有些用"下劃線".

MySQL的系統變量,有時候你會看到下面兩種不同“樣貌”的系統變量,有時候是下劃線,有時候是橫線,關於這部分內容的詳細説明如下所示:

log-timestamps=SYSTEM
或
log_timestamps=SYSTEM

其實,下劃線和橫線都支持, 官方文檔中稱帶橫線的系統變量為"命令行格式","下劃線"的為系統變量(System Variables)

官方文檔的介紹:

System variable values can be set globally at server startup by using options on the command line or in an option file.
At startup, the syntax for system variables is the same as for command options, so within variable names, dashes and
underscores may be used interchangeably. For example, --general_log=ON and --general-log=ON are equivalent.

通過使用命令行或選項文件中的選項,可以在服務器啓動時全局設置系統變量值。啓動時,系統變量的語法與命令選項的語法相同,因此在變量名稱中,破折號和下劃線可以互換使用。例如, --general_log=ON和 --general-log=ON是等價的。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.