在线重定义表(DBMS_REDEFINITION)

本文详细介绍了如何在不中断系统运行的情况下,通过DBMS_REDEFINITION在线重定义表,包括其功能、步骤、权限需求及依赖对象的状态。通过实例演示了如何修改表的存储参数、转移表空间、增加或删除分区等操作。
         在系统正在运行,外部有程序正在访问表的同时修改表的定义

         应用场景:对于7*24系统,不能直接修改表的定义,需要在保证正常使用的前提下修改表的定义、结构

         相关包:DBMS_REDEFINITION

执行在线重定义所需要权限:

         角色:EXECUTE_CATALOG_ROLE

         权限:CREATEANYTABLEALTERANYTABLEDROPANYTABLELOCKANYTABLESELECTANYTABLE

     例子:

1.ALTER INDEX PK_TAB1 RENAME TO PK_T_TAB1;

2.ALTERT TABLE TAB1 RENMAE PK_TAB1 TO PK_T_TAB1;

3.创建分区表T_TAB1

4.

BEGIN
 DBMS_REDEFINITION.CAN_REDEF_TABLE(UNAME=>'TEST',TNAME=>'TAB1',OPTIONS_FLAG=>DBMS_REDEFINITION.CONS_USE_PK);
    DBMS_REDEFINITION.START_REDEF_TABLE (uname=>'TEST',orig_table=>'TAB1',int_table=>'T_TAB1',options_flag=>dbms_redefinition.cons_use_pk);
    DBMS_REDEFINITION.FINISH_REDEF_TABLE(uname=>'TEST',orig_table=>'TAB1',int_table=>'T_TAB1');
END;

*******************************************************

在线重定义的功能:

         修改表的存储参数

可以将表转移到其他表空间

增加并行查询选项

增加或删除分区

重建表以减少碎片

将堆表改为索引组织表或相反的操作

增加或删除一个列

在线重定义的原理:

         物化视图

在线重定义表的步骤:

1、选择一种重定义方法:一种是基于主键、另一种是基于ROWID

2、调用DBMS_REDEFINITION.CAN_REDEF_TABLE过程,如果表不满足重定义的条件,将会报错并给出原因

3、在同一个方案中建立一个空的中间表,根据重定义后你期望得到的结构建立中间表

4、调用DBMS_REDEFINITION.START_REDEF_TABLE过程,并提供下列参数:被重定义的表的名称、中间表的名称、列的映射规则、重定义方法

如果映射方法没有提供,则认为所有包括在中间表中的列用于表的重定义。如果给出了映射方法,则只考虑映射方法中给出的列。如果没有给出重定义方法,则认为使用主键方式

5、在中间表上建立触发器、索引和约束,并进行相应的授权。任何包含中间表的完整性约束应将状态置为DISABLE

当重定义完成时,中间表上建立的触发器、索引、约束和授权将替换重定义表上的触发器、索引、约束和授权。中间表上DISABLE的约束将在重定义表上ENABLE

6、如果在执行完成DBMS_REDEFINITION.START_REDEF_TABLE过程后,立即执行DBMS_REDEFINITION.FINISH_REDEF_TABLE过程,这会导致在重定义表上执行了大量的DML操作,那么可以选择执行一次或多次的DBMS_REDEFINITION.SYNC_INTERIM_TABLE过程,以减少最后一步执行FINISH_REDEF_TABLE过程时的锁定时间

7、执行DBMS_REDEFINITION.FINISH_REDEF_TABLE过程完成表的重定义。这个过程中,原始表会被独占模式锁定一小段时间,具体时间和表的数据量有关

执行完FINISH_REDEF_TABLE过程后,原始表重定义后具有了中间表的属性、索引、约束、授权和触发器。中间表上DISABLE的约束在原始表上处于ENABLE状态

*******************************************************

依赖对象的状态:

         依赖对象:约束、触发器、索引、授权

         中间表:定义中间表,在该中间表建立的触发器、约束应该将其置为DISABLE状态

         目的表:在重定义过程完毕以后,中间表的这些依赖对象将会自动转移到目标表上,并且为ENABLE状态

