奇怪的ora-12081:update operation not allowed on tablexx.xx

在将一个Oracle10.2.0.4的数据库迁移到12.2.0.1版本时,遇到一张表在导入后变为只读状态,错误代码ora-12081。此问题仅在12.2.0.1版本出现,其他版本如11.2.0.4, 12.1.0.2, 和19.7中导入正常。已尝试将表设置为读写,但原因未明。推测可能是小众bug,建议迁移前检查表的读写属性。

生产环境有套oracle10.2.0.4的库迁移到12.2.0.1版本,采用expdp/impdp方式,这样的操作这几年其实做了挺多次的。

早上开发跟我说有张表不能dml操作,报错ora-12081:update operation not allowed on table xx.xxx

oracle在11g版本支持了将表改为只读状态即alter table table_name read only;

但生产环境倒是头一次遇到,而且是expdp/impdp的情况下。

先将表改为读写:alter table table_name read write;

然后排查原因。查看原库,该表正常,可读写。然后拿之前的备份的dump重新导入该表,分别导入到oracle11.2.0.4,  oracle12.1.0.2, oracle19.7以及当前使用的oracle12.2.0.1版本,发现只有在12.2.0.1这个版本,该表导入后变成了只读状态,其他版本皆正常。

在MOS上找了一圈,没有相关bug文档,只看到一个讨论,也是从10g迁移至oracle12.2.0.1的,出现了ora-12081,但也没有结论。

个人推测,大概率是一个小众的bug了,而且遇到的概率也比较低。一方面以前也迁移过不少10g的库到oracle12.2.0.1,没有遇到该问题。另一方面,此次迁移有700多张表,只有一张表出现这个情况。

以后再做相关迁移的时候,记得检查下表的读写情况:

select owner,table_name,read_only from dba_tables where read_only='YES';

-----------------------------------------------------------------------------------------

世间事,真是奇奇怪怪

### 解决方案分析 ORA-39002、ORA-39070 和 ORA-29283 错误通常出现在使用 Oracle 数据泵(Data Pump)进行导出(expdp)或导入(impdp)操作时。这些错误的核心问题在于文件系统权限不足、指定的目录对象无效或日志文件路径不可访问。以下是详细的解决方案和相关说明。 #### 1. **检查目录对象的定义** 在 Oracle 数据库中,`DIRECTORY` 是一个数据库对象,用于指定操作系统上的目录路径。如果目录对象未正确定义或指向不存在的路径,则会导致 `ORA-29283: invalid file operation` 错误。 - 确保 `DIRECTORY` 对象存在且路径正确: ```sql SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DIR'; ``` 如果查询结果为空或路径不正确,请重新创建目录对象: ```sql CREATE OR REPLACE DIRECTORY dir AS '/path/to/directory'; ``` 确保路径 `/path/to/directory` 存在,并且数据库用户对该路径具有读写权限[^1]。 #### 2. **验证操作系统权限** 即使 `DIRECTORY` 对象定义正确,如果操作系统用户(通常是 `oracle` 用户)对指定路径没有足够的权限,也会导致文件操作失败。 - 检查路径权限: ```bash ls -ld /path/to/directory ``` 确保 `oracle` 用户对该路径具有读写权限。如果权限不足,可以使用以下命令修改: ```bash chmod 755 /path/to/directory chown oracle:oinstall /path/to/directory ``` #### 3. **确认日志文件路径的有效性** `logfile` 参数指定的日志文件路径必须有效且可写。如果路径不存在或不可写,将触发 `ORA-39070: Unable to open the log file` 错误。 - 确保日志文件路径存在并可写: ```bash touch /path/to/directory/imp.log ``` 如果命令失败或无法创建文件,请检查路径权限并修复。 #### 4. **检查数据库用户的权限** 执行数据泵操作的用户需要具备特定的权限。如果用户权限不足,可能会导致操作失败。 - 确保用户具有以下权限: ```sql GRANT READ, WRITE ON DIRECTORY dir TO user; ``` 如果用户需要执行完整导出或导入操作,还需要授予 `DATAPUMP_EXP_FULL_DATABASE` 或 `DATAPUMP_IMP_FULL_DATABASE` 角色: ```sql GRANT DATAPUMP_EXP_FULL_DATABASE TO user; GRANT DATAPUMP_IMP_FULL_DATABASE TO user; ``` #### 5. **验证 UTL_FILE 包的使用** `UTL_FILE` 包用于在 PL/SQL 中处理文件操作。如果 `UTL_FILE` 的调用出现问题,也可能导致 `ORA-29283` 错误。 - 确保 `UTL_FILE` 包已启用且未被限制: ```sql SELECT * FROM dba_tab_privs WHERE GRANTEE = 'USER' AND TABLE_NAME = 'UTL_FILE'; ``` 如果权限缺失,可以使用以下命令授予权限: ```sql GRANT EXECUTE ON UTL_FILE TO user; ``` #### 6. **检查数据库参数设置** 数据泵操作依赖于某些数据库参数的正确配置。如果参数设置不当,可能导致文件操作失败。 - 确保以下参数已正确设置: ```sql SHOW PARAMETER utl_file_dir; ``` 如果 `utl_file_dir` 参数为空或未包含目标路径,可以通过以下方式修改: ```sql ALTER SYSTEM SET utl_file_dir='/path/to/directory' SCOPE=SPFILE; ``` 修改后需要重启数据库以使更改生效[^4]。 --- ### 示例代码 以下是一个完整的 `impdp` 命令示例,确保所有参数正确无误: ```bash impdp user/password DIRECTORY=dir DUMPFILE=user2020.dmp LOGFILE=imp.log ``` 如果仍然报错,可以尝试添加 `CONTENT=DATA_ONLY` 参数以跳过元数据处理: ```bash impdp user/password DIRECTORY=dir DUMPFILE=user2020.dmp LOGFILE=imp.log CONTENT=DATA_ONLY ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值