关于ORA-01187: cannot read from file because it failed verification tests 的处理方法

环境:OEL+Oracle 11.2.0.3+physical standby

问题描述:查询dba_temp_files试图时显示Ora-01187错误号;

ORA-01187: cannot read from file  because it failed verification tests
ORA-01110: data file 201: '/oradata/seven/temp01.dbf'

重现下错误:

SQL> select file_id,file_name,tablespace_name from dba_temp_files;
select file_id,file_name,tablespace_name from dba_temp_files
                                              *
ERROR at line 1:
ORA-01187: cannot read from file  because it failed verification tests
ORA-01110: data file 201: '/oradata/seven/temp01.dbf'

oerr ora解决方法是:

[oracle@Seven trace]$ oerr ora 01187
01187, 00000, "cannot read from file %s because it failed verification tests"
// *Cause:  The data file did not pass the checks to insure it is part of the
//         database. Reads are not allowed until it is verified.
// *Action: Make the correct file available to the database. Then, either open
//         the database, or execute ALTER SYSTEM CHECK DATAFILES.  


初步推断是上次DG进行switchover时导致临时数据库文件出错,解决方法是重建临时数据文件;

带着这个疑问google了下,发现好多朋友遇到这个问题,表示重建下临时文件,或者重新reuse下临时表空间都可以处理这个问题,但是对于问题的根本起因,倒是没有找到原因;很遗憾!

还是来说明我自己的处理方法吧:

由于这个DG环境下的primary主库上报的错,对比了一下主备库的temp表空间,都是30M的大小,而且也都是online状态。


SQL> select name,bytes/1024/1024,status from v$tempfile;

NAME                           BYTES/1024/1024 STATUS
------------------------------ --------------- -------
/oradata/seven/temp01.dbf                   30 ONLINE


删除临时文件:

SQL> alter database  tempfile '/oradata/seven/temp01.dbf' drop;

Database altered.


SQL> select name,bytes/1024/1024,status from v$tempfile;

no rows selected


重新添加临时数据文件:

SQL> alter tablespace temp add tempfile '/oradata/seven/temp01.dbf' size 30M reuse;

Tablespace altered.

SQL> select name,bytes/1024/1024,status from v$tempfile;

NAME                           BYTES/1024/1024 STATUS
------------------------------ --------------- -------
/oradata/seven/temp01.dbf                   30 ONLINE


由于场景是DG环境,所以temp的name和bytes的值最好保持主备库一致,方便以后做Switchover;

至于导致ORA-01187错误的主要诱因,还是不明,也没有找到相关的文档;



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

版权所有,转载请注明作者及原文链接,否则追究法律责任!

QQ:      584307876

作者:    Seven

原文链接:  http://blog.youkuaiyun.com/sunjiapeng/article/details/9084429

邮箱:     seven_ginna@foxmail.com


<think>好的,用户遇到了Oracle的ORA-01441错误,想要了解原因和解决方法。首先,我需要回忆一下这个错误的具体情况。ORA-01441通常出现在尝试减小某列的长度时,但该列中已有数据超过了新定义的长度,导致无法完成操作。 首先,我需要确认错误的原因。根据引用[1]和[3],这个错误是因为在修改列长度时,现有数据的长度超过了新的长度限制。比如,原本是VARCHAR2(50),现在想改成30,但有些行的数据已经有超过30个字符的情况,这时候Oracle会阻止修改,抛出ORA-01441。 接下来,解决方法方面,用户需要处理这些超长的数据。可能的步骤包括:先检查哪些行的数据长度超过了目标长度,然后截断或者修改这些数据,再执行ALTER TABLE修改列长度。引用[3]中的例子用了UPDATE语句截断数据,比如用SUBSTR函数将字段截取到前30个字符,并更新相关行。这应该是一个有效的办法。 另外,用户可能需要注意修改列长度时的其他限制。例如,引用[2]提到ORA-01439错误,要求列必须为空才能修改,这可能和ORA-01441相关,但具体情况不同。这里主要关注的是数据长度的问题。 还需要提醒用户,在操作前备份数据,防止数据丢失或截断导致的问题。此外,如果表很大,可能需要考虑性能影响,分批处理或者使用更高效的语句。 最后,用户可能想知道如何避免类似问题,比如在设计表结构时预估字段长度,或者在修改前进行充分的检查。这些都是预防措施,可以在回答中提及。 现在需要将这些思考整理成结构化的回答,分点说明原因和解决步骤,并附上示例代码。同时,生成相关问题,帮助用户进一步理解。</think>### ORA-01441错误解析与解决方法 #### 错误原因 ORA-01441错误表示**无法减小列长度,因为存在数据长度超过目标值**。例如: - 原列为`VARCHAR2(50)`,尝试修改为`VARCHAR2(30)`时,若某行数据长度为35,则会触发此错误[^1][^3]。 - Oracle在修改列长度前会检查所有现有数据是否符合新长度限制,若存在不满足条件的数据则操作被终止。 --- #### 解决步骤 1. **检查超长数据** ```sql SELECT * FROM 表名 WHERE LENGTH(列名) > 目标长度; ``` 例如检查`jtdh`列长度是否超过30: ```sql SELECT * FROM zz WHERE LENGTH(jtdh) > 30; ``` 2. **截断或修正数据** - **方法1:直接截断超长部分** ```sql UPDATE 表名 SET 列名 = SUBSTR(列名, 1, 目标长度) WHERE LENGTH(列名) > 目标长度; ``` 示例(截断`jtdh`列到前30字符): ```sql UPDATE zz SET jtdh = SUBSTR(jtdh, 1, 30), gxsj = SYSDATE WHERE LENGTH(jtdh) > 30; ``` [^3] - **方法2:自定义处理逻辑** 若需保留关键信息(如保留后30字符或按规则清洗数据),需根据业务需求编写更新语句。 3. **执行列长度修改** ```sql ALTER TABLE 表名 MODIFY 列名 VARCHAR2(目标长度); ``` --- #### 注意事项 - **备份数据**:操作前建议备份表数据,防止误操作导致数据丢失。 - **性能优化**:若表数据量较大,分批更新可减少锁表时间。 - **设计规范**:在设计表结构时,应预估字段合理长度,避免频繁修改。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值