como conectar-se ao Mysql apenas uma vez?

3

Eu criei um script de shell para se conectar a um DB e INSERT IPs e MACs do arquivo dhcpd.log
os scripts funcionaram corretamente:

#/!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

O código está correto, mas como você pode ver, ele conecta ao DB toda consulta de inserção dentro do tempo, minha pergunta é como posso conectar ao banco de dados somente uma vez e fazer várias consultas e sair sem conectar a ele toda operação de inserção / p>     

por Networker 19.05.2014 / 21:46

1 resposta

4

Você pode fazer isso canalizando para o mysql:

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

Observe como alterei o loop while para gerar as consultas que ele deseja executar para o stdout. Então eu cansei de você enquanto ... fiz o loop para mysql .

Você pode canalizar uma sub-sela também, por exemplo, você poderia fazer:

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

de modo que, se você cancelar o processamento no meio, o MySQL irá reverter a transação, para que você não termine com um arquivo semi-carregado. Além disso, a execução dentro de uma transação (em vez de confirmar cada linha individualmente) é geralmente muito mais rápida.

    
por 19.05.2014 / 22:14