Oracle 在两个数据库之间导出导入数据

        没有使用Kettle(PDI)之前,先用原始的方法进行数据的ETL。

        需求:把几个视图,按照某种条件导出数据,导入到Oracle数据库。

一、通过exp和imp命令来处理

        需要具备exp和imp命令的权限,视图用户一般不具备这样的权限。

二、在PLSQL中,用文本导入工具

        查询视图,导出查询结果为CSV

        按照导出的字段,在我的数据库建设一个表,字段定义要跟CSV一致,字段类型可以在PLSQL中看到(单击某一个记录即可)

        点击PLSQL工具中的 文本导入器,选择 CSV,选择数据库用户和表名,点击导入。

       速度比较慢,一个小时才能导入100万条数据左右——这个要看机器的性能,如果是在服务器上的PLSQL上操作,会比较快,最近导入1250万条数据,耗时4个小时,平均一个小时300万条数据。

        20180821遇到一个问题:文本导入器导入CSV文件,本来CSV是有1250条记录,但是怎么操作都仅能导入1130万条记录,把表删除,重建表等等,重新导入,都是到1130万条记录就停止(提示导入完毕)。经过诊断,应该是CSV文件有问题。通过重新导出CSV,再次导入就没有遇到问题。

        20210218遇到问题:文本导入器导入CSV文件,229万条记录,耗时1.5小时,导致oracle连接监听出现问题,最后重启服务器才搞定。

        很多时候,我们面对的CSV文件是不规范的:如果csv文件过大或者不标准,识别csv文件时只能识别出一列或者两列,这个时候需要调整这两个地方:先设定好逗号分隔,然后设定好列数(手动输入一个比较大的值,查看从什么地方之后就变成空的列了,这样就知道一共有多少列)。

什么是CSV

        逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。每个记录由一个或多个字段组成,用逗号分隔。使用逗号作为字段分隔符是此文件格式的名称的来源,因为分隔字符也可以不是逗号,有时也称为字符分隔值。

        CSV广泛用于不同体系结构的应用程序之间交换数据表格信息,解决不兼容数据格式的互通问题,一般按照传输双方既定标准进行格式定义,而其本身并无明确格式标准。

        CSV用逗号分隔字段的基本思想是清楚的,但是当字段数据也可能包含逗号或者甚至嵌入换行符时,该方法变得复杂。 CSV可能无法处理这些字段数据,或者可能会使用引号来包围字段。引用并不能解决所有问题:有些字段可能需要嵌入引号,因此CSV可能包含转义字符或转义序列。

三、在PLSQL中,用SQL文件的形式导入——比较繁杂,不推荐

       select出视图,保存为SQL文件,再用导入工具之SQL插入导入我的数据库。

1.在PL/SQL里面通过select查询一个结果,选择导出为SQL格式,大概1.05G大小。

2. 由于sql文件太大,通过命令窗口导入失败(命令窗口不能插入太大数据)

3.采用SQL*PLUS命令导入,其中SQL*PLUS可执行文件在这里:

E:\app\aganliang\product\12.1.0\dbhome_1\BIN\sqlplus.exe

4.点击导入,出现这个错误:

Ora-00942:table or view does not exist

原因分析:导出的是这个用户的视图,所以导出文件里面包括了视图的名字和默认用户。

所以,需要先创建这个表:USER01.V_ YYJK_WG

create table USER01.V_YYJK_WG (
      SYSTEMID varchar2(50) not null,
      SSXZQHDM varchar2(20),
      SSXZJDDM varchar2(20),     
      XGSJ DATE
)

提示还没有这个用户:USER01

那就创建这个用户:

--创建USER01用户:

CREATE USER PCS_DZK_GZIDENTIFIED BY 123
DEFAULT TABLESPACE"MY_001"    -----表空间名字一定要大写
TEMPORARY TABLESPACE"TEMP"
QUOTA UNLIMITED ON"MY_001";

--赋予权限管理权限

GRANT CREATE SESSION,
CREATE TABLE,
CREATE VIEW,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TRIGGER,
CREATE TYPE,
CREATE INDEXTYPE,
CREATE LIBRARY,
CREATE PUBLIC SYNONYM,
DROP PUBLIC SYNONYM,
ADMINISTER DATABASE TRIGGER,
CREATE OPERATOR
TO USER01;

grant dba to USER01;
grant imp_full_database to USER01;
grant exp_full_databaseto  USER01;
grant connect,resourceto  USER01;

再次点击导入,出现这个界面:

5.一段时间(大概30分钟),出现这个错误:表空间不够?

6.那就给这个用户修改另外一个表空间:

重新创建表空间:MY_002

create tablespace my_002 datafile 'E:\app\aganliang\oradata\GZGA_GIS\DATAFILE\MY_002.DBF' 
size 1024 Mautoextend on next 2000m;

修改USER01的默认表空间
alter user USER01 defaulttablespace MY_002;

7.依然报上面那个错,这个表为啥还是写入表空间MY_001?

暂时不知道原有的情况下,那就给MY_001扩展空间:

增加表空间的数据文件,并允许自动增加

alter tablespace my_001 adddatafile
'E:\app\aganliang\oradata\GZGA_GIS\DATAFILE\MY_001_1.DBF'size
1024M autoextend on next 1000m

8.再次点击导入,导入成功

导入的这个表属于用户USER01,用户的默认表空间是MY_002,但是这个表挂接在表空间MY_001下面,什么原因?

分析:

我们创建用户USER01的语句是:

CREATE USER PCS IDENTIFIED BY 123
DEFAULT TABLESPACE "MY_001"   
TEMPORARY TABLESPACE "TEMP"
QUOTA UNLIMITED ON "MY_001";

虽然后来这样修改:alter user USER01 default tablespace MY_002

但是用户USER01依然QUOTA UNLIMITED ON "MY_001" !!!

Quota的意思是:限制用户对表空间的使用。Unlimited即是无限制,所以,它依然使用表空间MY_001

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页