<think>好的,我现在需要解决用户在Oracle数据库中使用DBMS_REDEFINITION时遇到的权限不足问题,具体错误是ORA-01031。首先,我得回忆一下这个错误的常见原因。ORA-01031通常示用户缺少执行某个操作所需的权限。对于DBMS_REDEFINITION包来说,可能需要特定的系统权限或对象权限。 根据用户提供的引用内容,特别是引用[3]提到使用DBMS_REDEFINITION时可能需要CONS_USE_ROWID参数,这说明用户可能在尝试在线重定义在线重定义需要较高的权限,通常需要用户被授予EXECUTE权限于DBMS_REDEFINITION包,或者有ALTER ANY TABLE这样的系统权限。 接下来,我需要考虑可能的解决方案。首先,用户应该检查当前用户是否具有执行DBMS_REDEFINITION的权限。可能需要以SYS用户身份登录,授予必要的权限,比如EXECUTE ON DBMS_REDEFINITION给当前用户,或者授予ALTER ANY TABLE和CREATE ANY TABLE等权限。 另外,引用[1]提到的ORA-12089错误是因为没有主键,但用户当前的问题是关于权限的,所以暂时不用考虑结构问题。但需要注意,即使权限正确,如果不符合在线重定义的条件(如主键缺失),后续步骤可能会出错,所以用户可能之后需要处理这个问题。 用户提到的ORA-06512是错误发生的调用堆栈信息,指出错误发生的位置,但核心问题还是权限不足。因此,解决方案应集中在权限授予上。 可能的步骤包括: 1. 使用SYS或具有DBA权限的用户登录。 2. 授予当前用户EXECUTE权限于DBMS_REDEFINITION。 3. 授予其他相关权限,如ALTER ANY TABLE、CREATE ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE、SELECT ANY TABLE等,以确保在线重定义过程顺利执行。 另外,需要确认用户是否有足够的空间权限,因为在线重定义过程中会创建中间,需要空间权限。 还需要提醒用户,在授予权限后重新尝试操作,并检查是否仍然出现权限错误。如果问题依旧,可能需要更详细的错误日志分析,或者检查是否存在其他权限限制,如通过角色授予的权限是否生效(有时直接授予用户而非角色更可靠)。 总结来说,解决ORA-01031的关键在于确保用户拥有执行DBMS_REDEFINITION所需的所有必要权限,这通常需要DBA级别的授权。</think>### ORA-01031 权限不足问题的解决方案 在 Oracle 数据库中使用 `DBMS_REDEFINITION` 执行在线重定义时,若出现 **ORA-01031: 权限不足** 错误,通常是由于用户缺少必要的权限。以下是逐步解决方案: --- #### **1. 确认权限要求** `DBMS_REDEFINITION` 需要以下权限: - **系统权限**: - `CREATE ANY TABLE` - `ALTER ANY TABLE` - `DROP ANY TABLE` - `LOCK ANY TABLE` - `SELECT ANY TABLE` - `CREATE ANY INDEX` - `CREATE ANY TRIGGER` - **包执行权限**: - `EXECUTE ON DBMS_REDEFINITION` [^3] --- #### **2. 授予缺失权限** 以 `SYS` 或具有 `DBA` 权限的用户执行以下命令: ```sql -- 授予系统权限 GRANT CREATE ANY TABLE, ALTER ANY TABLE, DROP ANY TABLE, LOCK ANY TABLE, SELECT ANY TABLE TO <目标用户>; GRANT CREATE ANY INDEX, CREATE ANY TRIGGER TO <目标用户>; -- 授予DBMS_REDEFINITION执行权限 GRANT EXECUTE ON DBMS_REDEFINITION TO <目标用户>; ``` --- #### **3. 检查权限是否生效** 确保权限已通过直接授予(而非角色继承),因为某些权限(如 `SELECT ANY TABLE`)可能需要直接授予用户。 --- #### **4. 验证是否符合重定义条件** 即使权限正确,仍需确保满足在线重定义的要求: - 必须具有主键或使用 `CONS_USE_ROWID` 参数(若无主键)[^1]。 - 空间足够存储中间对象。 --- #### **5. 重试操作** 重新执行在线重定义流程: ```sql BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => '当前用户', orig_table => '原名', int_table => '中间名', cons_use_rowid => TRUE -- 若无主键则需启用 ); END; / ``` --- ### 常见问题排查 1. **权限未生效**:退出当前会话后重新登录,确保权限生效。 2. **角色权限限制**:某些权限(如 `SELECT ANY TABLE`)需直接授予用户,而非通过角色。 3. **结构问题**:若无主键且未使用 `CONS_USE_ROWID`,会触发 ORA-12089 错误。 --- ### 相关问题 1. **如何确认用户当前拥有的权限?** 可通过查询 `DBA_SYS_PRIVS` 和 `DBA_TAB_PRIVS` 视图获取权限信息。 2. **在线重定义时出现 ORA-12089 错误如何解决?** 需确保有主键或使用 `CONS_USE_ROWID` 参数[^1]。 3. **如何监控在线重定义进度?** 可通过 `DBA_REDEFINITION_STATUS` 视图查看状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值