前言
數(shù)據(jù)庫圖形化工具的出現(xiàn)眷唉,給我們操作數(shù)據(jù)庫帶來了許多便利予颤,但是過度的依賴工具,始終無法明白其內(nèi)部 的一些原理冬阳,離開了工具蛤虐,可能寸步難行,所以盡量使用原生的命令行來操作數(shù)據(jù)庫肝陪,可以增加熟練度驳庭,提高我們知識的深度。
最常見的明文登錄方式
以下mysql命令參數(shù),相信大家已經(jīng)是耳熟能詳了:
-h參數(shù)指定mysql主機(jī)饲常。
-u指定mysql用戶蹲堂。
-P(大寫)指定端口。
-p(小寫)指定密碼贝淤。
這里衍生出兩個問題:
1)每次使用都需要指定一長串的參數(shù)和密碼柒竞。
2)密碼直接在命令行暴露出來,運行時播聪,在一個短暫的時間間隔內(nèi)朽基,是可以直接通過ps命令查看到你數(shù)據(jù)庫的密碼的,所以十分不安全离陶。
當(dāng)然你可以不用指定密碼參數(shù)稼虎,而是選擇手動輸入。
明文配置文件的方式登錄
如果你不想在控制臺招刨,以交互的方式輸入密碼霎俩,那還有一種方式,將明文密碼寫入到文件中沉眶。
當(dāng)然也可以試試驗證讀取配置情況:
mysql --defaults-file=./A.cnf --print-defaults
這里打印的意思是:mysql將會使用如下的參數(shù)進(jìn)行登錄連接茸苇。
小結(jié)
總結(jié)來說:指定明文密碼的兩種方式是:
1)通過指定--password (-p) 交互式的輸入密碼。
2)將密碼放在一個配置 文件中沦寂。
當(dāng)我們使用一些數(shù)據(jù)庫的shell腳本時学密,當(dāng)然不能這樣交互式的輸入密碼,并且我們也不想把密碼暴露到配置文件中传藏,那該怎么做呢腻暮?
學(xué)習(xí)mysql命令的參數(shù)配置項
不知道如何實現(xiàn),我們首先來熟悉熟悉mysql命令提供的參數(shù)毯侦。
默認(rèn)情況下哭靖,mysql會按如下順序讀取配置:
1) /etc/my.cnf
2)/etc/mysql/my.cnf
3)~/.my.cnf
參數(shù):
--no-defaults ,不讀取配置文件中的任何內(nèi)容侈离。但是mylogin.cnf除外试幽。
--login-path,指定在mysql_config_editor中設(shè)置選項組名稱卦碾。
--print-defaults铺坞,打印從參數(shù)配置文件中獲得的所有選項。密碼值會被屏蔽洲胖。
了解了上述的基本參數(shù)作用后济榨,我們來學(xué)習(xí),如何保護(hù)我們的密碼绿映。
使用mysql_config_editor存儲登錄信息
mysql_config_editor是一個存儲mysql登錄信息的工具擒滑,
它會將你的身份認(rèn)證信息存儲到一個名為 .mylogin.cnf 的登錄路徑文件中腐晾。
由于該文件是隱藏文件,你可以用如下命令查看:
ls -l .mylogin.cnf
文件的內(nèi)容是進(jìn)行了混淆加密的丐一,明文方式它存儲的文件內(nèi)容大概是:
[pathA]
user = aaa
password = aaapwd
host = ip1
[pathB]
user = root
password = pwd2
host = ip2
這里藻糖,可以有多組配置,每一個用括號包裹的塊库车,我們稱它為選項組颖御,每個選項組內(nèi)容包括:主機(jī)、用戶凝颇、密碼潘拱、端口、套接字等信息拧略。
當(dāng)調(diào)用Mysql客戶端命令連接到服務(wù)器時芦岂,客戶端將mylogin.cnf與其他指定的參數(shù)配置文件一起使用。這里的優(yōu)先級高于其他文件垫蛆,但低于在客戶端命令行上顯式指定的配置禽最。
當(dāng)然啦,我們也可以顯示的指定用那個選項組袱饭,就像是使用A計劃還是B計劃一樣川无。默認(rèn)mysql會執(zhí)行[client] 和 [mysql] 選項組配置。
將密碼放入受保護(hù)的文件
要查看mysql_config_editor寫入.mylogin.cnf文件的內(nèi)容虑乖,我們可以使用如下命令:
mysql_config_editor print --all
mysql_config_editor print --login-path=pathA
登錄路徑文件必須對當(dāng)前用戶是可讀和可寫的懦趋,而對其他用戶是不可訪問的。否則疹味,mysql_config_editor將忽略它仅叫,客戶機(jī)程序也不會使用它,一個完整的設(shè)置命令入下:
mysql_config_editor set --login-path=pathA \
--host=localhost --user=root --password --port=3306 \
--socket=~/pathA_mysql.sock
操作幫助說明可以通過執(zhí)行如下命令查看:
mysql_config_editor set --help
其中--socket指定mysql以socket方式運行的sock文件位置。
--password 指定需要密碼糙捺,這里會在回車后讓你輸入密文诫咱。
它默認(rèn)在數(shù)據(jù)存儲到內(nèi)容中,
并且洪灯,我們使用print打印的時候坎缭,它同樣也不會顯示明文,是不是安全多了呢签钩。
登錄命令變成:
mysql --login-path=pathA
實際案例應(yīng)用
完成上述配置后掏呼,我們可以愉快的使用密文登錄mysql啦。這里提供一個實際的案例边臼。
要求:編寫crontab定時任務(wù)哄尔,定時的清理mysql A表一天前的數(shù)據(jù)假消,每天早上6點執(zhí)行柠并,需要提供日志記錄顯示執(zhí)行狀態(tài)。
小試牛刀
上面我們已經(jīng)配置好了免密登錄,下面來試試執(zhí)行一條sql語句臼予。
mysql --login-path=pathA -e 'select 1'
獲取今天凌晨的毫秒值:
select UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE)) * 1000
沒有任何問題鸣戴,按照要求,我們編寫帶記錄日志的shell腳本粘拾,參考如下:
#!/bin/sh
# adirname - return 絕對路徑
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; }
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYHOME="/home/appuser"
MYLOG_PATH="${MYHOME}/logs"
MYLOG="${MYLOG_PATH}/${MYNAM}_`date +%F`.log"
if [ ! -f "$MYLOG" ]; then
touch "$MYLOG"
fi
# 記錄日志
function loginfo(){
echo "$1"
echo "$(date -d today +"%Y%m%d %H:%M:%S") - $1" >> ${MYLOG} 2>> ${MYLOG}
}
mysql --login-path=pathA -e 'delete from A where time < UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE)) * 1000'
loginfo "handle delete table successfully,$?"
加入crontab定時任務(wù)
#每天6點執(zhí)行
0 6 * * * /bin/sh /home/root/del_tabl_task.sh
總結(jié)
本文對比介紹了 明文密碼登錄mysql的兩種方式和密文登錄窄锅。希望你了解如下知識點:
1、mysql_config_editor工具的用法及作用缰雇?
2入偷、mysql shell腳本的簡單使用?
3械哟、crontab定時任務(wù)腳本的配置使用疏之。
4、如何在shell中記錄輸出日志到文件暇咆。
當(dāng)然這些知識可能都只是冰山一角锋爪,希望對你有所啟發(fā)。
為了方便大家學(xué)習(xí)討論爸业,我創(chuàng)建了一個java疑難攻堅互助大家庭其骄,和其他傳統(tǒng)的學(xué)習(xí)交流不同。本群主要致力于解決項目中的疑難問題扯旷,在遇到項目難以解決的
問題時拯爽,都可以在這個大家庭里尋求幫助。
公眾關(guān)號注俠夢的開發(fā)筆記后回復(fù)【問題的答案】進(jìn)入:java中Integer包裝類的基本數(shù)據(jù)類型是钧忽?
如果你也經(jīng)歷過遇到項目難題某抓,無從下手,
他人有可能可以給你提供一些思路和看法惰瓜,一百個人就有一百種思路否副,
同樣,如果你也樂于幫助別人崎坊,那解決別人遇到的問題备禀,也同樣對你是一種鍛煉。
歡迎來公眾號【俠夢的開發(fā)筆記】奈揍,回復(fù)干貨曲尸,領(lǐng)取精選學(xué)習(xí)視頻一份