从 Oracle 21c 开始,数据泵支持将云对象存储作为本地安装的转储文件位置。
目录
介绍
从云对象存储导入数据最初是在自治数据库中引入的。Oracle 18cimpdp
实用程序引入了CREDENTIAL
参数来指定要用于导入的对象存储凭据。尽管这使用了该impdp
实用程序的本地安装,但该功能只能在连接到自治数据库时使用。从 Oracle 21c (21.3) 开始,我们还可以使用CREDENTIAL
带有expdp
实用程序的参数从自治数据库导出到 can 对象存储。您可以在此处阅读有关此功能的信息。
Oracle 21c (21.3) 引入了使用本地数据库从云对象存储导出和导入的功能,因此该功能不再局限于自治数据库。
使用云对象存储作为转储文件位置时,数据传输会出现一些延迟。
先决条件
该DBMS_CLOUD
包默认存在于自治数据库中。它未安装在 Oracle 21c 本地安装中,因此必须手动安装。Oracle 文档中未提及此先决条件。此 MOS 说明中描述了安装。
这里有一个安装示例。
我们需要一个对象存储桶作为示例。这可以是 Oracle Cloud Object Storage 存储桶或 AWS S3 存储桶。以下文章介绍了如何创建 Oracle Cloud Object Storage 存储桶。
Oracle 21.3 中的错误
在 Oracle 21.3 中尝试使用此功能时,我不断收到错误消息。我向 My Oracle Support (MOS) 提出了服务请求 (SR),这导致了以下错误。它是隐藏的,但它存在。
Bug 33323028 - DATA PUMP EXPORT TO OCI OBJECT STORAGE FAILS ORA-39001 ORA-39000 ORA-31641
复制
希望这将在未来的版本更新中得到修复,但目前建议的解决方法是启用对象存储 ODM 库。
# Turn everything off. dbshut $ORACLE_HOME cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk opc_on # Turn everything on. dbstart $ORACLE_HOME
复制
感谢 Oracle 的支持人员和开发人员让我克服了这个错误。
以前未记录的对DBMS_CLOUD
包的依赖和错误的解决方法现在已添加到以下 MOS 说明中。
设置
我们创建一个测试用户来执行导出和导入操作。我们确保用户可以创建凭据,并授予其访问DBMS_CLOUD
包的权限。
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 create credential to testuser1; grant execute on dbms_cloud to testuser1;
复制
我们需要一个本地目录对象用于导出和导入操作。转储文件放置在对象存储中,但日志文件写入本地。
create or replace directory tmp_dir as '/tmp/'; grant read, write on directory tmp_dir to testuser1
复制
连接到测试用户并创建下表。
conn testuser1/testuser1@//localhost:1521/pdb1 create table emp ( empno number(4,0), ename varchar2(10 byte), job varchar2(9 byte), mgr number(4,0), hiredate date, sal number(7,2), comm number(7,2), deptno number(2,0), constraint pk_emp primary key (empno) ); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7698,'BLAKE','MANAGER',7839,to_date('01-MAY-81','DD-MON-RR'),2850,null,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7782,'CLARK','MANAGER',7839,to_date('09-JUN-81','DD-MON-RR'),2450,null,10); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7788,'SCOTT','ANALYST',7566,to_date('19-APR-87','DD-MON-RR'),3000,null,20); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7839,'KING','PRESIDENT',null,to_date('17-NOV-81','DD-MON-RR'),5000,null,10); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7844,'TURNER','SALESMAN',7698,to_date('08-SEP-81','DD-MON-RR'),1500,0,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7876,'ADAMS','CLERK',7788,to_date('23-MAY-87','DD-MON-RR'),1100,null,20); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7900,'JAMES','CLERK',7698,to_date('03-DEC-81','DD-MON-RR'),950,null,30); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7902,'FORD','ANALYST',7566,to_date('03-DEC-81','DD-MON-RR'),3000,null,20); insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7934,'MILLER','CLERK',7782,to_date('23-JAN-82','DD-MON-RR'),1300,null,10); commit;
复制
对象存储凭证
该DBMS_CLOUD
软件包包含该软件包中的过程的副本DBMS_CREDENTIAL
。这两个包可以互换使用,因为它们做同样的事情。
为您的对象存储创建凭证。对于 Oracle 对象存储桶,我们使用我们的 Oracle Cloud 电子邮件和我们生成的身份验证令牌。
conn testuser1/testuser1@//localhost:1521/pdb1 begin dbms_cloud.drop_credential(credential_name => 'obj_store_cred'); end; / begin dbms_cloud.create_credential ( credential_name => 'obj_store_cred', username => 'me@example.com', password => '{my-Auth-Token}' ) ; end; /
复制
对于 AWS 存储桶,我们使用我们的 AWS 访问密钥和秘密访问密钥。
begin dbms_cloud.create_credential ( credential_name => 'obj_store_cred', username => 'my AWS access key', password => 'my AWS secret access key' ); end; /
复制
对象存储 URI
我们使用对象存储 URI 作为DUMPFILE
位置。对于 AWS S3,使用 S3 存储桶的 URI。对于 Oracle Cloud,URI 可以采用这些形式之一。
https://swiftobjectstorage.{region}.oraclecloud.com/v1/{namespace}/{bucket-name}/{file-name}.dmp https://objectstorage.{region}.oraclecloud.com/n/{namespace}/b/{bucket-name}/o/{file-name}.dmp
复制
该文档通常使用“swiftobjectstorage”URI,但两者都有效。对于本文的其余部分,我们将使用“swiftobjectstorage”URI。
导出到云对象存储
我们使用该expdp
实用程序执行正常导出。我们使用CREDENTIAL
参数提供我们的云对象存储凭证,并在DUMPFILE
参数中使用云对象存储 URI 。
$ expdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=emp \ credential=obj_store_cred \ dumpfile=https://swiftobjectstorage.uk-london-1.oraclecloud.com/v1/my-namespace/ob-bucket/emp.dmp \ logfile=tmp_dir:expdp_emp.log \ exclude=statistics Export: Release 21.0.0.0.0 - Production on Fri Sep 10 08:34:40 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=emp credential=obj_store_cred dumpfile=https://swiftobjectstorage.uk-london-1.oraclecloud.com/v1/my-namespace/ob-bucket/emp.dmp logfile=tmp_dir:expdp_emp.log exclude=statistics Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . exported "TESTUSER1"."EMP" 8.781 KB 14 rows Master table "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded ****************************************************************************** Dump file set for TESTUSER1.SYS_EXPORT_TABLE_01 is: https://swiftobjectstorage.uk-london-1.oraclecloud.com/v1/my-namespace/ob-bucket/emp.dmp Job "TESTUSER1"."SYS_EXPORT_TABLE_01" successfully completed at Fri Sep 10 08:34:59 2021 elapsed 0 00:00:17 $
复制
从云对象存储导入
我们使用该impdp
实用程序执行正常导入。我们使用CREDENTIAL
参数来提供我们的云对象存储凭证,并在DUMPFILE
参数中使用云对象存储 URI 。
$ impdp testuser1/testuser1@//localhost:1521/pdb1 \ tables=emp \ remap_table=testuser1.emp:emp_copy \ credential=obj_store_cred \ dumpfile=https://swiftobjectstorage.uk-london-1.oraclecloud.com/v1/my-namespace/ob-bucket/emp.dmp \ logfile=tmp_dir:impdp_emp.log Import: Release 21.0.0.0.0 - Production on Fri Sep 10 08:36: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 Master table "TESTUSER1"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "TESTUSER1"."SYS_IMPORT_TABLE_01": testuser1/********@//localhost:1521/pdb1 tables=emp remap_table=testuser1.emp:emp_copy credential=obj_store_cred dumpfile=https://swiftobjectstorage.uk-london-1.oraclecloud.com/v1/my-namespace/ob-bucket/emp.dmp logfile=tmp_dir:impdp_emp.log Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "TESTUSER1"."EMP_COPY" 8.781 KB 14 rows Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT ORA-31684: Object type CONSTRAINT:"TESTUSER1"."PK_EMP" already exists Job "TESTUSER1"."SYS_IMPORT_TABLE_01" completed with 1 error(s) at Fri Sep 10 08:36:28 2021 elapsed 0 00:00:09 $
复制
文章来源:https://oracle-base.com/articles/21c/data-pump-export-import-cloud-object-store-21c