场景
A系统的数据库中的部分表中的部分数据需要提供给B系统。
首先利用Mysqldump将A系统中的部分表导出为文件,然后建立中间数据库
将导出的数据文件还原到中间数据库,然后再B系统中选择中间数据库的部分
字段进行同步。
为什么不用mysqldump导出的文件直接还原到B系统。
因为文件中会将表先进行删除,再创建表结构,再插入数据。
那么B系统中会高频读取数据库中数据,如果在数据同步的过程中,就会找不到表。
怎样从中间数据库同步到B系统的数据库。
首先根据相同表的唯一标识(一般是id),将不存在的数据删除,然后使用Replace进行替换更新需要的字段。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
bat命令如下:
@echo off title "sys_data_task" REM 声明采用UTF-8编码 chcp 65001 ::定时执行的时间间隔(秒) set INTERVAL=30 ::mysql.exe所在的路径 set mysql_home="C:Program FilesMySQLMySQL Server 5.6inmysql" ::源数据库地址 set origin_host=127.0.0.1 ::源数据库用户名 set origin_user=root ::源数据库密码 set origin_pass=123456 ::临时库和目标库地址 set target_host=127.0.0.1 ::临时库和目标库用户名 set target_user=root ::临时库和目标库密码 set target_pass=123456 timeout %INTERVAL% :Again echo "备份源数据库到sql文件开始" & echo %date% %time:~0,8% & "C:Program FilesMySQLMySQL Server 5.6inmysqldump" -h%origin_host% -u%origin_user% -p%origin_pass% uwb t_base_station t_locaker_card t_employee t_work_type > "D:\uwb.sql" & echo "备份数据库到sql文件结束" & echo %date% %time:~0,8% & ping 127.0.0.1 -n 3 & echo "还原sql文件到临时数据库开始" & echo %date% %time:~0,8% & %mysql_home% -h%target_host% -u%target_user% -p%target_pass% uwb_tmp< D:\uwb.sql & echo "还原sql文件到临时数据库结束" & ping 127.0.0.1 -n 2 & echo "同步t_base_station数据开始" & echo "删除目标数据库中t_base_station表不存在的数据" & %mysql_home% -h%target_host% -u%target_user% -p%target_pass% -e "DELETE FROM uwb_loc.t_base_station WHERE station_id NOT IN ( SELECT station_id FROM uwb_tmp.t_base_station)" & echo "插入或更新目标数据库中t_base_station更改的数据" & %mysql_home% -h%target_host% -u%target_user% -p%target_pass% -e "REPLACE INTO uwb_loc.t_base_station SELECT * FROM uwb_tmp.t_base_station" & echo "同步t_base_station数据结束" & timeout %INTERVAL% goto Again
注意:
1、中间数据库要和目标数据库在一个服务器上,并且执行脚本前,需要先建立好中间数据库以及相关表,使其与目标数据库一致。
2、注意这里的编码设置的为UTF-8,即65001,在执行cmd时如果提示:
The system cannot write to the specified device
则在cmd中输入:chcp
查看cmd当前的编码 是否一致,不一致则修改为一致即可。
3、时间间隔、mysql和mysqldump所在路径、源数据库和目标数据库的地址和用户名和密码 已经加注释,
mysqldump 后面紧跟数据库名uwb以及后面的表名t_base_station,多个表用空格分开。
4、然后根据每个表对应的情况,编写同步命令,首先根据唯一键,这里是id,将目标表中不存在的删除,然后将部分字段
进行replace,这里是select *,如果是部分字段可以这样
echo "同步t_work_type数据开始" & echo "删除目标数据库中t_work_type表不存在的数据" & %mysql_home% -h%target_host% -u%target_user% -p%target_pass% -e "DELETE FROM uwb_loc.t_work_type WHERE work_type_id NOT IN ( SELECT work_type_id FROM uwb_tmp.t_work_type)" & echo "插入或更新目标数据库中t_work_type更改的数据" & %mysql_home% -h%target_host% -u%target_user% -p%target_pass% -e "REPLACE INTO uwb_loc.t_work_type(work_type_id,work_type_name) SELECT work_type_id,work_type_name FROM uwb_tmp.t_work_type" & echo "同步t_work_type数据结束" &
注意要加括号声明要同步的字段。