深入理解Data Pump:功能与操作全解析
1. 数据泵基本操作
数据泵(Data Pump)在数据库管理中扮演着重要角色,它能高效地进行数据的导出和导入操作。以下是一些常见操作的详细介绍:
-
全量导入验证
:
bash
$ sqlplus test/test@pdborcl
SQL> SELECT * FROM test.employee;
执行上述命令后,若能成功查询到数据,说明导入操作成功。示例查询结果如下:
| EMP_ID | EMP_NAME | EMP_SSN | EMP_DOB |
| ------ | ------------------ | --------- | --------- |
| 101 | Francisco Munoz | 123456789 | 30 - JUN - 73 |
| 102 | Gonzalo Munoz | 234567890 | 02 - OCT - 96 |
| 103 | Evelyn Aghemio | 659812831 | 02 - OCT - 79 |
-
表的导出与导入
:
1.
导出表
:使用
expdp
命令导出指定表,示例如下:
bash
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=employee.dmp logfile=employee.log tables=test.employee
2.
删除表
:在数据库中删除指定表:
sql
SQL> DROP TABLE test.employee PURGE;
3.
导入表
:使用
impdp
命令从导出文件中导入表:
bash
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=employee.dmp logfile=imp_employee.log
4.
验证表导入
:再次查询表数据,验证导入是否成功:
sql
SQL> SELECT * FROM test.employee;
2. 数据库/可插拔数据库的导出与导入
对于数据库或可插拔数据库的导出与导入,可按以下步骤操作:
-
导出数据库
:使用
expdp
命令进行全量导出:
bash
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=full_pdborcl.dmp logfile=full_pdborcl.log full=y
-
关闭并删除可插拔数据库
:
bash
$ sqlplus / as sysdba
SQL> ALTER PLUGGABLE DATABASE pdborcl CLOSE;
SQL> DROP PLUGGABLE DATABASE pdborcl INCLUDING DATAFILES;
-
创建新的可插拔数据库
:
sql
SQL> CREATE PLUGGABLE DATABASE pdborcl ADMIN USER pdb_admin IDENTIFIED BY oracle
2 STORAGE (MAXSIZE 2G MAX_SHARED_TEMP_SIZE 100M)
3 DEFAULT TABLESPACE Users
4 DATAFILE
'/u01/app/oracle/oradata/orcl/pdborcl/datafile1.dbff' SIZE 250M
AUTOEXTEND ON
5 PATH_PREFIX = '/u01/app/oracle/oradata/orcl/pdborcl/'
6 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/orcl/pdbseed/',
'/u01/app/oracle/oradata/orcl/pdborcl/');
SQL> ALTER PLUGGABLE DATABASE pdborcl OPEN;
-
创建数据泵环境
:
sql
SQL> ALTER SESSION SET CONTAINER=pdborcl;
SQL> CREATE USER fcomunoz IDENTIFIED BY alvarez DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
SQL> GRANT CREATE SESSION, RESOURCE, DATAPUMP_EXP_FULL_DATABASE, DATAPUMP_IMP_FULL_DATABASE TO fcomunoz;
SQL> CREATE OR REPLACE DIRECTORY datapump AS '/u01/db_backups';
SQL> GRANT READ, WRITE ON DIRECTORY datapump to fcomunoz;
-
导入数据库
:
bash
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=full_pdborcl.dmp logfile=imp_full_pdborcl.log
3. 使用导出操作估算空间
数据泵可以通过
ESTIMATE_ONLY
参数估算模式导出所需的磁盘空间。具体操作步骤如下:
$ expdp fcomunoz/alvarez@pdborcl directory=datapump schemas=test estimate_only=y logfile=est_test.log
执行上述命令后,数据泵会使用
BLOCKS
方法进行估算。示例输出显示,估算
TEST
模式下的
EMPLOYEE
表需要 64 KB 空间,总估算空间也为 64 KB。
4. 并行全量数据库导出与交互式命令模式
数据泵的并行选项可以显著提高导出和导入的速度。以下是相关操作介绍:
-
并行导出数据库
:使用
PARALLEL
参数指定并行线程数,并结合
%U
通配符创建多个转储文件:
bash
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=full_%U.dmp parallel=4 logfile=full.log full=y
与普通导出相比,并行导出能节省大量时间。
-
交互式命令模式
:在导出或导入过程中,可以使用交互式命令模式对作业进行管理。例如,启动一个带有作业名的导出作业:
bash
$ expdp fcomunoz/alvarez@pdborcl dumpfile=full2_%U.dmp filesize=5g parallel=4 logfile=imp_full2.log job_name=expfull full=y directory=datapump
按下
Ctrl + C
进入交互式命令模式,可执行以下操作:
-
停止作业
:
bash
Export> STOP_JOB=immediate
-
重新启动作业
:
bash
$ expdp fcomunoz/alvarez@pdborcl attach=expfull
Export> START_JOB
-
更改并行级别
:
bash
Export> PARALLEL=10
-
显示作业状态
:
bash
Export> STATUS=15
-
返回客户端输出模式
:
bash
Export> CONTINUE_CLIENT
| 命令 | 描述 | 导出 | 导入 |
|---|---|---|---|
| ADD_FILE | 添加转储文件到转储文件集 | 否 | 是 |
| CONTINUE_CLIENT | 返回日志模式。若作业空闲则重启 | 否 | 否 |
| EXIT_CLIENT | 退出客户端会话并让作业继续运行 | 否 | 否 |
| FILESIZE | 后续 ADD_FILE 命令的默认文件大小(字节) | 否 | 是 |
| HELP | 总结交互式命令 | 否 | 否 |
| KILL_JOB | 分离并删除作业 | 否 | 否 |
| PARALLEL | 更改当前作业的活动工作线程数 | 否 | 否 |
| REUSE_DUMPFILES | 若目标转储文件存在则覆盖 | 否 | 是 |
| START_JOB | 启动或恢复当前作业 | 否 | 否 |
| STATUS | 显示作业运行状态(秒为单位)。默认 0 表示有可用状态时显示 | 否 | 否 |
| STOP_JOB | 有序关闭作业执行并退出客户端;使用 STOP_JOB = IMMEDIATE 可立即关闭数据泵作业,后续可使用 START_JOB 重启 | 否 | 否 |
以下是交互式命令模式操作的流程图:
graph TD;
A[启动导出作业] --> B[按下 Ctrl + C 进入交互式模式];
B --> C{选择命令};
C -->|STOP_JOB=immediate| D[停止作业];
C -->|START_JOB| E[启动作业];
C -->|PARALLEL=10| F[更改并行级别];
C -->|STATUS=15| G[显示作业状态];
C -->|CONTINUE_CLIENT| H[返回客户端输出模式];
深入理解Data Pump:功能与操作全解析
5. 仅导入表的元数据
CONTENT
参数可在导出或导入操作时过滤数据和元数据,其取值及含义如下:
-
ALL
:加载表行数据,并重新创建对象定义(元数据)。
-
DATA_ONLY
:仅加载表行数据,不重新创建数据库对象定义(元数据)。
-
METADATA_ONLY
:重新创建数据库对象定义(元数据),但不加载任何数据。
具体操作步骤如下:
1. 导出整个
test
模式:
bash
$ expdp fcomunoz/alvarez@pdborcl directory=datapump schemas=test dumpfile=shema_test.dmp logfile=schema_test.log
2. 仅导入
test
模式的元数据到
pdborcl2
:
bash
$ impdp fcomunoz/alvarez@pdborcl2 directory=datapump dumpfile=shema_test.dmp logfile=imp_schema_test.log content=metadata_only table_exists_action=replace
TABLE_EXISTS_ACTION
参数用于指定在目标数据库中对象已存在时的处理方式,可选值如下:
| 参数值 | 描述 |
| ---- | ---- |
| APPEND | 加载源数据行,保留现有行不变 |
| SKIP | 保持表不变,继续处理下一个对象(若
CONTENT
参数设置为
DATA_ONLY
,此选项无效) |
| TRUNCATE | 删除现有行,然后加载源数据行 |
| REPLACE | 删除现有表,重新创建并加载数据 |
6. 将视图导出为表
在 Oracle 12c 中,数据泵引入了将视图导出为表的功能。操作步骤如下:
1. 创建视图:
bash
$ sqlplus fcomunoz/alvarez@pdborcl
SQL> CREATE VIEW test.employee_view AS
2 SELECT *
3 FROM employee;
SQL> SELECT * FROM test.employee_view;
SQL> exit
2. 导出视图为表:
bash
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=employee_view.dmp logfile=employee_view.log views_as_tables=test.employee_view
3. 验证导出结果:
bash
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=employee_view.dmp sqlfile=employee_view.sql
$ cat employee_view.sql
查看
employee_view.sql
文件内容,可发现创建的是表而非视图,示例如下:
-- CONNECT FCOMUNOZ
ALTER SESSION SET EVENTS '10150 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10904 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '25475 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10407 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10851 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '22830 TRACE NAME CONTEXT FOREVER, LEVEL 192 ';
-- new object type path: TABLE_EXPORT/VIEWS_AS_TABLES/TABLE
CREATE TABLE "TEST"."EMPLOYEE_VIEW"
( "EMP_ID" NUMBER(10,0) NOT NULL ENABLE,
"EMP_NAME" VARCHAR2(30 BYTE),
"EMP_SSN" VARCHAR2(9 BYTE),
"EMP_DOB" DATE
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE "USERS" ;
7. 通过网络链接导入数据
使用数据泵可通过数据库链接直接将元数据和数据导入目标数据库,主要优点如下:
- 不生成转储文件,无需复制转储文件。
- 无需执行导出命令。
- 直接从源导出并立即导入目标。
操作步骤如下:
1. 创建数据库链接:
bash
sqlplus fcomunoz/alvarez@pdborcl2
SQL> CREATE DATABASE LINK pdborcl_lnk CONNECT TO fcomunoz IDENTIFIED by alvarez USING 'pdborcl';
2. 验证数据库链接:
sql
SQL> SELECT * FROM employee@pdborcl_lnk;
3. 检查目标环境中表是否存在:
sql
SQL> SELECT * FROM test.employee;
4. 通过网络链接导入数据:
bash
$ impdp fcomunoz/alvarez@pdborcl2 schemas=test directory=datapump network_link=pdborcl_lnk logfile=pdborcl_lnk.log
5. 验证数据导入:
bash
$ sqlplus fcomunoz/alvarez@pdborcl2
SQL> SELECT * FROM test.employee;
需要注意的是,此方法不适用于
LONG/LONG RAW
和包含嵌套表的对象类型。导入操作必须由具有
DATAPUMP_IMP_FULL_DATABASE
角色的目标数据库用户执行,数据库链接必须连接到具有
DATAPUMP_EXP_FULL_DATABASE
角色的源数据库用户,且源数据库用户不能具有
SYSDBA
系统权限。若数据库链接是连接用户数据库链接,目标数据库用户也不能具有
SYSDBA
系统权限。
以下是通过网络链接导入数据的流程图:
graph TD;
A[创建数据库链接] --> B[验证数据库链接];
B --> C[检查目标表是否存在];
C --> D[通过网络链接导入数据];
D --> E[验证数据导入];
综上所述,数据泵提供了丰富的功能和灵活的操作方式,可满足不同场景下的数据导出和导入需求。通过合理使用这些功能,可以提高数据库管理的效率和灵活性。
超级会员免费看
650

被折叠的 条评论
为什么被折叠?



