【问题标题】:ERROR "ora-01950: no privileges on tablespace" during Import Oracle Dump in AWS Oracle RDS在 AWS Oracle RDS 中导入 Oracle 转储期间出现错误“ora-01950:对表空间没有权限”
【发布时间】:2019-08-14 04:39:49
【问题描述】:

我正在尝试使用 datapump full 将一个 Oracle 12 数据库从一个 Oracle RDS 移动到另一个

这样做的原因是能够将 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:对表空间没有权限

有人遇到过这样的问题吗?

【问题讨论】:

    标签: database oracle amazon-rds rds


    【解决方案1】:

    不要以完整模式导入。

    因为 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;
    

    【讨论】:

    • 嗨,所以必须单独完成是使用重映射的架构级别,我的主用户应该在每个表空间上都有配额和资源?
    • 主用户对所有表空间都有配额。您需要在重映射表空间上向用户授予配额。
    【解决方案2】:

    您收到错误消息,因为您的新用户没有表空间的权限。

    您需要在 impdp 之前从 DBA 用户执行以下 SQL。

    ALTER USER <user> quota unlimited on <tablespace name>;
    

    ALTER USER <user> quota 1000M on <tablespace name>;
    

    根据您的要求给予足够的尺寸。

    干杯!!

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2021-05-21
      • 2010-09-08
      • 2012-03-04
      • 2018-07-02
      相关资源
      最近更新 更多