使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决

在数据库同步中我们经常会用到DBLink方式。DBLink可以将物理上存放于网络的多个数据库在逻辑上当成一个单一的大数据库。开发人员无需关心数据库的网络分布,就能很方便的实现从不同数据库之间读取数据。如何在Oracle数据库间建立DBLink我在之前的文章已有涉及,这里就不花篇幅讲解了。具体请查看Oracle建立DBLink。

本篇文章主要阐述如何解决DBLink方式无法实现Blob、Clob字段数据同步的问题。在网上已经有很多牛人给出了解决方案,在参照他们的方案解决问题的过程中,发现有些小问题并没有解决,而且也没有人给出一个完整的解决过程。这里我把我的解决过程记录下来,供大家参考。

首先,我们看一下DBLink为何不能实现Blob、Clob字段的同步。我在我本机Oracle数据库中建立了DEVD数据库的Database Link。当我们Select没有大字段的DEVD数据库的表的时候,数据能查询出来。当我们查找含有大字段的表时,系统给出如下提示:

select * from [email protected]

JJR_TJJR_CYZGXX表中还有Blob字段。

因为Oracle不允许LOB属性的数据进行DBLink方式的查询的。解决此类问题有人提出使用临时表的形式进行中转,然后再进行数据的同步。使用这种方法确实能够解决问题,具体解决方案如下:

1.使用子查询来建立临时表,实现本地临时表复制远程数据库表的数据。

Create global temporary table temp on commit preserve rows as select * from [email protected]

为什么要用On commit preserve rows, 我之前的Oracle用子查询创建临时表的问题总结中已经提到。

通过查询temp表,我们发现所有JJR_TJJR_CYZGXX表中的数据已经同步到temp表中。

2.在本地test表中同步临时表temp的数据,先删除test表中数据,然后用子查询实现数据复制。

Insert into test select * from temp

通过查询本地test表,我们看到即使含有Blob字段的表的数据已经查询过来。

其他解决方案:

通过临时表能够实现含大字段表的数据同步,我们之间使用本地表是否也能达到相同的效果呢?通过实验我们发现直接通过本地表也是能够实现的。

首先建立test1表,结构和JJR_TJJR_CYZGXX表结构一致。通过子查询来实现数据复制

Insert into test1 select * from [email protected]

通过查询test1表我们发现数据已经复制。

 

--创建临时表:
create global temporary table lob2
(
   line   number primary key,
   text   clob
)
on commit delete rows;

--插入数据:
SQL> insert into lob2 select line,text from lob1@lob_link;
499 rows created.

SQL> select * from lob2 where rownum<5;
      LINE TEXT
---------- ---------------------------------------------------------------------
         5
         8   type NUMBER is NUMBER_BASE;
         9   subtype FLOAT is NUMBER; -- NUMBER(126)
        11   subtype "DOUBLE PRECISION" is FLOAT;

SQL> commit;
Commit complete.

SQL> select * from lob2 where rownum<5;
no rows selected
--提交之后数据就被删除了,这个是临时表的属性。
时间: 2024-08-04 21:30:15

使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决的相关文章

sql 同步远程数据库(表)到本地

一)在同一个数据库服务器上面进行数据表间的数据导入导出: 1. 如果表tb1和tb2的结构是完全一样的,则使用以下的命令就可以将表tb1中的数据导入到表tb2中: insert into db2.tb2 select * from  db1.tb1 2. 如果表tb1和tb2只有部分字段是相同的,要实现将tb1中的部分字段导入到tb2中相对应的相同字段中,则使用以下命令: insert into db2.tb2(字段1,字段2,字段3--) select  字段1',字段2',字段3',-- 

Oracle数据库中的blob类型解析

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作

采用struts2+hibernate实现保存文件到Oracle数据库&amp;&amp;并附下载代码【导入即可用】;数据库中保存blob类型的二进制文件

原文:采用struts2+hibernate实现保存文件到Oracle数据库&&并附下载代码[导入即可用]:数据库中保存blob类型的二进制文件 源代码下载地址:http://www.zuidaima.com/share/1550463402478592.htm

本地mongodb数据库导出到远程数据库中

把本地Mongodb中的数据导入(批量插入)到服务器的数据库中 1.导出数据: mongoexport -d admin -c users -o outdatafile.dat 选项解释: -d 指明使用的库, 本例中为” admin”-c 指明要导出的表, 本例中为”users”-o 指明要导出的文件名, 本例中为”outdatafile.dat” 如果出现error connecting to db server: no reachable servers错误,将绑定的ip解绑即可 2.连接

Hibernate的Annotation中实体BLOB CLOB类型的注解

在Hibernate Annotation中,实体BLOB.CLOB类型的注解与普通的实体属性有些不同,具体操作如下: BLOB类型的属性声明为byte[]或者java.sql.Blob: @Lob @Basic(fetch=FetchType.LAZY) @Column(name="IMGS", columnDefinition="BLOB", nullable=true) private byte[] imgs; public byte[] getImgs()

数据泵在本地导出数据到远程数据库中

local_db 安装在suselocal_db的tnsname       (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.31.110)(PORT = 1521))            (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ora11g)))1.建dblink连接到remote_dbCREATE DATABASE LINK WIN7_API_LINK CONNE

将图片以二进制的方式保存在数据库中,并显示图片

http://www.aspnettutorials.com/tutorials/database/store-img-bins-asp4-cs/ http://stackoverflow.com/questions/18998763/how-to-retrieve-binary-image-from-database-using-c-sharp-in-asp-net 1. 创建一个数据表 CREATE TABLE [dbo].[SaveImageByBinary] ( [Id] INT NOT

数据库中的BLOB

public class TestBLOB {    static String url = "jdbc:oracle:thin:@localhost:1521:orcl";    static String driver = "oracle.jdbc.driver.OracleDriver";    static String userName = "scott";    static String pwd = "tiger"

python3中socket套接字的编码问题解决

一.TCP 1.tcp服务器创建 #创建服务器 from socket import * from time import ctime #导入ctime HOST = '' #任意主机 PORT = 21567 #随机提供个端口号 BUFSIZ = 1024 # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配了 TCP 服务器套接字 tcpSerSo