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/[email protected]_instance to user2/[email protected]_instance create emp2 using select * from emp;
上边的命令会从source_instance中把emp数据拷贝到dest_instance中的emp2表。
数据库内的复制,也可以使用Copy命令,Example:
- copy from scott/[email protected] to scott/[email protected] 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/[email protected] -
- to scott/[email protected]
- create empy-
- using select * from emp-
- where rownum = 1