脚本数据迁移

     有一个数据迁移的工作,需要把A数据库的两张表的内容关联起来,根据条件导入到各个分库中,分库的库名在A库查询出来的一个字段中.简而言之就是根据结果集把数据倒入不同的数据库中。

      一,kettle 首先想到了使用kettle,根据查询的条件设置变量,然后在kettle中插入地方的数据库连接使用相应的变量设置,变量的设置如下图:



 

然后数据流转。

         二、shell 然后线上执行kettle脚本要同时连接来源库和目标库,我们没有这个环境同时可以连接两个库,而且怕有风险,所以修改使用脚本导出插入到每个数据库的sql脚本,首先想到了使用shell脚本编写,直接执行mysql命令,大概逻辑如下

for data in `{这里写sql命令};' |grep wiota | sed -e 's/\t/=/g' | sed 's/[ ]/%/g'` ;do
## 一些特殊字符需要先替换然后再替换回来
arrays[index++]=$data;
done
echo '记录总条数'${#arrays[@]};
for item in ${arrays[@]}; do
arr=(${item//=/ })
{这里处理切分出来后的结果}
echo '{插入的sql}  | sed -e 's/%/ /g'>> oasHotelInfo.sql
done

 

      三、 python 然后发现结果集中有空字符串,然后shell拆分的时候结果会少,例如,,拆分出来会只有两个结果,少一个结果会,所以就切换成python编写。大概流程如下

#dev  database
con = mdb.connect(host='192.168.0.1m', port=3306, user='test', passwd='111111', db='test', charset='utf8')
 
cur=con.cursor() 
f = codecs.open('rs.sql', 'w+', 'utf-8')
try:
    cur.execute('{此处写sql内容}')
    f.write('set names utf8;\n')
    for data in cur.fetchall():
        temp = data[0]
        id = data[1]
        end = temp.find('.')
        db_name = 'db_'+domain[0:end]
        sql = 'INSERT INTO %s.tableName (colName) values(%s);' % (db_name,id)
        f.write(sql)
    print 'done'
finally:
    f.close()
    cur.close()
    con.close()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值