-
2019-05-24 09:59:50
对于分库(垂直分割,根据业务分库)数据如何确保数据最终一致性,这里说明一下为什么进行数据同步,而不是通过服务调用获取。这里主要是对应于公共的数据信息,比如(人员,组织等)关联的数据多,查询量大通过本地数据库保存一份的方法来降低全局数据库的压力,提高查询效率。
实现的方法有如下几种:
1.直接查询变动数据同步
写一个定时任务扫描要同步的表数据,当有数据变动或增加数据时,立即向其他子系统数据库同步数据,并依次提交事物。
这种方式的好处是简单易实现;
缺点是如果同步过程中发生异常某个数据库数据回滚,其他数据库成功,会造成数据的不一致性。
实时扫描业务表数据对真实需要业务查询功能产生影响。
2.异步处理法
在全局数据库增加一个增量数据表,存放有变动的表名,数据id,变更时间,是否同步标识和回执 。
定时任务实时扫描增量表,根据时间对数据进行count操作,当count数值增加时,查询未同步标识的数据进行同步操作;
当变更时间超过5分钟仍没有返回值时再次进行通过操作,为避免同一条数据多次变更,最新的操作成功,而老的数据再次同步覆盖掉最新的数据,需要对同条数据count>1的数据全部标记为未同步,按照时间顺序进行再次同步。count=1的数据直接再次同步;
有同步返回标示的是同步成功的,这样就保证了同步数据一定能够成功;
3.消息确认法
由于前面方法2存在延迟较大,针对方法2的改进引入消息机制,就是在全局表进行同步时向消息队列写一条数据,子系统接收处理完消息后也向消息队列写一条消息。
消费端订阅此消息当收到两个一样的数据id消息时,表名次数据同步成功,如果没有收到两个一样id的消息时,说明此消息同步失败,需要再次同步。
更多相关内容 -
如何同步数据库数据
2020-07-28 11:05:33打开工具菜单,选择数据库同步菜单,弹出数据同步的对话框,可以选择数据源,目标数据库 第四步 选择数据库源和需要操作的数据库后,然后在选择目标数据库链接,目标数据库,然后在选择需要操作的表,点击开始即可 ...第一步
打开mysql的客户端 这里使用navicat,连接数据库,等到navicat主页面,双击需要操作的数据库连接
第二步登录到数据库主页面后,点击左侧的数据库链接,打开数据库,可以看到可以操作的所有数据库
第三步打开工具菜单,选择数据库同步菜单,弹出数据同步的对话框,可以选择数据源,目标数据库
第四步选择数据库源和需要操作的数据库后,然后在选择目标数据库链接,目标数据库,然后在选择需要操作的表,点击开始即可
-
实现MySQL数据库数据的同步方法介绍
2021-03-04 01:26:44做开发的时候要做MySQL的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,MySQL的版本是4.1.15,都是目前最新的版本。1、安装配置两台服务器,分别安装好MySQL,都安装在 /usr/...做开发的时候要做MySQL的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,MySQL的版本是4.1.15,都是目前最新的版本。
1、安装配置
两台服务器,分别安装好MySQL,都安装在 /usr/local/mysql 目录下(安装步骤省略,请参考相关文档),两台服务器的IP分别是192.168.0.1和192.168.0.2,我们把192.168.0.1作为Master数据库,把192.168.0.2作为slave服务器,我们采用单向同步的方式,就是Master的数据是主的数据,然后slave主动去Master哪儿同步数据回来。
两台服务器的配置一样,我们把关键的配置文件拷贝一下,默认的配置文件是在 /usr/local/mysql/share/mysql目录下,分别有 my-large.cnf, my-medium.cnf, my-small.cnf等几个文家,我们只是测试,使用my-medium.cnf就行了。MySQL安装完后,默认的配置文件是指定在数据库存放目录下的,我们用的是4.1.X的,所以配置文件就应该在 /usr/local/mysql/var 目录下,于是把配置文件拷贝过去:
cp /usr/local/MySQL/share/MySQL/my-medium.cnf /usr/local/MySQL/var/my.cnf
两台服务器做相同的拷贝配置文件操作。
2、配置Master服务器
我们要把192.168.0.1配置为主MySQL服务器(Master),那么我们就要考虑我们需要同步那个数据库,使用那个用户同步,我们这里为了简单起见,就使用root用户进行同步,并且只需要同步数据库abc。
打开配置文件:
vi /usr/local/MySQL/var/my.cnf
找到一下信息:
以下为引用的内容:
# required unique id between 1 and 2^32 - 1
# defaults to 1 if Master-host is not set
# but will not function as a Master if omitted
server-id = 1 //1为Master,2为salve
添加两行:
sql-bin-update-same //同步形式
binlog-do-db = abc //要同步的数据库
重启192.168.0.1的MySQL服务器:
/usr/local/MySQL/bin/MySQLadmin shutdown
/usr/local/MySQL/bin/MySQLd_safe --user=MySQL &
3、配置Slave服务器
我们的slave服务器主要是主动去Master服务器同步数据回来,我们编辑配置文件:
vi /usr/local/MySQL/var/my.cnf
找到下面类似的信息:
以下为引用的内容:
# required unique id between 1 and 2^32 - 1
# defaults to 1 if Master-host is not set
# but will not function as a Master if omitted
server-id = 1
把上面的server-id修改为2,同时添加一些信息:
以下为引用的内容:
server-id = 2 //本MySQL是slave服务器
Master-host = 192.168.0.1 //Master服务器的IP
Master-user = root //连接Master服务器的用户
Master-password = ' //连接Master服务器的密码
Master-port = 3306 //连接端口
Master-connect-retry = 10 //重试次数
replicate-do-db = abc //要同步的数据库
log-slave-updates //同步的形式
重启192.168.0.2的MySQL服务器:
/usr/local/MySQL/bin/MySQLadmin shutdown
/usr/local/MySQL/bin/MySQLd_safe --user=MySQL &
4、测试安装
首先查看一下slave的主机日志:
cat /usr/local/MySQL/var/xxxxx_err (xxx是主机名)
检查是否连接正常, 看到类似这样的信息就成功了
以下为引用的内容:
051031 11:42:40 MySQLd started
051031 11:42:41 InnoDB: Started; log sequence number 0 43634
/usr/local/MySQL/libexec/MySQLd: ready for connections.
Version: '4.1.15-log' socket: '/tmp/MySQL.sock' port: 3306 Source distribution
051031 11:42:41 [Note] Slave SQL thread initialized, starting replication in log 'FIRST'
at position 0, relay log './new4-relay-bin.000001' position: 4
051031 11:43:21 [Note] Slave I/O thread: connected to Master 'root@192.168.0.1:3306',
replication started in log 'FIRST' at position 4
在Master查看信息
/usr/local/MySQL/bin/MySQL -u root
查看Master状态:
MySQL> show Master status;
查看Master下MySQL进程信息:
MySQL> show processlist;
在slave上查看信息:
/usr/local/MySQL/bin/MySQL -u root
查看slave状态:
MySQL> show slave status;
查看slave下MySQL进程信息:
MySQL> show processlist;
你再在Master的abc库里建立表结构并且插入数据,然后检查slave有没有同步这些数据,就能够检查出是否设置成功。
最后,如果有兴趣的话,可以研究一下双击热备份,或者一台Master,多台slave的同步实现。
-
数据库同步有哪些方式?【怎么保障目标和源数据一致性】
2021-09-02 16:16:36数据库同步有3大难题: 1是如何保障目标和源数据一致性;...2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样; 3是在数据越实时越有价值的背景下,同步过程中能否做到实时同步。文章目录
摘要
数据库同步有3大难题:
1是如何保障目标和源数据一致性;
2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样;
3是在数据越实时越有价值的背景下,同步过程中能否做到实时同步。一、几种主流的数据库同步方式
方式一:基于无侵入的日志模式(如Oracle redo、Mysql binlog)
基于日志的采集方式无需在源库端部署任务代理程序(Agent)及建任何表,对源数据库无侵入和影响压力;方式二:基于时间戳
同步过程通过特定属性(如时间戳、自增序列)来识别新插入的数据,该方式实现最简单,但无法记录删除和更新,也不具备实时的能力;方式三:基于触发器
基于数据库的触发器机制,当执行DML相关语句时,执行动作来捕获数据,该方式会降低系统能,因此大多数场景下,生产系统不允许添加触发器。方式四:基于快照
基于快照的方式,可以通过比较源表和快照表来获得数据变化,但需要消耗大量存储空间和计算资源。方式五:基于离线批处理
通过jdbc查询来批量获取数据,会进行数据表的大范围扫描和数据提取,会对数据库产生大量开销。本文主要探讨无侵入的CDC模式,并以运用这种模式的数据库同步云工具 Tapdata Cloud 举例,你要问我为啥用它举例,原因只有一个:永久免费。
二、架构及工作原理
Tapdata Cloud包含两部分:
- Tapdata Cloud Manager,TCM是Tapdata Cloud的管理端,负责agent实例的安装,同步任务的配置、分发、任务状态监测。
- Tapdata agent,是Tapdata Cloud数据同步服务的执行实例,负责从TCM获取任务信息,通过流式技术从源系统获取数据、处理转换数据并发送到目标系统,并在任务执行过程中监测并上报任务状态至TCM。
(Tapdata Cloud 工作原理图)
有朋友可能会担心这个云平台会不会把我要同步的数据泄露出去?
从Tapdata Cloud 工作原理上可以看出:
- 同步实例节点单向连接管控端运行服务。 Tapdata agent实例节点对外不主动暴露网络信息,只会连接 TCM管理端服务,获取任务信息、上报状态信息。
- 用户部署的Tapdata agent实例节点和 TCM 通信链路采用 HTTPS 协议。
- 自建模式下,所有数据流转均发生在受用户管理的服务器和网络环境。
可见,数据同步过程中数据泄露的问题大可不必担忧。
三、全量同步和实时增量同步机制
Tapdata Cloud 这款云同步工具支持全量同步和实时增量同步,实现的过程如下图所示:
四、源和目标
据 Tapdata Cloud 最新版本,目前支持了:
数据库 版本 作为源 作为目标 是否可用 mysql 5.x,8.x 支持 支持 是 oracle 9i, 10g, 11g, 12c 支持 支持 是 sqlsever 2005, 2008, 2012, 2014, 2016, 2017 支持 支持 是 mongodb 3.2, 3.4, 3.6, 4.0, 4.2 支持 支持 是 PostgreSQL 9.x, 10.x,11.x,12.x,13.x 支持 支持 是 Elastic 5.x, 6.x, 7.x 暂不支持 支持 是 达梦数据库 7,8 支持 支持 是 Kafka 2.3.x及以上 暂不支持 支持 是 Redis 2.x, 3.x, 4.x 暂不支持 支持 即将上线 DB2 9.7 LUW版本 支持 支持 即将上线 Sybase Sybase ASE 15.7 及以上 支持 支持 即将上线 Gbase 支持 支持 即将上线
五、举例:Oracle 数据实时同步到 Elasticsearch
一般需要做全文检索的时候,会将 Oracle 数据实时同步到 Elasticsearch。
第一步:配置 Oracle 连接
- 点击 Tapdata Cloud 操作后台左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Oracle
- 在打开的连接信息配置页面依次输入需要的配置信息
【连 接 名 称】:设置连接的名称,多个连接的名称不能重复
【数据库地址】:数据库 IP / Host
【端 口】:数据库端口
【数据库名称】:tapdata 数据库连接是以一个 db 为一个数据源。这里的 db 是指一个数据库实例中的 database,而不是一个 schema。
【账 号】:可以访问数据库的账号
【密 码】:数据库账号对应的密码
【时 间 时 区】:默认使用该数据库的时区;若指定时区,则使用指定后的时区设置第二步:配置 Elasticsearch 连接
- 同第一步操作,点击左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Elasticsearch
- 在打开的连接信息配置页面依次输入需要的配置信息,配置完成后测试连接保存即可。
第三步:建立同步任务,以全量+增量同步举例
进入Tapdata Cloud 操作后台任务管理页面,点击添加任务按钮进入任务设置流程
根据刚才建好的连接,选定源端与目标端。
根据数据需求,选择需要同步的库、表,如果你对表名有修改需要,可以通过页面中的表名批量修改功能对目标端的表名进行批量设置.
在以上选项设置完毕后,点击下方的全量+增量选项并点击确定按钮即可完成本次全量同步任务的配置,在点击确定后将自动返回任务管理页面,在任务管理页面中,点击右侧的启动按钮即可使Tapdata Agent 开始执行本次任务。在全量任务执行完毕后,Tapdata Agent 会自动进入增量同步状态。在该状态中,Tapdata Agent 会持续监听源端的数据变化(包括:写入、更新、删除),并实时的将这些数据变化写入目标端。
点击任务监控可以打开任务执行详情页面,可以查看任务执行的具体信息。
同理,其他数据库的同步操作也跟上面步骤一致,比如几个常用的场景是:
• 从业务数据库到缓存数据库的实时同步
• 不停机迁移数据库
• 将主业务中心的数据实时同步至次业务中心
• 构建只读实例
• 构建异地灾备中心
• 构建异地多活
六、目标和源数据一致性
很多人都担心同步的数据可能没法和源数据一致,Tapdata Cloud 提供了数据校验功能,包括快速count校验、表全字段值校验和关联字段值校验三种校验方式。
• 快速count:仅对源表和目标表的行数进行count校验,速度极快,但是不会展示差异的具体字段内容。
• 全表字段值校验:会对源表和目标表的全部字段进行逐行校验,能查出所有字段的差异,但是速度慢。
• 关联字段值校验:只对源表和目标表的关联字段的值进行比对校验,速度快于全表字段值校验模式。
校验操作步骤
进入数据校验菜单,点击新建校验任务创建数据校验。
【选择任务】:选择一个历史同步任务
【校验类型】:可选 快速count校验、表全字段值校验和关联字段值校验
【校验任务名】:默认与选择的同步任务名字一样
【校验频次】:设置您的校验的执行频次
【单次校验】:只执行一次校验
【重复校验】:设置校验任务重复执行,支持设置校验执行的起止时间和校验间隔
【错误数据保存条数】:当出现校验不一致的数据时,不一致数据保存的最大条数。该数值会影响到差异校验,当错误数据条数超出设置的保存条数时,将无法进行差异校验。
【校验条件】:添加需要进行校验的表。点击自动添加会自动将任务下的所有表全部添加进来。快速count校验
创建快速count校验时只需要选择到要校验的表,无需设置关联条件。
表全字段值校验
除了要选择待校验表外,还需要针对每一个表设置索引字段。
在进行表全字段值校验时,还支持进行高级校验。通过高级校验可以添加JS校验逻辑,对源和目标的数据进行校验。
完整示例:以MongoDB查询示例
JavaScript
function validate(sourceRow){ // 第1步 var targetRow = target.executeQuery({database: "target",collection: "USER",filter: {USER_ID: sourceRow.USER_ID}}); // 第2步 if(sourceRow.USER_ID === targetRow[0].USER_ID){ // 第3步 return {result: 'passed',message: "",data: ""} }else{ return {result: 'failed',message: "记录不一致",data: targetRow} } }
关联字段值校验
创建关联字段值校验时,除了要选择待校验表外,还需要针对每一个表设置索引字段。
七、异构数据类型转换
在异构数据库之间做同步,类型转换是一大难题,也是导致数据同步失败的重要原因,Tapdata Cloud 类型映射功能,在系统推演的基础上,提供了人工调整的能力,这一点比其他数据同步工具都更方便使用。
八、总结
为了达到数据实时要求,并且不对源库造成干扰,首选 CDC 模式。
现在市面上已经陆续出现了一些数据同步工具,完全没有必要自己撸代码了,免费的用起来不香吗?
希望上文的实操图文,对你的数据库同步有帮助,有数据库相关的问题可以随时跟我交流! -
Navicat定时 同步数据库
2021-11-12 01:40:01Navicat定时在MySQL与MySQL数据库之间自动传输数据 来由: 需要将表数据从一个库同步到另一个库(数据分发),之前有尝试过使用Kettle去抽数,但是数据量稍微大一点的时候太慢了... 有可能是本机性能的原因,然后... -
db2es 同步数据库数据到es
2022-04-29 21:45:45ElasticSearch7.10 ES 数据库 同步 mysql sqlserver 数据清洗 多线程 大数据量 全量 增量 定时 脚手架 优点 相比于logstash,支持对数据的真删除进行同步(基于触发器) 对大数据量同步性能更出色,基于id或自增列进行... -
Redis与数据库数据同步解决方案
2017-10-11 16:43:06本文转自:http://3gods.com/2016/06/23/Redis-Sync-DB.html ... 数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种更加可靠。Redis在这里只是做缓存。 方案1 做... -
mysql ,两个数据库,实时数据同步
2014-12-10 13:10:24mysql,两个数据库,实现实时数据同步 -
Oracle数据库数据同步到mysql数据库(Oracle数据库备份dmp如何同步到mysql)
2022-03-10 10:14:30一项目客户是oracle数据库,需要导一个表数据到自研系统mysql数据库,甲方已给出oracle格式dmp文件! 处理思路: ①、安装Oracle数据库。 ②、用甲方提供oracle格式dmp文件导入我方自搭建的Oracle。 ③、安装一台... -
Django同步数据库
2021-05-19 17:26:24同步到数据库 在 models.py 中创建好数据对象后执行 python manage.py ...同步数据库已有数据 执行如下命令,将数据反向生成models追加到models.py 下 python manage.py inspectdb >> MyApp/models.py ... -
利用kettle实现数据库之间的数据同步
2021-10-15 14:12:54利用kettle实现数据库之间的数据同步 如果你需要做不同数据库之间的数据迁移或者抽取部分数据到另一个数据库,并实现定时数据同步(非实时),那么kettle是一个很好的选择。 以mysql数据库—> oracle数据库的... -
实现两个数据库之间的数据同步
2018-11-08 18:23:05不同服务器数据库之间的数据操作 --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '... -
JAVA 两个数据库 的某个表数据同步
2019-08-30 11:02:10字服务器数据库数据变动时 实时上传和更新至主机数据库 例如点菜系统的同步方式 两个电脑 把A电脑的数据库的表C数据变动 同步至B电脑的数据库表C 其中 A电脑的表C数据 和B电脑的表C数据内容不一样 结构一样 ... -
数据库数据定期同步实现
2017-06-25 12:02:30需求背景:有一个业务方需要定期跟数据库进行数据同步,就是需要定期往数据库中同步部分数据,而这些数据并不能被当前系统直接使用,需要做一些处理同步到系统所使用的数据库中,处理比较复杂,没办法进行实时的同步... -
sqlite 数据库数据同步
2019-02-22 12:12:21sqlite 有没有类似mysql的功能在两个库或者多个库之间进行数据同步呢?当然是可以的。 1,安装Sqlite Expert 2,打开数据库A,然后Attach 数据库B 3,打开之后我们可以看到数据库A的表以及带有数据库B前缀的表 4.将... -
数据库数据对比工具(MSSQL版)
2016-09-13 16:15:09数据库数据对比工具(MSSQL版)是针对MS SQL Server的一款小工具,可以针对两个数据进行表结构和数据的对比。1、结构对比:如开发库和正式库之间的结构和数据同步,此工具可以告诉您哪个表结构有字段的增加减少,... -
solr 配置自动同步数据库数据(全量,增量)
2018-03-08 11:08:42solr 配置自动同步数据库数据(全量,增量) solr6.3.3 mysql-connector-java-5.1.45-bin.jar solr 以 jetty 方式部署 (非tomcat) * 1.将 mysql-connector-java-5.1.45-bin.jar 放到 ./dist下 * 2. 修改数据仓库... -
oracle数据库之间数据同步
2021-01-18 19:27:20这段时间负责某个项目开发的数据库管理工作,这个项目中开发库与测试数据库分离,其中某些系统表数据与基础资料数据经常需要进行同步,为方便完成指定数据表的同步操作,可以采用dblink与merge结合的方法完成,简单... -
MYSQL数据库间同步数据
2018-05-24 19:49:01假设数据库A为主机,数据库B为从机(A向B提供同步服务,即B中的数据来自A)A机器:IP=10.10.151.166B机器:IP=10.10.151.156下面看单向同步的配置步骤:1 在机器A中建立一个新的数据库,sql语句:[sql] view plain... -
数据库实时同步方案
2021-07-05 15:08:08Beedup采用数据库逻辑复制技术,通过实时解析主库日志还原执行的DML及DDL并按照事务单元重新在从库执行,实现主从库的数据完全一致。目前支持Oracle、SQL Server、DB2、MySQL、PostgreSQL等数据库实时同步。 二 ... -
sql server 触发器实时同步数据库表数据
2019-07-23 13:15:30sql server 触发器实时同步数据库表数据 创建两个相同结构的数据库表 CREATE TABLE [dbo].[Table_1]( [id] [varchar](50) NOT NULL, [name] [varchar](50) NULL, [dept] [varchar](50) NULL, [company] [varchar... -
navicat怎么备份数据和同步两个数据库
2020-12-15 15:39:52备份数据 备份数据的方式一般有两种: 通过命令行导出sql文件或者bak文件 通过可视化工具导出sql或者直接数据库传输 这里主要简单介绍两种方式的及具体操作步骤: 命令行 一、导出步骤 导出数据和结构 mysqldump... -
redis缓存如何同步数据库
2020-09-21 15:53:36redis缓存如何同步数据库 redis-mysql模式 读:服务程序先从缓存中读取数据,如果命中,则将数据读出。如果未命中,则在数据库中读取数据, 然后将数据写入到缓存中去。 更新数据:常见的模式是先到数据库中写入,... -
Oracle 数据怎么实时同步到 DM DB 达梦数据库 | 亲测干货建议收藏
2021-09-02 20:38:13很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据、表多、数据量大等情况就难以同步。我自己亲测了一种方式,可以很方便地完成 Oracle 数据实时同步到 DM DB ... -
java实现数据库同步
2022-03-25 09:05:55之前也有用过数据库的同步中间件比如阿里的canal,最近突发奇想,自己使用Java进行不同数据库品牌的数据库同步,比如Oracle同步到MySQL,等等; 正文 -
mysql同一实例多个数据库数据同步
2020-07-20 16:18:39mysql同一实例不同数据库数据同步 方案一:使用触发器同步 优点: 工作效率和开发效率上有很大的提高 缺点: 增加数据库服务器的开销 具体实现 使用三个不同数据库做测试: 1、sakila库中的user_test表 2、test库中... -
多台服务器mysql数据库数据同步
2018-11-28 16:59:313台服务器的多主架构,3台服务器都可以写入并且做到3台服务器的数据一致性(任意一台服务器做写入操作都可以,并且每台服务器的数据做到完全一致),并且防止主键冲突.目前只有3台MySQL服务器,不使用生成唯一id的程序。 ... -
在两个MySQL数据库之间实现数据增量同步
2021-03-15 15:44:11在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件在两个数据库中实现数据增量同步,令数据库之间的数据能够同步更新。Oracle数据库IP:192.168.0.1(源库)、192.168.0.2(目标库)1、在源库创建测试表TEST... -
不同数据库表之间的数据同步
2019-06-05 16:35:06不同数据库表之间的数据同步 场景还原: 现在需要对正式环境做升级,需要从实施环境往正式环境导入部分数据,现在需要比对两个数据库之间某个表的数据差异,并将正式环境缺少的部分,从实施环境同步到正式环境。... -
Navicat实现数据库结构和数据同步
2018-11-25 22:39:15Navicat 是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它可以用来对本机或远程的 MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL 数据库进行管理及开发。 日常...