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数据库中的数据进行实时同步等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)