MySQLに一度だけ接続する方法は?

MySQLに一度だけ接続する方法は?

データベースに接続し、dhcpd.logファイルからIPとMAC​​を挿入するシェルスクリプトを作成しましたが、
スクリプトは正常に動作します。

#/!bin/bash
#Defining Variables
dhcpLogFile="/var/log/dhcpd.log"

#Begin Code
# extrcting the Information of IPs and MACs from log file
# and eleminating the duplicate Entry
NumberOfLines=$(awk '/DHCPACK/ { print $8} ' $dhcpLogFile | awk '!x[$0]++'|awk 'BEGIN{i=0}{i++;}END{print i}')
j=1
while [ $NumberOfLines -gt 0 ]
do
ip=$(awk '/DHCPACK/ { print $8} ' $dhcpLogFile | awk '!x[$0]++' |cut -f$j -d$'\n')
mac=$(awk '/DHCPACK/ { print $10} ' $dhcpLogFile | awk '!x[$0]++' |cut -f$j -d$'\n')
echo $ip
echo $mac   
let "j +=1"
let "NumberOfLines -=1"
mysql -u root --password='pw' MatchingDB <<- _END_ 
INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');
_END_
done

コードは正確ですが、ご覧のとおり、すべての挿入クエリでデータベースに接続されています。私の質問は、データベースに一度だけ接続してから複数のクエリを実行し、すべての挿入クエリで同じことを行わずに終了する方法です。

ベストアンサー1

mysqlにパイピングすることでこれを行うことができます。

while …
do
    echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
done | mysql -u root …

while標準出力として実行したいクエリを出力するためにループを変更した方法を確認してください。次に、while do...doneループをmysql

サブシェルをパイプすることもできます。たとえば、次のようにできます。

(
    echo "BEGIN;"
    while … ; do
        echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
    done
    echo "COMMIT;"
) | mysql -u root …

これにより、途中で処理を中断するとMySQLがトランザクションをロールバックするため、ファイルが半分しかロードされないことがあります。また、各行を個別にコミットするのではなく、トランザクション内で実行する方がはるかに高速です。

おすすめ記事