【etl】shell脚本实现mysql到dws的数据迁移

背景:mysql表需要每小时同步当天的数据到dws表。系统是linux,网络是专用网络,没权限安装其他etl工具。
思路:使用shell封装原始的数据库命令和linux命令完成数据迁移。

#!/bin/bash

#每小时增量接入表
yday=`date -d -1hours "+%Y-%m-%d %H:%M:%S"`
yday=${yday: 0: 10}		#拿到当前时间的前1个小时的日期
tday=`date "+%Y-%m-%d"` #用于文件命名

echo "mysql增量导出:`date +%F" "%T`"
#mysql -h xx.xx.xx.xx -P xxxx -uxxxx -pxxxx --default-character-set=utf8  -e "SELECT * FROM database.tablename where DATA_TIME >= left(date_sub(now(),interval 1 hour),10);" -N  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n/"\r\n"/g;s/"NULL"//g' > /app/data/tablename${tday}.csv;
mysql -h xx.xx.xx.xx -P xxxx -uxxxx -pxxxx --default-character-set=utf8  -e "SELECT * FROM database.tablename where DATA_TIME >= '${yday}';" -N  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n/"\r\n"/g;s/"NULL"//g' > /app/data/tablename${tday}.csv;

echo "DWS删除:`date +%F" "%T`"
#gsql --command "delete from schemaname.tablename where DATA_TIME >= substr(now()::timestamp + '-1 hour',0,10);" "host=xx.xx.xx.xx hostaddr=xx.xx.xx.xx port=xxxx user=userxxxx password=pwdxxxxx dbname=dbnamexxx"
gsql --command "delete from schemaname.tablename where DATA_TIME >= '${yday}';" "host=xx.xx.xx.xx hostaddr=xx.xx.xx.xx port=xxxx user=userxxxx password=pwdxxxxx dbname=dbnamexxx"

echo "DWS增量导入:`date +%F" "%T`"
gsql --command "\copy schemaname.tablename FROM '/app/data/tablename${tday}.csv' CSV;" "host=xx.xx.xx.xx hostaddr=xx.xx.xx.xx port=xxxx user=userxxxx password=pwdxxxxx dbname=dbnamexxx"

linux sed语法:替换文本中的内容:s

sed 's/替换前的字符串/替换后的字符串/n|g'

g:进行全局替换,将文件中出现的所有的都进行替换。
n:代表替换的是滴n次出现的字符串,n是一个数字,从1开始

定时任务:每整点小时的第10分执行

crontab -e

10 * * * * cd /app/shell && ./mysqltodws.sh >> /app/shell/mysqltodws.log 2>&1

遇到的问题:
1、一开始的时间用的是当天的日期tday,这样定时任务到23点10分执行的时候,下一次执行是0点10分,会少23点10分到0点的数据。
2.1、后来改成sql查询用当前时间减1小时的日期,这样当15号0点执行,实际获取的是14号后面的数据,15号1点执行的时候就只获取15号后面的数据。
2.2、两个数据库的时间sql查询出来是一样,逻辑上没问题,但15号早上来查看数据时,发现14号一天的数据都缺失了。mysql导出执行的时间只有几秒,两个sql执行的时间相差不大,而且任务执行的时间定在整点10分。没排查出原因
3、第3次把sql的查询时间从数据库的时间改为linux的时间,并获取提前两个小时。16号查看数据已经正常。
4、16号把linux时间改为提前1小时,17号查看数据也是正常,第2点的问题也只能归咎于当时sql执行的时间不一样了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值