PostgreSQL 数据同步

今天接到个需求,有个业务需要数据同步,源库和目标库都是 PostgreSQL , 由于表都是日志表,表数据只有插入,不会更新;所以只需要将源库新增数据同步到目标库即可,下面是同步脚本,供参考。

同步需求

源库: source_db
目标库: des_db
源库表:

  • skytf.hk_tbl_charge_oversea
  • skytf.hk_tbl_charge_oversea_dsm

目标库表:

  • hk_tbl_charge_oversea
  • hk_tbl_charge_oversea_dsm
    需求:每天将源库指定表的前一天数据同步到目标库

编写同步脚本

这套脚本有两个功能;

  1. 每天定时执行,同步源库 source_db 指定表的前一天数据;
  2. 如果由于种种原因,数据同步失败,可以用这套脚本补数据。

exec_sync_crp.sh 脚本代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
export PGPORT=1921
export PGDATA=/database/pgdata1921
export LANG=en_US.utf8
export PGHOME=/app/pgsql
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/man:$MANPATH

yesterday=`date -d '-1 day' +%F`
script_dir=/home/postgres/script/tf/sync_script

#Call script sync_crp.sh
${script_dir}/sync_crp.sh ${yesterday}

备注:这个脚本调用来调用脚本 sync_crp_part.sh

sync_crp.sh 脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash
if [ $# != 1 ]; then
echo Usage: ./sync_crp.sh arg1
echo Examples:
echo To get the date of 2011-09-01, enter:
echo ' sync_crp.sh 2011-09-01 > 2011-09-01.out'
exit 0
fi

export PGPORT=1921
export PGDATA=/database/pgdata1921
export LANG=en_US.utf8
export PGHOME=/app/pgsql
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/man:$MANPATH
today=$1
nextday=`date -d "${today} +1 days" +%F`
host_ip='192.168.xx.xx'
v_email="[Francs3@163.com](mailto:Francs3@163.com)"

#Make SQL strings, the sql of getting database source_db data
sql1="select * from skytf.hk_tbl_charge_oversea where createtime >= '${today}' and createtime <'${nextday}' "
sql2="select * from skytf.hk_tbl_charge_oversea_dsm where createtime >= '${today}' and createtime <'${nextday}' "

################## The real get data process ######################
## 同步表 crp.hk_tbl_charge_oversea
echo "`date +%F %T` Begin sync report data from data source_db to crp database ! "
psql -h 192.168.xx.xx -p 1921 source_db francs -c "copy ($sql1) to stdout " | psql des_db des_db -c "copy crp.hk_tbl_charge_oversea from stdin"
if [ $? -ne 0 ]
then
echo "`date +%F %T` ERROR: Sync table hk_tbl_charge_oversea error "
echo -e "`date +%F %T`nIP: ${host_ip}nHostname: `hostname`nnAuthor: francs(DBA)" | mutt -s " ERROR: Sync table hk_tbl_charge_oversea error " ${v_email}
else
echo "`date +%F %T` Table hk_tbl_charge_oversea is finished "
fi

## 同步表 crp.hk_tbl_charge_oversea_dsm
psql -h 192.168.xx.xx -p 1921 source_db francs -c "copy ($sql2) to stdout " | psql des_db des_db -c "copy crp.hk_tbl_charge_oversea_dsm from stdin"
if [ $? -ne 0 ]
then
echo "`date +%F %T` ERROR: Sync table hk_tbl_charge_oversea_dsm error "
echo -e "`date +%F %T`nIP: ${host_ip}nHostname: `hostname`nnAuthor: francs(DBA)" | mutt -s " ERROR: Sync table hk_tbl_charge_oversea_dsm error " ${v_email}
else
echo "`date +%F %T` Table hk_tbl_charge_oversea_dsm is finished "
fi

备注:脚本里只同步了两张表,如果还有其它表,可以继续加代码,如果表名一样,可以写个 for 循环,由于这里源表名,目标表名不一样,所以没用 for 循环, 这个脚本按天同步数据,如果需要补数据,只要加上日期参数即可;

设置任务计划

加入 crontab 定时执行,如下

1
2
# Sync crp data from data warehouse  
6* * * * /home/postgres/script/tf/sync_script/exec_sync_crp.sh >> /home/postgres/script/tf/sync_script/exec_sync_crp.log 2>&1

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/236426.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论