我正尝试使用完整的datapump将一个Oracle 12数据库从一个Oracle RDS迁移到另一个Oracle
这样做的原因是能够将Oracle RDS(固定在选项组中)移动到另一个AWS账户。
nohup expdp myUser/myPass@myDB \
full=y job_name=DRPRD1_EXPORT_DAILY \
dumpfile=file.dmp \
directory=data_pump_dir \
exclude=statistics \
METRICS=Y LOGTIME=ALL
我将dmp文件移动到新的空Oracle RDS(相同版本)
我的导入脚本:
set serveroutput on;
set timing on;
DECLARE
ind NUMBER; -- Loop index
h1 NUMBER; -- Data Pump job handler
percent_done NUMBER; -- Percentage of job complete
job_state VARCHAR2(30); -- To keep track of job state
le ku$_LogEntry; -- For WIP and error messages
js ku$_JobStatus; -- The job status from get_status
jd ku$_JobDesc; -- The job description from get_status
sts ku$_Status; -- The status object returned by get_status
BEGIN
h1 := DBMS_DATAPUMP.OPEN('IMPORT','FULL',NULL,'My_Import');
DBMS_DATAPUMP.ADD_FILE(h1,'file.dmp','DATA_PUMP_DIR');
DBMS_DATAPUMP.SET_PARAMETER(h1,'TABLE_EXISTS_ACTION','REPLACE');
DBMS_DATAPUMP.START_JOB(h1);
percent_done := 0;
job_state := 'UNDEFINED';
while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
dbms_datapump.get_status(h1,
dbms_datapump.ku$_status_job_error +
dbms_datapump.ku$_status_job_status +
dbms_datapump.ku$_status_wip,-1,job_state,sts);
js := sts.job_status;
-- If the percentage done changed, display the new value.
if js.percent_done != percent_done
then
dbms_output.put_line('*** Job percent done = ' ||
to_char(js.percent_done));
percent_done := js.percent_done;
end if;
-- If any work-in-progress (WIP) or Error messages were received for the job,
-- display them.
if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
then
le := sts.wip;
else
if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
then
le := sts.error;
else
le := null;
end if;
end if;
if le is not null
then
ind := le.FIRST;
while ind is not null loop
dbms_output.put_line(le(ind).LogText);
ind := le.NEXT(ind);
end loop;
end if;
end loop;
-- Indicate that the job finished and gracefully detach from it.
dbms_output.put_line('Job has completed');
dbms_output.put_line('Final job state = ' || job_state);
dbms_datapump.detach(h1);
END;
/
我正在与创建RDS的主用户一起运行导入,因此我假设我拥有正确的权限
所有表格均未创建,并且出现错误
ora-01950:对表空间没有特权
有人遇到这样的问题吗?
答案 0 :(得分:2)
请勿以完整模式导入。
因为Amazon RDS for Oracle不允许访问SYS或SYSDBA 管理用户,以全模式导入或导入以下模式 Oracle维护的组件,可能会损坏Oracle数据字典 并影响数据库的稳定性。 Importing Data into Oracle on Amazon RDS
步骤1:在Amazon RDS目标实例上向用户授予特权 要向RDS目标实例上的用户授予特权,请使用 完成以下步骤:
使用SQL Plus或Oracle SQL Developer连接到Amazon RDS 将数据导入到的目标Oracle数据库实例。 以Amazon RDS主用户身份连接。有关的信息 连接到数据库实例,请参阅连接到正在运行的数据库实例 Oracle数据库引擎。
在导入数据之前创建所需的表空间。欲了解更多 有关信息,请参阅创建和调整表空间。
如果不存在导入数据的用户帐户, 创建用户帐户并授予必要的权限和角色。 如果计划将数据导入多个用户架构,请创建每个 用户帐户并为其授予必要的特权和角色。
例如,以下命令创建一个新用户并授予 必要的权限和角色,以将数据导入用户的 模式。
create user schema_1 identified by <password>;
grant create session, resource to schema_1;
alter user schema_1 quota 100M on users;
答案 1 :(得分:0)
由于新用户对表空间没有权限,因此出现错误。
您需要在impdp之前从DBA用户执行以下SQL。
ALTER USER <user> quota unlimited on <tablespace name>;
或
ALTER USER <user> quota 1000M on <tablespace name>;
根据您的要求提供足够的大小。
干杯!