使用bash将数据从一个数据库复制到另一个数据库

时间:2010-09-29 07:20:40

标签: sql database linux 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

我从数据库中获取所需的数据并将其存储在由空格分隔的新文件中。然后我逐行读取文件并将值存储在变量中,最后我使用正确的变量运行插入查询。

我认为在存储值时会出现问题,但我无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:0)

用于获取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}')       

答案 1 :(得分:0)

没有理由在循环中调用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