移动数据的通用架构



数据泵data pump(impdp, expdp),借助DBMS_DATAPUMP存储过程,可以进行表的导出导入,行记录的导出导入,表空间的导出导入或者整个schema的导出导入。使用数据泵可以在两个不同版本的数据库或者两个异构的数据库之间进行数据的传递。

SQL*Loader(sqlldr),可以从外部读取文本,通过OracleLoader编译器,将本文加载到表里面。也支持外部表,将外部数据直接加载到Oracle数据库的内存当中。

数据泵(用于Oracle数据库之间传递数据)

在数据库之间移动数据非常好用的工具,使用expdp对数据进行导出, 使用impdp对数据进行导入。

expdp将表里每一行数据读取出来,使用固定的分隔符,写入到操作系统的文件中,例如导出一个一万行数据的表,就需要写一万行数据。数据泵可以并行, 可以将这1万条数据同时写到10个文件中,可以提高数据导出的速度。impdp在导入的时候,也可以开启10个并行读,来提高导入的效率。

expdp在导出的时候,有个Master表会记录他的进度,如果中断了,可以继续进行导出。

导出并不是备份的一种方式,但是做备份的时候,可以把重要的表进行导出。

数据泵的好处

  • 可以对敏感的对象或行记录进行导出。
  • 可以排除数据库的一些对象。
  • 可以并行操作。
  • 可以跨网络进行导出。
  • 导入的时候可以重新分配对象的名字(remapping)。
  • 可以只导表结构而不导数据。
  • 导出时可以选择压缩和加密
  • 可以导出CLOB字段。

实作: 使用itleo导出hr.employees表

