使用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等定时任务中,定时执行数据同步