# 数据同步 **Repository Path**: linuxstar/data-synchronization ## Basic Information - **Project Name**: 数据同步 - **Description**: 1. 基于表的最后更新时间的数据同步 2. 用于不同数据库之间的数据传输 3. 暂时只支持mysql数据库和Oracle数据库 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-07-23 - **Last Updated**: 2021-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据同步 #### 介绍 1. 用于不同数据库之间的数据传输,数据库:MySQL,语言:Java 2. 基于来源数据库同步表的最后更新时间同步,数据的最后更新时间被修改,则数据会被同步 #### 软件架构 - 框架使用的是[若依的前后单分离框架](http://doc.ruoyi.vip/ruoyi-vue/),基于此框架做的一系列的优化和再次开发 #### 运行系统 ##### 后端运行 1. 导入到`Eclipse`,菜单 `File` -> `Import`,然后选择 `Maven` -> `Existing Maven Projects`,点击 `Next`> 按钮,选择工作目录,然后点击 `Finish` 按钮,即可成功导入。 2. 创建数据库 `syncdb`并导入数据脚本`syncdb_table_init.sql`,`sync_data_init.sql` 3. 打开项目运行`com.sync.SyncApplication.java`,出现如下图表示启动成功。 ``` (♥◠‿◠)ノ゙ 数据同步启动成功 ლ(´ڡ`ლ)゙ ______ ___ _____ ___ _______ ___ _ _____ | _ \/ _ \_ _/ _ \ / ___\ \ / / \ | / __ \ | | | / /_\ \| |/ /_\ \______\ `--. \ V /| \| | / \/ | | | | _ || || _ |______|`--. \ \ / | . ` | | | |/ /| | | || || | | | /\__/ / | | | |\ | \__/\ |___/ \_| |_/\_/\_| |_/ \____/ \_/ \_| \_/\____/ ``` ##### 前端运行 ``` # 进入项目目录 cd sync-ui # 安装依赖 npm install # 强烈建议不要用直接使用 cnpm 安装,会有各种诡异的 bug,可以通过重新指定 registry 来解决 npm 安装速度慢的问题。 npm install --registry=https://registry.npm.taobao.org # 本地开发 启动项目 npm run dev ``` - 打开浏览器,输入:(http://localhost:80) 默认账户/密码 admin/admin123)若能正确展示登录页面,并能成功登录,菜单及页面展示正常,则表明环境搭建成功 #### 环境部署 - 因为本项目是前后端完全分离的,所以需要前后端都单独部署好,才能进行访问,服务器防火墙需要开启`7090`和`7091`端口。访问地址:(http://ip:7090/login)。 ##### 后端部署 - 打包工程文件 1. 使用maven打包,会在`sync-admin`模块的`target`下生成`sync-admin-prod.jar`包,可以上传到服务器后使用`jdk`直接启动 ![打包配置](https://images.gitee.com/uploads/images/2021/0308/151244_21f10037_8288917.png "屏幕截图.png") ##### 前端部署 ``` # 使用命令打包 npm run build:prod ``` - 构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 ***.js 、***.css、index.html 等静态文件。 - 通常情况下 dist 文件夹的静态文件发布到你的 `nginx `或者静态服务器即可,其中的 index.html 是后台服务的入口页面。 - 这是我的`nginx.conf`配置 ``` #user nobody; worker_processes auto; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 7090; server_name localhost; location / { root /data/appsvr/sync/dist_prod/;# 根目录,dist_prod是前端打的包 try_files $uri $uri/ /index.html; index /data/appsvr/sync/dist_prod/index.html; # 默认首页 } location /prod-api/{ proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:7091/prod-api/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ``` #### 使用说明 1. 进入功能 `数据同步` -> `数据源` ,配置来源库和目标库数据源,暂时只支持两种数据库(`MySQL`和`Oracle`)。 **注意** :MySQL数据库需要指定连接时需要指定时区,不然记录到数据库的时间会有问题(&serverTimezone=GMT%2B8) ![数据源配置](https://images.gitee.com/uploads/images/2021/0308/155105_e2a64f79_8288917.png "屏幕截图.png") 2. 进入功能 `数据同步` -> `同步定时任务`,配置需要同步的表。 ![同步任务配置说明](https://images.gitee.com/uploads/images/2021/0308/155624_62fe2c97_8288917.png "屏幕截图.png") 配置字段说明: - 同步任务名称:字面意思,一般是表名,唯一 - 任务描述:*** - 来源数据源:会从和这个数据源读取数据(从前面配置的数据源里选择) - 目标数据源:会把数据写入这个数据源(从前面配置的数据源里选择) - 目标表: 需要写入数据的表 - 跳过不更新字段:默认为空,如果配置了字段,则表示当目标库的数据在更新时是不会更新配置的这些字段。多个字段用英文逗号`,`隔开 - 主键值:不能为空,目标表的主键,程序会通过该字段的值判断是插入数据还是更新数据。如果是联合主键则需要用英文逗号`,`隔开 - 不更新数据条件:默认为空,如果配置的话,一般配置的是SQL条件,比如(一个条件的`STATUS IN ('C','YDS')`,多个条件都要满足的 `STATUS IN ('C','YDS') AND FLAG = 'Y'`,多个条件只需要满足一个的`(STATUS IN ('C','YDS') OR FLAG = 'Y')`),如果目标库的数据满足配置的条件,则不会更新目标库的这条数据 - 备注:*** - 同步SQL:就是读取来源库数据的SQL,类似于`mybatis`的`xml`里配置的SQL ``` SELECT TP_NUMBER, TP_TYPE_DESC, TP_TYPE, ORGANIZATION_ID, ORGANIZATION_NAME, ORGANIZATION_CODE, CREATED_BY, CREATION_DATE, LAST_UPDATE_DATE, LAST_UPDATED_BY FROM apps.cwms_tp_number_detail WHERE ORGANIZATION_ID IN (#ORGANIZATIONID#) AND LAST_UPDATE_DATE >= to_date(#SYNC_TIME_BEGIN#, 'yyyy-MM-dd HH24:mi:ss') -- #SYNC_TIME_BEGIN# 固定写法,标识 同步开始时间 AND LAST_UPDATE_DATE <= to_date(#SYNC_TIME_END#, 'yyyy-MM-dd HH24:mi:ss') -- #SYNC_TIME_END# 固定写法,标识 同步结束时间 ``` -- #ORGANIZATIONID# :除了`#SYNC_TIME_BEGIN#`和`#SYNC_TIME_END#`之外的其他变量需要传值的话,需要在功能 `同步程序` -> `全局变量` 里配置 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0308/161606_a88be4a6_8288917.png "屏幕截图.png") -- #SYNC_TIME_BEGIN# 固定写法,标识 同步开始时间 -- #SYNC_TIME_END# 固定写法,标识 同步结束时间 **说明:新增的同步任务默认五分钟执行一次,也可以在定时任务还没有开始执行的时候手动修改下次同步的开始时间和结束时间** ![同步时间修改](https://images.gitee.com/uploads/images/2021/0308/162113_89b288f6_8288917.png "屏幕截图.png") **修改完同步时间后,可以点击`启动`按钮立即执行,或者等待定时任务自动执行** #### 参与贡献 1. W-abinbin 2. hpp 3. huanglan 4. yss