原文地址:https://oracle-base.com/articles/21c/data-pump-enhancements-21c
原文作者:Tim Hall
目录
设置
在您的可插入数据库中创建一个测试用户。
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba --drop user testuser1 cascade; create user testuser1 identified by testuser1 quota unlimited on users; grant connect, resource to testuser1; grant select_catalog_role to testuser1; Create a new directory object and grant access to the test user.
复制
创建一个新的目录对象并授予测试用户访问权限。
create or replace directory tmp_dir as '/tmp/'; grant read, write on directory tmp_dir to testuser1;
复制
在您的测试架构中创建并填充下表。
conn testuser1/testuser1@//localhost:1521/pdb1 -- drop table t1 purge; create table t1 ( id number generated always as identity, json_data json, constraint ta_pk primary key (id) ); insert into t1 (json_data) values (json('{"fruit":"apple","quantity":10}')); insert into t1 (json_data) values (json('{"fruit":"orange","quantity":20}')); commit;
复制
JSON 数据类型支持
导出和导入实用程序包括对新 JSON 数据类型的支持。
以下示例T1使用expdp实用程序导出表。请记住,该T1表包含一个使用新 JSON 数据类型定义的列。
$ expdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=t1 \ directory=tmp_dir \ dumpfile=t1.dmp \ logfile=expdp_t1.log \ exclude=statistics Export: Release 21.0.0.0.0 - Production on Sun Sep 5 08:41:15 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Starting "TESTUSER1"."SYS_EXPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=t1 directory=tmp_dir dumpfile=t1.dmp logfile=expdp_t1.log exclude=statistics Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/IDENTITY_COLUMN Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . exported "TESTUSER1"."T1" 6.070 KB 2 rows Master table "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded ****************************************************************************** Dump file set for TESTUSER1.SYS_EXPORT_TABLE_01 is: /tmp/t1.dmp Job "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully completed at Sun Sep 5 08:41:45 2021 elapsed 0 00:00:28 $
复制
我们导入转储文件,将表名重新映射到T1_COPY.
$ impdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=t1 \ directory=tmp_dir \ dumpfile=t1.dmp \ logfile=impdp_t1.log \ remap_table=testuser1.t1:t1_copy Import: Release 21.0.0.0.0 - Production on Sun Sep 5 08:46:32 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Master table "TESTUSER1"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "TESTUSER1"."SYS_IMPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=t1 directory=tmp_dir dumpfile=t1.dmp logfile=impdp_t1.log remap_table=testuser1.t1:t1_copy Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "TESTUSER1"."T1_COPY" 6.070 KB 2 rows Processing object type TABLE_EXPORT/TABLE/IDENTITY_COLUMN Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT ORA-31684: Object type CONSTRAINT:"TESTUSER1"."TA_PK" already exists Job "TESTUSER1"."SYS_IMPORT_TABLE_01" completed with 1 error(s) at Sun Sep 5 08:46:39 2021 elapsed 0 00:00:05 $
复制
CHECKSUM、CHECKSUM_ALGORITHM、VERIFY_ONLY 和 VERIFY_CHECKSUM 参数
计算校验和需要时间。转储文件越大,计算校验和所需的工作就越多。
在CHECKSUM和CHECKSUM_ALGORITHM已经添加的参数,以防止转储文件的数据,当他们在其他磁盘上的篡改。如果我们设置了CHECKSUM_ALGORITHM参数,那么CHECKSUM参数默认为yes。如果两者都未设置,则 code>CHECKSUM 参数默认为 no。该CHECKSUM_ALGORITHM参数可以设置为CRC32、SHA256、SHA384或SHA512,默认为SHA256。
在以下示例中,我们启用CHECKSUM,并将 显式设置CHECKSUM_ALGORITHM为模式导出的默认值。
$ expdp testuser1/testuser1@//localhost:1521/pdb1 \ schemas=testuser1 \ directory=tmp_dir \ dumpfile=testuser1.dmp \ logfile=expdp_testuser1.log \ exclude=statistics \ checksum=yes \ checksum_algorithm=SHA256 Export: Release 21.0.0.0.0 - Production on Sun Sep 5 08:58:55 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Starting "TESTUSER1"."SYS_EXPORT_SCHEMA_01": testuser1/********@//localhost:1521/pdb1 schemas=testuser1 directory=tmp_dir dumpfile=testuser1.dmp logfile=expdp_testuser1.log exclude=statistics checksum=yes checksum_algorithm=SHA256 Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA Processing object type SCHEMA_EXPORT/TABLE/TABLE Processing object type SCHEMA_EXPORT/TABLE/COMMENT Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . exported "TESTUSER1"."T1" 6.070 KB 2 rows . . exported "TESTUSER1"."T1_COPY" 6.078 KB 2 rows Master table "TESTUSER1"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded Generating checksums for dump file set ****************************************************************************** Dump file set for TESTUSER1.SYS_EXPORT_SCHEMA_01 is: /tmp/testuser1.dmp Job "TESTUSER1"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Sep 5 08:59:38 2021 elapsed 0 00:00:41 $
复制
我们可以使用VERIFY_ONLY参数验证转储文件的校验和。
$ impdp testuser1/testuser1@//localhost:1521/pdb1 \ directory=tmp_dir \ dumpfile=testuser1.dmp \ verify_only=yes Import: Release 21.0.0.0.0 - Production on Sun Sep 5 09:10:55 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Verifying dump file checksums Master table "TESTUSER1"."SYS_IMPORT_FULL_01" successfully loaded/unloaded dump file set is complete verified checksum for dump file "/tmp/testuser1.dmp" dump file set is consistent Job "TESTUSER1"."SYS_IMPORT_FULL_01" successfully completed at Sun Sep 5 09:10:57 2021 elapsed 0 00:00:01 $
复制
我们VERIFY_CHECKSUM在导入过程中使用该参数来验证校验和。如果验证失败,则不会进行导入。如果我们不使用该VERIFY_CHECKSUM参数,即使校验和不正确,导入也会继续。
$ impdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=t1 \ directory=tmp_dir \ dumpfile=testuser1.dmp \ logfile=impdp_t1_copy_again.log \ remap_table=testuser1.t1:t1_copy_again \ verify_checksum=yes Import: Release 21.0.0.0.0 - Production on Sun Sep 5 09:16:24 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Verifying dump file checksums Master table "TESTUSER1"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "TESTUSER1"."SYS_IMPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=t1 directory=tmp_dir dumpfile=testuser1.dmp logfile=impdp_t1_copy_again.log remap_table=testuser1.t1:t1_copy_again verify_checksum=yes Processing object type SCHEMA_EXPORT/TABLE/TABLE Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA . . imported "TESTUSER1"."T1_COPY_AGAIN" 6.070 KB 2 rows Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT ORA-31684: Object type CONSTRAINT:"TESTUSER1"."TA_PK" already exists Job "TESTUSER1"."SYS_IMPORT_TABLE_01" completed with 1 error(s) at Sun Sep 5 09:16:30 2021 elapsed 0 00:00:04 $
复制
INCLUDE 和 EXCLUDE 在同一操作中
在Oracle数据库21c中,INCLUDE并且EXCLUDE参数可以是相同的命令的一部分。在以前的版本中INCLUDE,EXCLUDE参数是互斥的。
以下示例在单个命令中组合了INCLUDE和EXCLUDE参数。我们必须为命令行转义一些引号。
$ expdp testuser1/testuser1@//localhost:1521/pdb1 \ schemas=testuser1 \ directory=tmp_dir \ dumpfile=testuser1.dmp \ logfile=expdp_testuser1.log \ include="table:\"in ('T1')\"" \ exclude="table:\"in ('T1_COPY','T1_COPY_AGAIN')\"" \ exclude=statistics Export: Release 21.0.0.0.0 - Production on Sun Sep 5 10:54:03 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Starting "TESTUSER1"."SYS_EXPORT_SCHEMA_01": testuser1/********@//localhost:1521/pdb1 schemas=testuser1 directory=tmp_dir dumpfile=testuser1.dmp logfile=expdp_testuser1.log include=table:"in ('T1')" exclude=table:"in ('T1_COPY','T1_COPY_AGAIN')" exclude=statistics Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA Processing object type SCHEMA_EXPORT/TABLE/TABLE Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . exported "TESTUSER1"."T1" 6.070 KB 2 rows Master table "TESTUSER1"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded ****************************************************************************** Dump file set for TESTUSER1.SYS_EXPORT_SCHEMA_01 is: /tmp/testuser1.dmp Job "TESTUSER1"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Sep 5 10:54:31 2021 elapsed 0 00:00:27 $
复制
索引压缩
在 Oracle 数据库 21c 中,我们可以选择在导入时使用TRANSFORM参数和INDEX_COMPRESSION_CLAUSE.
创建一个带有一些索引的测试表。
conn testuser1/testuser1@//localhost:1521/pdb1 -- drop table t2 purge; create table t2 as select level as id, 'Description for ' || level as col1, case mod(level, 2) when 0 then 'one' else 'two' end as col2, trunc(dbms_random.value(0,10)) as col3, trunc(dbms_random.value(0,20)) as col4 from dual connect by level <= 10000; alter table t2 add constraint t2_pk primary key (id); create index t2_col1_idx on t2(col1); create index t2_col2_idx on t2(col2); create index t2_col3_idx on t2(col3); create index t2_col4_idx on t2(col4);
复制
检查表和索引的压缩。
select compression from user_tables where table_name = 'T2'; COMPRESS -------- DISABLED SQL> column index_name format a12 select index_name, compression from user_indexes where table_name = 'T2' order by 1; INDEX_NAME COMPRESSION ------------ ------------- T2_COL1_IDX DISABLED T2_COL2_IDX DISABLED T2_COL3_IDX DISABLED T2_COL4_IDX DISABLED T2_PK DISABLED SQL>
复制
导出表。
$ expdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=t2 \ directory=tmp_dir \ dumpfile=t2.dmp \ logfile=expdp_t2.log \ exclude=statistics Export: Release 21.0.0.0.0 - Production on Sun Sep 5 11:57:18 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Starting "TESTUSER1"."SYS_EXPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=t2 directory=tmp_dir dumpfile=t2.dmp logfile=expdp_t2.log exclude=statistics Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . exported "TESTUSER1"."T2" 384.8 KB 10000 rows Master table "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded ****************************************************************************** Dump file set for TESTUSER1.SYS_EXPORT_TABLE_01 is: /tmp/t2.dmp Job "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully completed at Sun Sep 5 11:57:35 2021 elapsed 0 00:00:14 $
复制
删除表,以便我们可以重新导入它。
conn testuser1/testuser1@//localhost:1521/pdb1 drop table t2 purge;
复制
从转储文件中导入表,使用TRANSFORM参数来压缩表TABLE_COMPRESSION_CLAUSE并使用INDEX_COMPRESSION_CLAUSE.
$ impdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=t2 \ directory=tmp_dir \ dumpfile=t2.dmp \ logfile=impdp_t2.log \ transform=table_compression_clause:\"compress basic\" \ transform=index_compression_clause:\"compress advanced low\" Import: Release 21.0.0.0.0 - Production on Sun Sep 5 12:02:22 2021 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Master table "TESTUSER1"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "TESTUSER1"."SYS_IMPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=t2 directory=tmp_dir dumpfile=t2.dmp logfile=impdp_t2.log transform=table_compression_clause:"compress basic" transform=index_compression_clause:"compress advanced low" Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "TESTUSER1"."T2" 384.8 KB 10000 rows Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Job "TESTUSER1"."SYS_IMPORT_TABLE_01" successfully completed at Sun Sep 5 12:02:29 2021 elapsed 0 00:00:05 $
复制
检查表和索引的压缩。
conn testuser1/testuser1@//localhost:1521/pdb1 select compression from user_tables where table_name = 'T2'; COMPRESS -------- ENABLED SQL> column index_name format a12 select index_name, compression from user_indexes where table_name = 'T2' order by 1; INDEX_NAME COMPRESSION ------------ ------------- T2_COL1_IDX ADVANCED LOW T2_COL2_IDX ADVANCED LOW T2_COL3_IDX ADVANCED LOW T2_COL4_IDX ADVANCED LOW T2_PK DISABLED SQL>
复制
我们可以看到表和索引现在都被压缩了。
您可以在此处阅读该TRANSFORM参数的完整说明。有关索引压缩的信息,请参阅此处有关CREATE INDEX的声明。
可传输表空间增强
在 Oracle 21c 中,可传输表空间导出 ( expdp) 和导入 ( impdp) 现在可以使用PARALLEL参数来并行化操作。
在 Oracle 21c 中,数据泵可以在故障点或故障点附近恢复失败的可传输表空间作业。在以前的版本中,无法恢复可传输表空间作业。
从 Oracle 自治数据库导出
我们可以使用本地 Oracle 21.3 安装将数据从自治数据库导出到使用该expdp实用程序的对象存储。您可以在本文中阅读有关此功能的信息。
从 Cloud Object Store 导出和导入
此功能在 Oracle 21.3 中似乎不起作用。我有一个关于这个问题的 SR 与 Oracle 支持。一旦我看到它工作,就会有一篇关于这个功能的单独文章。