从 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
$
相关文章




