日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】

發(fā)布時(shí)間:2024/1/23 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

昨天下班前,老板給了一批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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。