新聞中心
?一、場(chǎng)景現(xiàn)象
在本地做測(cè)試時(shí),發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,當(dāng)我使用 socket 打算登錄數(shù)據(jù)庫(kù),發(fā)現(xiàn)不指定用戶時(shí),默認(rèn)并不是用的 root 用戶登錄,而是被修改為了 zhenxing 用戶。

創(chuàng)新互聯(lián)公司是專業(yè)的康縣網(wǎng)站建設(shè)公司,康縣接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行康縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
[root@10-186-61-162 ~]# mysql -S /data/mysql/3306/data/mysqld.sock -p
Enter password:
ERROR 1045 (28000): Access denied for user 'zhenxing'@'127.0.0.1' (using password: NO)
通過(guò)觀測(cè)當(dāng)前 mysql 客戶端的默認(rèn)參數(shù)行為,可以看到與報(bào)錯(cuò)一致,默認(rèn)用戶確實(shí)是變?yōu)榱?zhenxing。
[root@10-186-61-162 ~]# mysql --help|egrep "user|host|port"
-h, --host=name Connect to host.
-P, --port=# Port number to use for connection or 0 for default to, in
-u, --user=name User for login if not current user.
host 127.0.0.1
port 3306
user zhenxing
在這里作為 DBA ,我們的第一反應(yīng)是肯定是查看 /etc/my.cnf 文件中是否對(duì)默認(rèn)用戶做了配置,于是查看該配置文件的客戶端配置參數(shù),如下
[client]
host = 127.0.0.1
user = root
port = 3306
[mysql]
host = 127.0.0.1
user = root
port = 3306
prompt = '\U[\d]> '
發(fā)現(xiàn)配置文件中的反而配置值是 root 用戶,并沒(méi)有對(duì) zhenxing 用戶做配置,看來(lái)讀取的還不是這個(gè)配置文件,那是不是讀取了其他配置文件呢,繼續(xù)排查其他的配置文件。
二、排查思路
1、獲取配置文件讀取順序?
我們先打印出所有可能讀取的配置文件及其讀取的順序做逐個(gè)排查。
## 查看mysql客戶端讀取配置文件的順序
[root@10-186-61-162 ~]# mysql --verbose --help|grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf /data/mysql/3306/base/my.cnf ~/.my.cnf
2、排查 /etc/my.cnf?
/etc/my.cnf 在前面已經(jīng)確認(rèn)沒(méi)有做相關(guān)配置,這里直接跳過(guò)。
3、排查 /etc/mysql/my.cnf?
查看 /etc/mysql/my.cnf 配置,發(fā)現(xiàn)不存在相關(guān)配置,排除。
[root@10-186-61-162 ~]# cat /etc/mysql/my.cnf
cat: /etc/mysql/my.cnf: 沒(méi)有那個(gè)文件或目錄
4、排查 /usr/local/mysql/etc/my.cnf?
查看 /usr/local/mysql/etc/my.cnf 配置,發(fā)現(xiàn)不存在相關(guān)配置,排除。
[root@10-186-61-162 ~]# cat /usr/local/mysql/etc/my.cnf
cat: /usr/local/mysql/etc/my.cnf: 沒(méi)有那個(gè)文件或目錄
5、排查 /data/mysql/3306/base/my.cnf?
查看 /data/mysql/3306/base/my.cnf 配置,發(fā)現(xiàn)不存在相關(guān)配置,排除。
[root@10-186-61-162 ~]# cat /data/mysql/3306/base/my.cnf
cat: /data/mysql/3306/base/my.cnf: 沒(méi)有那個(gè)文件或目錄
6、排查 ~/.my.cnf?
查看 ~/.my.cnf 依舊不存在相關(guān)配置,排除。
[root@10-186-61-162 ~]# cat ~/.my.cnf
cat: /root/.my.cnf: 沒(méi)有那個(gè)文件或目錄
至此按照 mysql --verbose --help|grep my.cnf 獲取的配置文件讀取路徑都被排除,都未對(duì)用戶zhenxing做配置。
7、使用no-defaults排除配置文件干擾?
嘗試用 --no-defaults 不讀取任何配置文件排除配置文件的干擾,看是否會(huì)恢復(fù)正常。
[root@10-186-61-162 ~]# mysql --help|grep no-defaults
--no-defaults Don't read default options from any option file
## 查看不讀取配置文件時(shí),客戶端的默認(rèn)值
[root@10-186-61-162 ~]# mysql --no-defaults --help|egrep "user|host|port"
-h, --host=name Connect to host.
-P, --port=# Port number to use for connection or 0 for default to, in
-u, --user=name User for login if not current user.
host 127.0.0.1
port 3306
user zhenxing
## 查看讀取的所有客戶端配置文件參數(shù)設(shè)置
[root@10-186-61-162 ~]# mysql --print-defaults
mysql would have been started with the following arguments:
--host=127.0.0.1 --user=root --port=3306 --host=127.0.0.1 --user=root --port=3306 --prompt=\U[\d]> --user=zhenxing --password=***** --host=127.0.0.1 --port=3306
從上面輸出的結(jié)果來(lái)看,我們可以得到以下2個(gè)基本現(xiàn)象:
- 即使指定--no-defaults不讀取任何配置文件,這個(gè) user 的默認(rèn)值依舊是 zhenxing 用戶
- 當(dāng)輸出--print-defaults獲取實(shí)際運(yùn)行值時(shí),可以看到 /etc/my.cnf 下的[client] ,和 [mysql] 標(biāo)簽下的屬性配置從上到下被正確獲取
- 除了 /etc/my.cnf 外,在最后還有--user=zhenxing --password=***** --host=127.0.0.1 --port=3306這4個(gè)參數(shù)被額外添加到了命令最后
ps:mysql 客戶端和服務(wù)端讀取配置的原則都是文件讀取從上到下,后面相同參數(shù)配置覆蓋前面的參數(shù)經(jīng)過(guò)一系列的排除,依舊沒(méi)找到這個(gè)默認(rèn)值被修改的源頭
8、打印 mysql 客戶端的系統(tǒng)調(diào)用?
- 使用 strace 直接觀測(cè) mysql 客戶端在執(zhí)行時(shí)到底調(diào)用了哪些配置,以下是調(diào)用 my.cnf 相關(guān)配置的片段(對(duì)結(jié)果做了精簡(jiǎn)輸出)
1. stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=195, ...}) = 0 = 3
2. stat("/etc/mysql/my.cnf", 0x7ffd56813180) = -1 ENOENT (No such file or directory)
3. stat("/usr/local/mysql/etc/my.cnf", 0x7ffd56813180) = -1 ENOENT (No such file or directory)
4. stat("/data/mysql/3306/base/my.cnf", 0x7ffd56813180) = -1 ENOENT (No such file or directory)
5. stat("/root/.my.cnf", 0x7ffd56813180) = -1 ENOENT (No such file or directory)
6. stat("/root/.mylogin.cnf", {st_mode=S_IFREG|0600, st_size=336, ...}) = 0通過(guò)以上調(diào)用順序可以可到以下結(jié)論:
- 1-5行的調(diào)用順序與我們驗(yàn)證的邏輯基本一致
- 2-5行顯示為 No such file or directory 與我們的驗(yàn)證結(jié)果一致
- 第6行輸出,增加了一個(gè)對(duì) /root/.mylogin.cnf 的讀取操作,并且可以知道當(dāng)前這個(gè)文件是確實(shí)存在的
9、排查 /root/.mylogin.cnf?
看到這個(gè)文件我們一般都知道,這個(gè)是 mysql_config_editor 工具用來(lái)配置 login-path 的生成的文件,我們可以用以下方式查看當(dāng)前的配置信息。
[root@10-186-61-162 ~]# mysql_config_editor print --all
[client]
user = "zhenxing"
password = *****
host = "127.0.0.1"
port = 3306
這里可以看到配置中有一個(gè) client? 標(biāo)簽的連接參數(shù)配置,配置的內(nèi)容正好是我們文章開(kāi)頭顯示的異常默認(rèn)值,到這我們基本定位了造成這個(gè)奇怪現(xiàn)象的原因,出現(xiàn)這個(gè)故障場(chǎng)景的原因也是剛好這臺(tái)是測(cè)試環(huán)境曾經(jīng)做過(guò)一些 mysql_config_editor 用法的測(cè)試,導(dǎo)致了該現(xiàn)象的發(fā)生
三、場(chǎng)景總結(jié)
1、mysql客戶端除了會(huì)按照命令 mysql --verbose --help|grep my.cnf?輸出的常規(guī)的順序讀取配置外,在最后還會(huì)額外的讀取 .mylogin.cnf 文件中配置。
2、即使指定了 --no-defaults ,依舊會(huì)去讀取 .mylogin.cnf 中的 [client] ,[mysql] 標(biāo)簽的配置值。
其中官方文檔也在以下鏈接中給到了明確的說(shuō)明(以下是關(guān)鍵描述片段)。
- https://dev.mysql.com/doc/refman/8.0/en/option-file-options.html
The mysql client reads [client] and [mysql] from other option files, and [client], [mysql], and [mypath] from the login path file.
Client programs read the login path file even when the --no-defaults option is used. This permits passwords to be specified in a safer way than on the command line even if --no-defaults is present.
- 個(gè)人猜測(cè)當(dāng)時(shí)這么設(shè)計(jì)的目的是考慮如備份腳本等需要連接數(shù)據(jù)庫(kù)時(shí),為了防止非必要的參數(shù)文件的干擾,在指定了 --no-defaults參數(shù)后依舊能使用到 .mylogin.cnf 文件中配置的加密密碼,提升安全性。?
分享名稱:MySQL客戶端對(duì)配置文件的讀取順序
分享網(wǎng)址:http://fisionsoft.com.cn/article/ccegjgc.html


咨詢
建站咨詢
