mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】
昨天下班前,老板給了一批LOG數(shù)據(jù)庫(kù)IP地址,需要統(tǒng)計(jì)LOG表里Message字段top 10的結(jié)果,并輸出到一個(gè)excel文件里。
抽查看了下,有兩種格式的以當(dāng)天日期結(jié)尾的表名。由于數(shù)量太多,時(shí)間緊迫,只好寫(xiě)批量腳本解決問(wèn)題。
并以此擴(kuò)展,解析其中的幾個(gè)常用shell程序,主體腳本寫(xiě)在文章后半部分。
學(xué)習(xí)shell重在靈活運(yùn)用命令,形成自己的思維方式,和書(shū)寫(xiě)習(xí)慣,腳本參考即可。
解題過(guò)程步驟:
1.梳理IP地址及對(duì)應(yīng)表名
2.確定查詢SQL
3.批量查詢數(shù)據(jù)
完整腳本附在文章最后
解析下常用到的知識(shí)點(diǎn):
1.日期:關(guān)于日期結(jié)尾的表,表中涉及日期時(shí)間的表字段
注意:shell中養(yǎng)成給日期定義變量的習(xí)慣。
<1>.當(dāng)前日期時(shí)間及格式
DATE_MARK=`date +'%Y%m%d'` 結(jié)果:20161214
DATE_MARK=`date + '%Y-%m-%d %H:%M:%S'` 結(jié)果:2016-12-14 18:20:11
過(guò)去日期時(shí)間及格式
DATE_MARK=`date -d'1 day ago' +'%Y%m%d'` 結(jié)果:一天之前:20161213
DATE_MARK=`date -d'1 hour ago' +'%Y-%m-%d %H:%M:%S'` 結(jié)果:2016-12-14 17:20:11
修改-d' ' :7天之前:7 days ago 7小時(shí)之前:7 hours ago
表名:TB_NAME="LOG_${DATE_MARK}"
2.遍歷思想和循環(huán)及行的處理
<1>.批量遠(yuǎn)程執(zhí)行命令,批量Telnet端口,批量ping主機(jī)
<2>.遍歷文件中每一行,進(jìn)行添加,截取,輸出操作。
主體思想:先讀取ip或行,再處理ip或行,再利用ip或行
實(shí)例:
1.依次輸出文件中的每一行
命令行while循環(huán)遍歷: cat ip.txt | while read line; do echo $line;done
命令行for 循環(huán)遍歷:for line in `cat ip.txt`;do echo $line;done
腳本中調(diào)用:ip.txt,然后循環(huán)遍歷. ip文件作為腳本的執(zhí)行參數(shù)
#!/bin/sh
ipfile=$1
cat ${ipfile}|while read line
do
echo ${line}
done
腳本執(zhí)行:./xx.sh ip.txt
2.對(duì)行的處理,一行有多個(gè)分割字段時(shí)需要處理
格式:172.21.1.1,3306
截取一行的第一列IP:
IP=`echo ${line}|awk -F',' '{print $1}'`
PORT=`echo ${line}|awk -F',' '{print $2}'`
awk -F',' '{print $1}' 等同于 cut -f1 -d','
添加內(nèi)容:
echo "${IP}_${PORT}:OK" 結(jié)果:172.21.1.1_3306:OK
3.關(guān)于自定義函數(shù)
<1>.不傳參函數(shù):
fun_name()
{
name='Kata'
echo "My name is ${name}."
}
fun_name #調(diào)用方式,直接將:My name is Kata.輸出到屏幕
<2>.傳參函數(shù)
fun_name()
{
name=$1
echo "My name is ${name}."
}
fun_name "Alias" #調(diào)用方式,直接將:My name is Alias.輸出到屏幕
<3>.多參函數(shù)
fun_name()
{
name=$1
age=$2
echo "My name is ${name} and My age is ${age}."
}
fun_name "Sunny" "18" #調(diào)用方式,直接將:My name is Sunny and My age is 18.輸出到屏幕
<4>.將函數(shù)結(jié)果賦值給變量
status=`fun_name "Alias"` #變量status的內(nèi)容就是:My name is Alias. 此時(shí)再將status變量應(yīng)用到其它程序調(diào)用
<5>.自定義函數(shù)事例:統(tǒng)計(jì)IP數(shù)據(jù)庫(kù)里對(duì)應(yīng)的表格式是哪種?
思路:選一種格式表作為判斷,存在做標(biāo)記,不存在就是另一種。前提條件:每個(gè)ip上只存在一種表,避免意外兩種表都試試
FUN_CHECK()
{
ip=$1 #自定義函數(shù)傳參
tb_like=$2
MYSQL_CMD="/usr/local/mysql/bin/mysql -uadmin -padmin -h${ip} -P3306" #變量只有IP,端口也可定義變量
SQL="SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='LogDB' AND TABLE_NAME
= '${tb_like}_${DATE_MARK}';"
STATUS=`${MYSQL_CMD} -NBe"${SQL}"` #查詢數(shù)據(jù)庫(kù)表結(jié)果賦值給變量
if [ ${STATUS} == '1' ];then
echo ${ip}
else
echo #此處輸出空行或者去掉else,可方便將屏幕ip列表復(fù)制。甚至不要if判斷,直接:echo "${ip}:${STATUS}" 再篩選。
fi
}
在while循環(huán)中調(diào)用函數(shù):
#!/bin/sh
.
.
.
cat $IP_FILE1|while read line
do
IP=`echo $line|cur -f1 -d' '`
FUN_CHECK "${IP}" "HA_Logging" #手動(dòng)修改下第二個(gè)參數(shù),另一個(gè)表也測(cè)試下,別遺漏ip。
done
4.關(guān)于輸出文件
將n個(gè)ip上表的查詢數(shù)據(jù)追加到一個(gè)excel里。SQL的查詢結(jié)果不要帶表頭。否則文件里會(huì)出現(xiàn)多個(gè)表頭行。
通過(guò)mysql命令指定NBe參數(shù),只輸出數(shù)據(jù)結(jié)果,不顯示字段名。
mysql -u -p -h -P -NBe"${sql}"
5.腳本傳參和函數(shù)傳參
腳本的開(kāi)頭定義:xxx=$1 xxx=$2
函數(shù)的開(kāi)頭定義:xxx=$1 xxx=$2
腳本執(zhí)行:./x.sh 參數(shù)1 參數(shù)2
函數(shù)調(diào)用:fun_name "參數(shù)1" "參數(shù)2"
附件見(jiàn)下面:
附件腳本1:梳理ip列表,及對(duì)應(yīng)哪種表格式
說(shuō)明:
腳本執(zhí)行:執(zhí)行兩次
./check_ip.sh ip.txt 'HA_Logging'
./check_ip.sh ip.txt 'LOG'
腳本第二個(gè)參數(shù):作為表格式模糊查詢的變量傳參
cat check_ip.sh
#!/bin/sh
IPFILE=$1
TB_LIKE=$2
DATE_MARK=`date -d'1 day ago' +'%Y%m%d'`
FUN_CHECK()
{
ip=$1 #自定義函數(shù)傳參:ip
tb_like=$2 #自定義函數(shù)傳參:HA_Logging或者LOG
MYSQL_CMD="/usr/local/mysql/bin/mysql -uadmin -padmin -h${ip} -P3306" #變量只有IP,端口也可定義變量
SQL="SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='LogDB' AND TABLE_NAME
= '${tb_like}_${DATE_MARK}';"
STATUS=`${MYSQL_CMD} -NBe"${SQL}"` #查詢數(shù)據(jù)庫(kù)表結(jié)果賦值給變量
if [ ${STATUS} == '1' ];then
echo ${ip}
fi #此處定義 如果存在直接輸出ip,不存在,就不管。
}
cat ${IPFILE}|while read line
do
IP=`echo ${line}|cut -f1 -d' '`
FUN_CHECK "${IP}" "${TB_LIKE}"
done
附件腳本3:查詢表數(shù)據(jù)導(dǎo)入Excel
說(shuō)明:為了一次性執(zhí)行,將兩個(gè)ip列表文件作為腳本參數(shù)
腳本執(zhí)行:./check_loginfo.sh ha_ip.txt log_ip.txt
cat check_loginfo.sh
#!/bin/sh
IP_FILE1=$1
IP_fILE2=$2
# 定義日期標(biāo)志 : 20161214 (此處是昨天日期)
TIME_MARK=`date -d'1 day ago' +'%Y%m%d'`
# 定義表的名字:以日期結(jié)尾的表名
HA_TB="LogDB.HA_Logging_${TIME_MARK}"
LO_TB="LogDB.LOG_${TIME_MARK}"
# 對(duì)表查詢結(jié)果輸出到Excel文件:OUT FILE
OUT_FILE="/data/${TIME_MARK}_log.xls"
# 定義通用函數(shù),從表里查詢數(shù)據(jù)結(jié)果
GET_INFO()
{
ipfile=$1
tbname=$2
cat $ipfile|while read line
do
IP=`echo $line|awk -F' ' '{print $1}'`
MYSQL_CMD="/usr/local/mysql/bin/mysql -uadmin -padmin -h${IP} -P9306"
SQL="SELECT ServiceName,LoggerName,COUNT(LoggerName) AS count_num FROM ${tbname} GROUP BY LoggerName ORDER BY count_num DESC LIMIT 10;"
$MYSQL_CMD -NBe"${SQL}" >>${OUT_FILE}
echo "$IP:ok"
done
}
# 執(zhí)行調(diào)用
#
GET_INFO "${IP_FILE1}" "${HA_TB}"
GET_INFO "${IP_fILE2}" "${LO_TB}"
完結(jié)!
總結(jié)
以上是生活随笔為你收集整理的mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql数据库new和old_数据库触
- 下一篇: mysql删除n行_订购记录并在MySQ