如何实现两个数据库的同步

如何实现两个数据库的同步,第1张

sql同步使用dblink同步数据。

具体参考实例:

1、在win下创建linux的DBLINK

a查看linux下的tnsnamesora文件

[oracle@myrac1 admin]$ cat tnsnamesora

# tnsnamesora Network Configuration File: /s01/app/oracle/product/1120/dbhome_1/network/admin/tnsnamesora

# Generated by Oracle configuration tools

HJJ =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = myrac1oraclecom)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = hjj)

)

)

b创建dblink

SQL> create database link win_lin_link connect to hjj identified by xxxx

2 using '(DESCRIPTION =

3 (ADDRESS = (PROTOCOL = TCP)(HOST = 1921681171)(PORT = 1521))

4 (CONNECT_DATA =

5 (SERVER = DEDICATED)

6 (SERVICE_NAME = hjj)

7 )

8 )'

9 /

Database link created

2在win下创建trigger

SQL> create or replace trigger trig_win_emp

2 after insert on emp

3 for each row

4 begin

5 insert into emp@win_lin_link values(:newempno,:newempname,:newempsalary);

6 end;

7 /

Trigger created

3测试

4结果

win下插入数据

SQL> insert into emp values('E001','LYN',2300);

1 row created

SQL>COMMIT;

Commit complete

SQL> select from emp;

EMPNO EMPNAME EMPSALARY

---------------------------------------- ---------------------------------------- ----------

E001 LYN 2300

SQL> select from emp@win_lin_link;

EMPNO EMPNAME EMPSALARY

---------------------------------------- ---------------------------------------- ----------

E001 LYN 2300

linux下查看数据

SQL> select from emp;

EMPNO EMPNAME EMPSALARY

-------------------- -------------------- ----------

E001 LYN 2300

让属于同一个订单的消息进入一个MessageQueue

所以要解决这个消息的乱序问题,最根本的方法其实非常简单,就是得想办法让一个订单的消息进入到一个MessageQueue里去。

举个例子,比如对一个订单,先后执行了insert、update两条SQL语句,那么我们现在就必须要想办法让这个订单的2个消息都直接进入到Topic下的MessageQueue里去。

那么我们这个时候应该怎么做呢?完全可以根据订单id来进行判断,我们可以往MQ里发送消息的时候,根据订单id来判断一下,如果订单id相同,你必须保证他进入同一个MessageQueue。

我们这里可以采用取模的方法,比如有一个订单id是1000,可能有两个消息,对于这两个消息,我们必须要用订单id=1000对MessageQueue的数量进行取模,比如MessageQueue一共有15个,那么此时订单id=1000取模就是5。

通过这个方法,就可以让一个订单的消息都按照顺序进入到一个MessageQueue中去。

真的这么简单吗?获取消息的时候也得有序

我们来思考一下,真的就像上面说的那么简单,只要保证一个订单的消息都进入一个MessageQueue中就搞定了吗?

显然不是。我们必须保证推送MQ的时候,也必须是有序的。

Consumer有序处理一个订单的消息

接着我们可以想一下,一个Consumer可以处理多个MessageQueue的消息,但是一个MessageQueue只能交给一个Consumer来进行处理,所以一个订单的消息只会给一个Consumer来进行处理。

这就完了吗?万一消息处理失败了可以走重试队列吗?

在Consumer处理消息的时候,可能因为底层存储挂了导致消息处理失败,之前有说过,可以返回RECONSUME_LATER状态,然后broker会过会儿自动给我们重试。

但是这个方案绝对不能用在有序消息中,因为如果你的Consumer获取到订单的一个消息,结果处理失败了,此时返回了RECONSUME_LATER,那么这条消息会进入重试队列,过一会儿才会交给你重试。

但是此时broker会把下一条消息交给消费者来处理,万一处理成功了,就又会出现乱序问题。

对于有序消息的方案中,如果你遇到消息处理失败的场景,就必须返回SUSPEND_CURRENT_QUEUE_A_MOMENT这个状态,意思是先等一会儿,一会儿再继续处理这批消息,而不能把这批消息放入重试队列中去,然后直接处理下一批消息。

前提条件

您需要在您RDS for MySQL所在的云账号下开通阿里云数据传输服务。并 点击此处

下载dts-ads-writer插件到您的一台服务器上并解压(需要该服务器可以访问互联网,建议使用阿里云ECS以最大限度保障可用性)。服务器上需要有Java

6或以上的运行环境(JRE/JDK)。

*** 作步骤

1 在分析型数据库上创建目标表,数据更新类型为实时写入,字段名称和MySQL中的建议均相同;

2 在阿里云数据传输的控制台上创建数据订阅通道,并记录这个通道的ID;

(见: >

上一篇 <<< Linux环境安装Elasticsearch集群

下一篇 >>> Logstash-input-jdbc实现ES和数据同步 *** 作步骤

推荐阅读:

<<< Elasticsearch入门知识

<<< Elasticsearch快速原因分析及应用场景

<<< Elasticsearch的存储结构端口及版本控制

<<< Elasticsearch文档映射方式

<<< Elasticsearch的基本及复杂数据类型

<<< Elasticsearch的简易版及结构化查询语句

<<< Elasticsearch默认分词器对中文分词不友好

<<< Elasticsearch自定义分词和分词器

<<< 正向索引和倒排索引区别

<<< Elasticsearch中的类型区别汇总

<<< Elasticsearch是如何解决高并发问题

<<< Elasticsearch集群相关名词

<<< Elasticsearch集群及分片实现原理

<<< SpringBoot整合Elasticsearch

<<< Linux环境安装Elasticsearch

<<< Linux环境安装Elasticsearch集群

<<< Logstash-input-jdbc实现ES和数据同步 *** 作步骤

首先你要说明一下这2个数据库是什么关系

数据库集群,那么 AB 两库是 镜像 还是 互备,当然,根据数据库 品牌不同,同步的方式也不一样,不过都可以通过安装过程和建立 数据库实例中的配置 来实现

数据库之间通过其他可控程序连接,那么,该情况下,需要数据可能出现延迟等,不推荐

数据库之间没有连接,但是都由同一个节点进行数据下发,那么就在这个节点上实现一个跨库事物控制就行了

以上就是关于如何实现两个数据库的同步全部的内容,包括:如何实现两个数据库的同步、RocketMQ - 为什么基于 RocketMQ 进行订单库数据同步时会消息乱序、如何对MySQL数据库中的数据进行实时同步等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9868186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存