使用Bash脚本从Mysql同步数据库到Postgresql - xiaohao0576/odoo-doc GitHub Wiki

只使用Mysql命令行客户端和Bash脚本来同步数据库。

需要注意的事项如下

  • Mysql客户端,需要配置免密码登录
  • Postgresql客户端,也配置免密码登录
  • 使用Bash的管道命令进行程序间的数据传递

源数据提取

  • 安装好Mysql命令行客户端,使用mysql_config_editor工具配置免密码登录
  • 准备SQL语句,把SQL语句保存到文件中,用于提取需要同步的数据,比如export.sql
  • 使用mysql --login-path=mydb -N < export.sql命令导入数据, -N的意思是不显示列信息

变换数据

使用read命令和for循环,逐行去读取并变换数据格式,最终导出符合Postgresql要求的SQL语句。以下是bash脚本示例,此脚本可以用bash、python等任何编程语言

#!/bin/bash

while read line;
do
   read order_no order_date order_time phone amount order_status order_label <<< $(echo $line)
   echo  "INSERT INTO order (order_no, order_time, user_phone, actual_amount,order_status,order_label) VALUES ($order_no, '$order_date $order_time', $phone, $amount, $order_status, $order_label) ON CONFLICT (order_no) DO UPDATE SET actual_amount = EXCLUDED.actual_amount, order_status = EXCLUDED.order_status, order_label = EXCLUDED.order_label;"
done
echo "update order as o set user_id=u.id from  user as u where o.user_phone = u.user_phone and o.user_id is null;"
echo "UPDATE order AS o SET bd_user=u.bd_name FROM user AS u WHERE o.user_id = u.id AND o.bd_user is null AND o.order_time > u.takeover_time;"
echo "UPDATE order AS o SET use_age= (CASE WHEN DATE_PART('day',o.order_time - u.takeover_time) > 90 THEN '90' WHEN DATE_PART('day',o.order_time - u.takeover_time) > 60 THEN '60' WHEN DATE_PART('day',o.order_time - u.takeover_time) > 30 THEN '30' ELSE 'new' END)  FROM user AS u WHERE o.user_id = u.id AND o.use_age is NULL;"

导入目标数据库

配置psql免密码登录,使用--quiet参数,静默导入 psql --quiet dbname

把以上步骤写成定时任务

编写如下run.sh脚本 mysql --login-path=mydb -N < export.sql | ./transform.sh | psql --quiet dbname

写到crontab等定时任务中,定时执行数据同步