在AWS Oracle RDS中的导入Oracle Dump期间发生错误“ ora-01950:表空间无特权”

时间:2019-08-14 04:39:49

标签: database oracle amazon-rds rds

我正尝试使用完整的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:对表空间没有特权

有人遇到这样的问题吗?

2 个答案:

答案 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>;

根据您的要求提供足够的大小。

干杯!