在 Oracle 数据库中,通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from
A@dblink where ...,或 insert into B select * from A@dblink
where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. Sql Loader(sqlldr) 导入数据,效果比起逐条 insert 来很明显。
方法一
操作步骤:
用pl/sql developer登陆Oracle,选择工具->Export Tables...->选择需要的表->Export到指定目录
打开cmd命令窗口输入下面语句
imp 用户名/密码@数据库实例名 file=dmp文件存在的目录 log=日志文件存在的目录fromuser=用户名 touser=用户名 commit=y
如:imp system/system@ring218 file=D:\dbscript\usdp\usdp_212.dmp log=D:\imp_usdp_sh.log fromuser=usdp604 touser=usdp604 commit=y
方法二:
Sql Loader导入
eg:
创建一个控制文件(.ctl):
OPTIONS (skip=1,rows=128,errors=100000) --sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行
LOAD DATA
INFILE "users_data.csv" --要导入的文件,可以用多个infile也可以用 * 表示所有
BADFILE "路径" --指定BAD文件存放的路径
insert/append/replace/truncate --默认为insert
INTO TABLE users
when 字段2<>'8' --可以用 when 子句选择导入符合条件的记录
CHARACTER SET utf8 FIELDS TERMINATED BY ','--字符编码
Fields terminated by "," --数据中每行记录用 "," 分隔
--注意:请加上下面一行句子
Optionally enclosed by '"' --数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时
trailing nullcols
(
字段1 integer,--可以为字段指定类型
字段2 "user_seq.nextval",--直接取序列的下一值
字段3 FILLER,--跳过此字段
字段4 "'Hi '||upper(:字段4)",--用SQL函数或运算对数据进行加工处理
字段5 terminated by ",",NULLIF(字段5='NULL')--为列单独指定分隔符
字段6 DATE "YYYY-MM-DD HH24:MI:SS" NULLIF(字段6="NULL") --当字段为"NULL"时就是 NULL),
字段7 char(1000)--控制文件中的字段默认为char256,超过256需要指定长度,否则Log会报数据文件的字段超出最大长度
注:
1) insert --为缺省方式,在数据装载开始时要求表为空[/color]
2) append --在表中追加新记录[/color]
3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
详细参数说明,要着重关注以下几个参数:
userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
----------------------------------------------------------------------log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述
SQL *Loader 的性能与并发操作
1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS 参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)
2)常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志(是否要 alter table table1 nologging 呢?)。这个选项只能和 direct 一起使用。
4) 对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务.
sqlldr userid=/ control=result1.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
当加载大量数据时(大约超过10GB),最好抑制日志的产生:
SQL>ALTER TABLE RESULTXT nologging;
这样不产生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable, 此选项必须要与DIRECT共同应用。
在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到 1-10G 就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。
1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from
A@dblink where ...,或 insert into B select * from A@dblink
where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. Sql Loader(sqlldr) 导入数据,效果比起逐条 insert 来很明显。
方法一
操作步骤:
用pl/sql developer登陆Oracle,选择工具->Export Tables...->选择需要的表->Export到指定目录
打开cmd命令窗口输入下面语句
imp 用户名/密码@数据库实例名 file=dmp文件存在的目录 log=日志文件存在的目录fromuser=用户名 touser=用户名 commit=y
如:imp system/system@ring218 file=D:\dbscript\usdp\usdp_212.dmp log=D:\imp_usdp_sh.log fromuser=usdp604 touser=usdp604 commit=y
方法二:
Sql Loader导入
eg:
创建一个控制文件(.ctl):
OPTIONS (skip=1,rows=128,errors=100000) --sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行
LOAD DATA
INFILE "users_data.csv" --要导入的文件,可以用多个infile也可以用 * 表示所有
BADFILE "路径" --指定BAD文件存放的路径
insert/append/replace/truncate --默认为insert
INTO TABLE users
when 字段2<>'8' --可以用 when 子句选择导入符合条件的记录
CHARACTER SET utf8 FIELDS TERMINATED BY ','--字符编码
Fields terminated by "," --数据中每行记录用 "," 分隔
--注意:请加上下面一行句子
Optionally enclosed by '"' --数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时
trailing nullcols
(
字段1 integer,--可以为字段指定类型
字段2 "user_seq.nextval",--直接取序列的下一值
字段3 FILLER,--跳过此字段
字段4 "'Hi '||upper(:字段4)",--用SQL函数或运算对数据进行加工处理
字段5 terminated by ",",NULLIF(字段5='NULL')--为列单独指定分隔符
字段6 DATE "YYYY-MM-DD HH24:MI:SS" NULLIF(字段6="NULL") --当字段为"NULL"时就是 NULL),
字段7 char(1000)--控制文件中的字段默认为char256,超过256需要指定长度,否则Log会报数据文件的字段超出最大长度
注:
1) insert --为缺省方式,在数据装载开始时要求表为空[/color]
2) append --在表中追加新记录[/color]
3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
详细参数说明,要着重关注以下几个参数:
userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
----------------------------------------------------------------------log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述
SQL *Loader 的性能与并发操作
1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS 参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)
2)常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志(是否要 alter table table1 nologging 呢?)。这个选项只能和 direct 一起使用。
4) 对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务.
sqlldr userid=/ control=result1.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
当加载大量数据时(大约超过10GB),最好抑制日志的产生:
SQL>ALTER TABLE RESULTXT nologging;
这样不产生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable, 此选项必须要与DIRECT共同应用。
在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到 1-10G 就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。
发表评论
-
ORACLE 手工备份与恢复
2013-10-25 09:50 8631、手工冷备 1.1、在非归档模式下,ORACLE只能 ... -
oracle 分页,oracle 随机数
2012-11-16 17:23 854oracle分页 select * from ( sele ... -
Oracle函数next_day
2012-11-14 17:53 1063--获取date日期的下一个星期weekday; next_d ... -
trunc函数截断日期
2012-11-08 14:26 1292截断日期: 先执行命令:alter session set ... -
复杂的SQL语句
2012-10-25 17:30 931--select 语句中执行判断 select sysdate ... -
oracle 密码永不过期
2012-07-06 11:54 16331. 成功安装ORACLE11g后,默认密码有效期为180天, ... -
ORACLE 错误记录
2012-06-29 17:34 8591. ORACL数据库表空间不够,试图增加表空间,之后进行大量 ... -
关于ORA-01034和ORA-27101的一种解决方法(转)
2012-06-29 17:11 19931 先看oracle的监听和oracle的服务是否都启动了。启 ... -
Oracle导出文件
2012-03-13 11:35 936SET echo off --是否显示脚本中正在 ... -
oracle 备份、还原(导入|导出)
2012-01-10 13:42 819下面介绍的是导入导出的实例。 数据导出: 1 将数据库TE ... -
oracle 启动状态介绍
2011-12-09 15:39 13541、startup nomount 读初始化参数文 ... -
oracle日期时间型timestamp相关学习
2011-09-14 15:12 352811、获取系统时间的语句(ssxff6获取小数点后面六位) se ... -
数据库性能优化
2011-07-12 14:14 882Oracle数据库性能优化 ... -
oracle死锁处理
2011-05-05 12:10 631--1.查看数据库中那些用户产生了锁 select usern ... -
ORACLE sysdate 相加减
2011-04-27 16:01 7914加法 select sysdate,add_months ... -
oracle job(定时任务)
2011-04-27 13:53 18281、创建job 使用Submit()过 ... -
Oracle snapshot (快照)
2011-03-28 16:56 2853--在BMS中创建快照日志 create snapshot l ... -
Oracle bug 汇总
2011-03-28 11:33 990database link --访问database link ... -
oracle游标
2011-03-11 16:05 1349一 游标是什么 游标字面理解就是游动的光标。 用数据库 ... -
oracle 包、方法、存储过程
2011-03-11 15:30 942--定义包 create or replace package ...
相关推荐
介绍如何把txt、csv文件导入oracle数据库表。
工作中有很多数据以txt方式存储,需要导入oracle数据库处理(方便进行计算、统计),因文件较多,不便于手工处理,所以编写此程序以便进行数据导入。已经测试过,可以将数据导入oracle。
oracle导入dmp文件之前要做的工作
oracle 导入dmp文件.docx
oracle 使用sqlplus导入大sql文件,需熟悉linux命令,批量导入sql文件以及导入乱码解决方案
文档中分步骤的详细列举了客户端导入导出dmp文件,sql文件的方法及每段命令的含义,同时包括服务器端导入导出dmp文件的方法,可以修改表空间及用户名称。很好的一份资料
Oracle数据库导入dmp文件
Oracle数据导入dmp文件可以是“某个用户下的数据库”,也可以是“某张表”,这里以导入数据库为例说明: <方法1: 使用客户端Enterprise Manager Console> 1.用SYS用户名,以DBA的身份在ie中登入到数据库(ORACLE...
oracle数据库导入导出DMP文件操作
能够解决oracle导入时表空间不一致问题。不错,已经帮助我好几次了,共享下!
oracle数据库导入.dmp文件的方法 步骤:首先windows+R弹出dos命令窗口。 2.在dos命令窗口输入 imp 用户名/密码@tns名 file=需要导入的文件地址 full=y ignore=y 命令
远程工具连接到 Linux 进行操作,进行 Linux 上 dmp 文件的导入导出。 正文 a. 将用户 system 用户表导出到指定路径 D 盘 exp system/password@SID file=d:/daochu.dmp full=y b. 将用户 system 与 sys 用户的表...
oracle导入导出.txt, 有详细的oracle导入导出命令语句
有关于如何将dbf文件通过PL/SQL导入到oracle数据库中。 自己总结的文档 有空可以看看
NULL 博文链接:https://duqiangcise.iteye.com/blog/734041
用命令导入数据库备份文件,教会你基本的导入导出操作
Oralce导入导出可执行文件,版本是11.2,免去了要安装Oracle的烦恼,可以配合plsql使用,非常方便,大大调高了开发的效率
此方法很简单。我第一次弄就搞定了 1、登录linux,以oracle用户登录如果是root用户登录的,登录后用 su - oracle命令切换成oracle用户
oracle导入txt数据的脚本