oracle copy 与postgresql copy

本文介绍了Oracle中用于数据迁移的oraclecopy命令及其用法,包括不同模式下的操作细节,并对比了PostgreSQL中的COPY命令,提供了实用的例子。

先介绍oracle copy,其实这个命令我到现在都没用过,也是做数据迁移的命令,注意这个命令是SQL*PLUS的命令,不是oracle的,通过这个命令可以在不同的表之间移动数据

1.基本语法:

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

a)databaseusername/password@dbname

from database|to database可以任选一,缺少的一方默认使用当前sqlplus登录的数据库代替。

b)query:普通的select语句,多行时行尾使用连字符’-‘换行标记

支持的数据类型:CHAR,DATE,LONG,NUMBER,VARCHAR2

copy datasqlplus作为数据流的管道,不需要中间文件,数据库名使用tns中的配置。query子句在数据源库上执行,结果直接发到目标库。

2.四种模式:

c)append:目标表不存在时先建表再插入数据,若存在直接加载数据。

d)create:直接建表,若目标表存在,报错退出。

e)insert:直接插入数据,若目标表不存在,报错退出。

f)replace:目标表存在时会先删除表,再重建及加载数据,一般很少用这个模式

注意:createreplace后面没有table关键字,insert后面没有intovalues关键字

l参数:使用sqlplus参数,跟数据库无关。这些参数可以在sqlplus里,show参数名来查看具体值。

a)arraysize:一个批次传输的数据量,默认值是100,可以在sqlplus里,使用show arraysize查看。

b)copycommit:定义多少批次自动commitcopycommit*arraysize=一次commit的数据量,这个乘积对事务大小有影响。默认是0,就是所有数据加载完毕才做一次commit,建议使用非0数字。

c)long:可以传输long数据的长度,默认值是20000

destination_table [(column, column, column, ...)] 目标表的列名,不指定的话,那么使用后面查询语句的列名

举例:

SQL> copy fromsf/sf@skyreadtosf/sf@skyreadcreate tb1 using select * from am_role;

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)

CPY-0012: Datatype cannot be copied

SQL> desc am_role
Name Null? Type
----------------------------------------- -------- ----------------------------
ROLEID NOT NULL VARCHAR2(32 CHAR)
ROLENAME VARCHAR2(255 CHAR)
TAG VARCHAR2(255 CHAR)
MEMO VARCHAR2(2000 CHAR)
UPDATEUSER VARCHAR2(50 CHAR)
UPDATEDATE TIMESTAMP(6)
FAST VARCHAR2(1 CHAR)

看到数据类型不能匹配,这里有TIMESTAMP

SQL> select count(*) from A_USER_CONSUME;

COUNT(*)
----------
8632

SQL> desc A_USER_CONSUME
Name Null? Type
----------------------------------------- -------- ----------------------------
IMSI NOT NULL VARCHAR2(30)
DAYS NUMBER(38)
DIRECT_CONSUME NUMBER
MO_CONSUME NUMBER

SQL> copy fromsf/sf@skyreadtosf/sf@skyreadcreate tb1 using select * from A_USER_CONSUME;

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table TB1 created.

8632 rows selected fromsf@skyread.
8632 rows inserted into TB1.
8632 rows committed into TB1 atsf@skyread.

SQL> select count(*) from tb1;

COUNT(*)
----------
8632

注意这里from 和to 最少要指定一个,如果不写,那么默认在当前schema下,一定注意这里create后面没有table关键字,是直接跟表名的

oracle这里用copy的好处是比较灵活,当然这里和create table ... as select ...这种效果是一样的,但是如果是追加新的记录insert into ... select ...如果量很大的话,那么会产生大量的redo和undo,对IO有很大影响,这里copy是不生成undo信息,当然效果会好一些,实际情况用copy还是比较少的,这里只是了解一下oracle有这个功能

另外postgresql 也有copy这个命令,用起来也很灵活,是迁移数据的一个好工具

Syntax:
COPY table_name [ ( column [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ WITH ] ( option [, ...] ) ]

COPY { table_name [ ( column [, ...] ) ] | ( query ) }
TO { 'filename' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]

where option can be one of:

FORMAT format_name
OIDS [ boolean ]
DELIMITER 'delimiter_character'
NULL 'null_string'
HEADER [ boolean ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column [, ...] ) | * }
FORCE_NOT_NULL ( column [, ...] ) |
ENCODING 'encoding_name'

语法也是很简明的,介绍几个常用的选项

DELIMITER :指定分隔符

HEADER:声明文件包含一个头标识,包含字段名称

postgres=# copy t1 to '/home/postgres/t1.sql';
COPY 5

postgres=# copy t1 from '/home/postgres/t1.sql';
COPY 5

postgres=# select count(*) from t1;
count
-------
10
(1 row)

可以看到这里多了5行

postgres=# copy shoelace_log to '/home/postgres/shoelace_log.sql' DELIMITER ':';

1:apple

导出为CVS格式:

postgres=#copy t1 to '/home/postgres/t1.csv' csv header;

这里with写可不写

指定需要导出的列:

postgres=#copy t1(a,b) to '/home/postgres/t1.csv' with DELIMITER ':' csv header;

### 数据迁移工具解决方案 在 OraclePostgreSQL 的数据迁移过程中,存在多种工具和方法可以实现高效的数据导入导出和 ETL 处理。以下是几种常见的 Loader 工具和数据迁移方案: #### 使用专用迁移工具 **ESF Database Migration Toolkit** 是一种支持多种数据库迁移的工具,包括 OraclePostgreSQL 的迁移。该工具可以处理表结构的迁移,并支持数据的批量导入。尽管其试用版存在字段替换的限制,但仍可通过 PL/SQL Developer 等辅助工具完成完整的迁移流程 [^3]。 #### 使用 ETL 工具进行数据转换 **Pentaho Data Integrator (Kettle)** 提供了 PostgreSQL 的批量加载功能,通过 `COPY DATA FROM STDIN` 命令将数据流直接导入 PostgreSQL,兼顾了性能和灵活性,适用于复杂的 ETL 场景 [^5]。 #### 使用命令行工具和文件导入 对于大批量数据的迁移,推荐使用 Oracle 的外部表技术结合 SQL*Loader 工具进行数据导入。该方法通过定义外部表结构,将文本数据加载到数据库中,适用于异构平台的数据迁移需求 [^4]。 此外,PostgreSQL 提供了 `COPY` 命令和 `psql \copy` 命令,支持从文件导入数据到表中。该方式性能优越,适合大数据量的导入任务。 示例代码如下: ```sql -- 使用 COPY 命令导入数据 COPY table_name FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER; -- 使用 psql 的 \copy 命令(无需超级用户权限) \copy table_name FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER ``` #### 文件导出导入方式对比 对于 Oracle 数据迁移到 PostgreSQL 的场景,建议采用文件导出后导入的方式。相比直接导出 SQL 插入语句,使用 `sqlldr` 或类似工具导入数据文件能避免 CLOB 插入问题和 SQL 语句长度限制 [^2]。 --- ### 总结 OraclePostgreSQL 的数据迁移可以通过多种方式实现,包括专用迁移工具、ETL 工具、命令行工具以及文件导入导出。选择合适的工具和方法可以有效提升迁移效率并确保数据完整性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值