Oracle数据库间的数据复制 - SQLPlus中的COPY命令

本文介绍了Oracle数据库中SQL*Plus的COPY命令,用于在不同或相同数据库间复制数据,虽然Oracle 9i文档表示可能不再支持,但11g仍可使用。COPY命令支持Char, Date, Long, Number, Varchar2五种数据类型,但不包括8i后新增的数据类型。使用COPY涉及设置TNS连接信息,然后在SQL*Plus中运行命令。COPY的效率可能低于CREATE TABLE ... AS ...,因为它需要通过SQL*Plus中转数据。COPY有四种模式,并允许长命令使用续行符(-)分隔。相关资源链接也一并提供。" 132399834,19673215,R语言ggplot2中使用geom_smooth与loess方法拟合数据曲线,"['R语言', '数据可视化', '统计分析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档说明:SQL*Plus COPY Command

Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同。原理图:



根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持Copy命令,只是未写入11g的文档里,未来12C不知道还支不支持。

Copy也有明显的缺点,Copy只支持五种数据类型,Char,Date,Long,Number,Varchar2,8i之后Oracle数据库新增的数据类型都不支持。


使用方法:

1.首先确保TNS里记录了源Instance和目标Instance的连接信息;


2.运行SQL * Plus(无需连接具体的Instance)

sqlplus /nolog


3.运行Copy命令

Copy命令的语法:

COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)]
USING query

where database has the following syntax:

username[/password]@connect_identifier

Copies data from a query to a table in a local or remote database. COPY supports the following datatypes:

CHAR
DATE
LONG
NUMBER
VARCHAR2

Example:

copy from user1/password1@source_instance to user2/password2@dest_instance create emp2 using select * from emp;

上边的命令会从source_instance中把emp数据拷贝到dest_instance中的emp2表。

数据库内的复制,也可以使用Copy命令,Example:

copy from scott/password@ptian to scott/password@ptian create emp2 using select * from emp;

这就有点类似于CREATE TABLE empx AS (SELECT * FROM emp);
根据Tom的说法,Copy的效率可能会比CREATE TABLE ... AS ...(数据库间的复制也可以使用Create table...as,通过database Link)差,因为Copy是把数据从一个Instance拷贝到sqlplus,再从sqlplus插入另外一个Instance。

而CREATE TABLE ... AS ...是把一个数据库的数据直接插入到第二个数据库,所以效率会高一些。


Copy 命令的四种模式

* replace子句指定了被创建的表名。如果目标表已存在,则删除并用包含复制数据的表替代。若不存在,则创建目标表。
* 使用create子句可避免覆盖已存在的表。若目标表已存在,则copy报告一个错误;若不存在,则创建目标表。
* insert插入数据到已存在的表。将查询到的行插入到目标表,如果目标表不存在,copy返回错误。当使用insert时,using子句必须为目标表的每个列选择对应的列。
* append是将查询到的行插入到目标表。如果不存在,则创建目标表并插入。

其他说明

如果copy命令比较长,可以在分行时每行末尾必须有续行符(-),最后一行不加。

copy from scott/welcome@ptian -
to scott/welcome@ptian-
create empy-
using select * from emp-
where rownum = 1


参考:

http://docs.oracle.com/cd/B10500_01/server.920/a90842/apb.htm

http://stackoverflow.com/questions/8944156/how-to-copy-data-from-one-database-table-to-another-database-table

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4774938200346214569


转载请注明出处:http://blog.youkuaiyun.com/pan_tian/article/details/9932201


复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中。 在很多生产环境中,经常遇到一些大量得数据,这些数据只用作查询统计功能。例如:历史告警,历史性能指标,历史事件,等等。这种数据的特点是:只读不写,数据量相当大,一旦查询大结果集的数据时,对数据库的IO,内存缓存占用相当大,会严重影响同一个数据库的其他会话的操作,表现为整个数据库反应迟缓,业务功能不可用。采用复制技术后,将这些大型数据复制到另外一个数据库中,对这些大数据的查询统计操作放在另外的一台数据库服务器上进行,即使受影响,也只是影响局部的查询统计功能,其他正常的业务处理不受影响。 但是,使用复制技术的话,意味着一个系统中,至少存在两个数据库(集群的数据库也当成一个数据库),对应的应用程序也需要建立多个数据库连接,能够根据业务需要,访问不同的数据库ORACLE数据库自身提供有复制功能,只需要进行配置即可实现。 ORACLE提供有三种复制技术: 高级复制(Advanced Replication) 流复制(Streams Replication) 备库(Dataguard) 备库的方式,就是数据库数据库的备份方式,主要是解决容灾的,不讨论此话题。 流复制主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表上的ddl或dml。可以复制到表,用户,数据库级别。 高级复制主要是基于触发器的原理来触发数据同步的,因此,高级复制无法实现用户,数据库级别的对象复制,只能做些表、索引和存储过程的复制。 如果出于容灾整个数据库的考虑,高级复制相当复杂,而且并不一定能做好,流复制的配置相对简单。流复制是后来产生的复制技术,是基于日志挖掘技术实现的,对数据库的影响较低。但在稳定性方面较差,实时性没有高级复制强(因为高级复制是基于触发器的)。如果系统意外的话,流复制的恢复将会需要较长时,特别是意外时越长,恢复时成倍增长。 下面使用相同的环境,分别对两种复制功能进行配置介绍,并进行性能压力测试比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值