pdbadmin登录,创建directory对象,并给itleo授予读写权限。
SQL> conn pdbadmin/oracle@pdb1
Connected. SQL> create or replace directory mydir as '/home/oracle';
Directory created. 退出sqlplus到命令行
[oracle@ol7-19c ~]$ expdp itleo/oracle@pdb1 directory=mydir dumpfile=mydum.dmp tables='test001' Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "ITLEO"."SYS_EXPORT_TABLE_01": itleo/********@pdb1 directory=mydir dumpfile=mydum.dmp tables=test001
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "ITLEO"."TEST001" 112.0 MB 16777216 rows
Master table "ITLEO"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for ITLEO.SYS_EXPORT_TABLE_01 is:
/home/oracle/mydum.dmp
Job "ITLEO"."SYS_EXPORT_TABLE_01" successfully completed at Sun Feb 5 12:35:05 2023 elapsed 0 00:00:13 ******************************************************************************
Dump file set for ITLEO.SYS_EXPORT_TABLE_01 is:
/home/oracle/mydump.dump
Job "ITLEO"."SYS_EXPORT_TABLE_01" successfully completed at Sun Feb 5 12:18:29 2023 elapsed 0 00:00:17

实作: 导入刚才导出的dmp文件,因为数据表重名,remap另外一个名字。

[oracle@ol7-19c ~]$ impdp itleo/oracle@pdb1 directory=mydir dumpfile=mydum.dmp remap_table=test001:test002

Import: Release 19.0.0.0.0 - Production on Sun Feb 5 12:36:31 2023
Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "ITLEO"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "ITLEO"."SYS_IMPORT_FULL_01": itleo/********@pdb1 directory=mydir dumpfile=mydum.dmp remap_table=test001:test002
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "ITLEO"."TEST002" 112.0 MB 16777216 rows
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "ITLEO"."SYS_IMPORT_FULL_01" successfully completed at Sun Feb 5 12:36:44 2023 elapsed 0 00:00:12 登录数据库进行验证
[oracle@ol7-19c ~]$ sqlplus itleo/oracle@pdb1
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0 SQL> select table_name from user_tables; TABLE_NAME
---------------
TEST001
TEST002

SQL*Loader(用于非Oracle数据库传递数据)

Input data files, 从其他数据库导出的文本文件

control file, 告诉SQLLoader是用什么样的格式来读取文本文件,分隔符是什么,字段类型。

通过控制文件,将数据文件的内容读到SQLLoader的编译器中,符合条件的插入到数据库。不符合条件的放到bad file中。如果bad file超过一定的行数,剩余的文本都不在处理,都放到discard文件中。

控制文件可以编写的内容

LOAD DATA      #告诉SLQLoader要加载数据
INFILE '数据文件完整路径' #告诉SLQLoader 数据文件路径
BADFILE 'bad file的完整路径' #告诉SLQLoader bad文件路径
DISCARDFILE 'discard文件的完整路径' #告诉SLQLoader discard文件路径
APPEND #默认加载时清除表中的数据,使用这个子句可以让SQLLoader不清除现有数据
INTO TABLE 数据表名 #告诉SLQLoader插入到哪个表
TRAILING NULLCOLS #数据文件中缺少某个字段的内容,则当作空值。
(
字段定义,
字段定义,
...
字段定义
)

SQLLoader加载有两种方式,传统加载和直接路径加载(Direct Path load)。

传统加载可以加载蔟表(Cluster),直接路径加载不可以。

传统加载允许加载过程中其他用户修改表,直接路径加载会阻塞对表的修改。

传统加载会插入每一行时进行索引的维护,直接路径加载会在加载结束后merge索引。

传统加载会触发所有的约束,直接路径加载只会触发主键约束、唯一约束和非空约束。

导入的命令最后加上direct=y 则为直接路径加载。

[oracle@ol7-19c ~]$ sqlldr itleo/edppde_7500@pdb1 control='/home/oracle/sqlldr.ctl' direct=y
Path used: Direct
Load completed - logical record count 6. Table TEST_LOADER:
5 Rows successfully loaded. Check the log file:
sqlldr.log
for more information about the load.

实作: SQL*Loader导入数据

itleo登录到pdb1中,创建一个测试数据库test_loader
SQL> create table test_loader (a1 number, a2 varchar2(30), a3 date, a4 number);
Table created. 在命令行工具中,在/home/oracle中创建一个控制文件sqlldr.txt [oracle@ol7-19c ~]$ cat sqlldr.txt
load data
infile '/home/oracle/data.txt' #数据文件路径
into table test_loader #控制文件路径
replace #如果重复则替换
fields terminated by ',' #字段之间使用,分割
trailing nullcols #如果空值则插入null
(a1, a2, a3 "to_date(:a3, 'yyyy-mm-dd hh24:mi:ss')",a4) #四个值分别插入表的a1-a4字段,a3字段进行数据转换 在/home/oracle中创建一个控制文件data.txt
[oracle@ol7-19c ~]$ cat data.txt
20,Ryan Smith,1980-01-28 00:00:00,800
30,Allen Wheels,1981-01-20 00:00:00,1600
30,Leo Zhang,1981-04-24 10:00:00,2400
a1,,,,, #数据类型不对,字段不匹配
30,Allen Wheels,1981-01-20 00:00:00,1600,111 #多一个字段
20,Ryan Smith,1980-01-28 00:00:00 #少一个字段 导入SQL*Loader
[oracle@ol7-19c ~]$ sqlldr itleo/edppde_7500@pdb1 control='/home/oracle/sqlldr.txt' bad='/home/oracle/sqlbad.txt' log='/home/oracle/sqllog.txt' SQL*Loader: Release 19.0.0.0.0 - Production on Sun Feb 5 13:03:00 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. Path used: Conventional
Commit point reached - logical record count 6 Table TEST_LOADER:
5 Rows successfully loaded. Check the log file:
/home/oracle/sqllog.txt
for more information about the load. 多一列和少一列的数据都导入了,只有“数据类型不对,字段不匹配”的那一行没有导入。

SQL*Loader Express

SQLLoader Express不需要控制文件,指定数据表名.dat向数据表插入数据。

表的列只能是标量类型(character, number, datetime)。

SQLLoader Express使用表的列名来定义导入的数据类型。

实作: 将test005.dat中的数据插入到itleo.test005数据库。

[oracle@ol7-19c ~]$ cat test005.dat
20,Ryan Smith,800
[oracle@ol7-19c ~]$ sqlldr itleo/edppde_7500@pdb1 table='test005' SQL*Loader: Release 19.0.0.0.0 - Production on Sun Feb 5 14:58:07 2023
Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. Express Mode Load, Table: TEST005
Path used: External Table, DEGREE_OF_PARALLELISM=AUTO Table TEST005:
1 Row successfully loaded. Check the log files:
test005.log
test005_%p.log_xt
for more information about the load.

外部表



外部表通过SQLLoader将外部的txt转换到内存中的表,这个表可以再次处理插入到物理表中持久化。

外部表也可以借助数据泵的导出和导入二进制数据文件,把数据通过Oracle引擎处理完,再把结果集写入到二进制数据文件中。

实作: 创建一个外部表

  • 创建/home/oracle/sqlldr目录,用来存放外部表文件。

  • 在sqlplus中创建一个只想外部表目录的directory

SQL> create or replace directory ext_tab as '/home/oracle/sqlldr';
Directory created. 因为使用的itleo创建的,所以不需要给自己创建的directory读写权限。
以下语句不需要运行:
grant read,write to directory ext_tab to itleo;
  • 在/home/oracle/sqlldr中创建foo.dat,并写入外部表的数据。
[oracle@ol7-19c sqlldr]$ cat foo.dat
10,Leo,Zhang,1000
20,Winston,Wang,1000
  • 数据库中创建外部表
create table ext_emp_table (id number, first_name varchar2(20), last_name varchar2(20), salary number)
organization external
(
type oracle_loader
default directory ext_tab
access parameters (fields terminated by ',')
location ('foo.dat')
) reject limit 200; SQL> select * from ext_emp_table; ID FIRST_NAME LAST_NAME SALARY
---------- -------------------- -------------------- ----------
10 Leo Zhang 1000
20 Winston Wang 1000

使用数据泵将结果集导出放到外部文件中,每次访问外部表,都回到外部文件访问数据。

如果外部文件不存在了,就无法查询数据了。

实作: 使用oracle_datapump创建外部表

create table ext_emp_query_result (employee_id, salary)
organization external
(
type oracle_datapump
default directory ext_tab
location ('empl.exp')
)
parallel
as
select employee_id, salary from hr.employees; SQL> select * from ext_emp_query_result where rownum<=5;
EMPLOYEE_ID SALARY
----------- ----------
198 2600
199 2600
200 4400
201 13000
202 6000

[Oracle19C 数据库管理] 加载和传输数据库的更多相关文章

  1. SQLAlchemy加载数据到数据库

    SQLAlchemy加载数据到数据库 最近在研究基于知识图谱的问答系统,想要参考网上分享的关于NLPCC 2016 KBQA任务的经验帖,自己实现一个原型.不少博客都有提到,nlpcc-kbqa训练数 ...

  2. ASP.NET-【Excel】-将Excel中的数据批量加载到SQLserver数据库

    用到了一个SqlBulkCopy的类 核心代码分析 代码我还没有测试过 string excelConnectionString = string.Format("Provider=Micr ...

  3. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  4. JDBC加载数据库驱动的方式

    JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...

  5. (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...

  6. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  7. SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  8. JDBC:加载数据库驱动、连接数据库(详细讲解)

    加载数据库驱动: 1)由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构: 2)JDBC将整个数据库驱动器在底层抽象成 ...

  9. PHP+MySQL+Easyui tree菜单从后台加载json数据(一)

    实现功能:从数据库加载出所有的数据库名,相应的数据库加载对应的数据库表名 原理:(首先看一下参考手册的内容) 异步加载Tree tree 支持内置的异步加载模式,用户创建一个空的tree,然后定义一个 ...

  10. EF 延迟加载和预先加载

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨延迟加载和预先加载 Entity Frame ...

随机推荐

  1. 从 B 站出发,用 Chrome devTools performance 分析页面如何渲染

    页面是如何渲染的?通常会得到"解析 HTML.css 合成 Render Tree,就可以渲染了"的回答.但是具体都做了些什么,却很少有人细说,我们今天就从 Chrome 的性能工 ...

  2. select省市联动+对应经销商、自定义箭头

    HTML: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

  3. Express 项目 Cookie 不能保存在 Application 中

    在前后端分离项目中,因为跨域策略,所以 Cookie 不能存储在浏览器的 Application 中.只能在请求的响应头处看到有 Set-Cookie: 1️⃣前端发送请求添加 withCredent ...

  4. 解读C#编程中最容易忽略7种编写习惯!

    编程时犯错是必然的,我们来解读一下编程中最容出现的错误 1.拼接字符串 在C#编程中,字符串类型的处理是比较容易出错的地方,在.NET Framework中,字符串是一个不可变的类型,当一个字符串被修 ...

  5. LOJ3075 「2019 集训队互测 Day 3」组合数求和

    题意: 令 \(f(j)=\sum\limits_{i=0}^{n-1}\dbinom{id}{j}\) ,对于 \(0\le j <m\) ,分别求出 \(f(j)\) .答案对 \(M\) ...

  6. CF1137F Matches Are Not a Child's Play 题解

    以最后被删去的点为根,这样子不会存在从父亲然后删掉某个点,儿子的删除顺序一定比父亲前. 记每个点子树中的最大值为 \(f_x\),那么一个点的排名,首先就需要加上 \(<f_x\) 的所有值,记 ...

  7. lg8935 [JRKSJ R7] 茎 题解

    由于标签内包含背包和树形dp,所以考虑用背包dp和树形dp求解. 考虑每次合并2个连通块(一个包含根节点),设\(f_{i,j}\)表示\(i\)子树内,操作\(j\)次的方案数(未合并连通块),设\ ...

  8. Java 8 在使用内存爆了以后会发生什么?hs_err_pid 日志如何看?

    问题: Java进程被终止了,然后在应用的目录中发现了hs_err_pid日志. 运维反馈,结论是内存不够了 之前一直运行没有问题,没什么新增访问量,为什么会内存溢出,进程被killer掉类? 1.第 ...

  9. vue框架4

    购物车案例 v-model进阶 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  10. docker swarm集群安装使用

    1.安装master docker swarm init --advertise-addr 10.98.10.186 Swarm initialized: current node (qemrm3oq ...