簡體   English   中英

使用bash將數據從一個數據庫復制到另一個數據庫

[英]Copy data from one database into another using bash

我需要將數據從一個數據庫復制到我自己的數據庫中,因為我想將其作為日常cronjob運行,所以我希望將其存儲在bash中。 我還需要將值存儲在變量中,以便可以對值運行各種檢查/驗證。 這是我到目前為止所得到的:

echo "SELECT * FROM table WHERE value='ABC' AND value2 IS NULL ORDER BY time" | mysql -u user -h ip db -p | sed 's/\t/,/g' | awk -F, '{print $3,$4,$5,$7 }' > Output  
cat Output | while read line
do
Value1=$(awk '{print "",$1}')
Value2=$(awk '{print "",$2}')
Value3=$(awk '{print "",$3}')
Value4=$(awk '{print "",$4}')
echo "INSERT INTO db (value1,value2,value3,value4,value5) VALUES($Value1,$Value2,'$Value3',$Value4,'n')" | mysql -u rb db -p
done

我從數據庫中獲取了我需要的數據,並將其存儲在一個用空格分隔的新文件中。 然后,我逐行讀取文件並將值存儲在變量中,最后我使用正確的變量運行插入查詢。

我認為在存儲值時出了點問題,但我無法弄清楚到底出了什么問題。

用於獲取Value2,Value3和Value4的awk無法從$line獲取輸入。 您可以將其修復為:

Value1=$(echo $line | awk '{print $1}')
Value2=$(echo $line | awk '{print $2}')
Value3=$(echo $line | awk '{print $3}')
Value4=$(echo $line | awk '{print $4}')       

沒有理由循環調用awk四次。 那可能很慢。 如果出於其他原因不需要臨時文件“輸出”,則根本不需要它-只需將輸出傳遞到while循環中即可。 您可能不需要使用sed將制表符更改為逗號(可以使用tr ),因為awk默認情況下會拆分制表符(和空格)上的字段(除非您的數據包含空格,但其中有些似乎不是) 。

echo "SELECT * FROM table WHERE value='ABC' AND value2 IS NULL ORDER BY time" | 
    mysql -u user -h ip db -p | 
    sed 's/\t/,/g' |                 # can this be eliminated?
    awk -F, '{print $3,$4,$5,$7 }' | # if you eliminate the previous line then omit the -F,
    while read line
    do
        tmparray=($line)
        Value1=${tmparray[0]}
        Value2=${tmparray[1]}
        Value3=${tmparray[2]}
        Value4=${tmparray[3]}
        echo "INSERT INTO predb (value1,value2,value3,value4,value5) VALUES($Value1,$Value2,'$Value3',$Value4,'n')" | mysql -u rb db -p
    done

它使用一個臨時數組將值分割為一行。 這是另一種方法:

        set -- $line
        Value1=$1
        Value2=$2
        Value3=$3
        Value4=$4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM