oracle数据文件大小异常故障处理

故障描述

上了安全设备,导致数据库服务器异常宕机后无法正常启动;

数据库启动过程中出现ORA-27046错误提示;

具体报错信息显示数据文件8(EPX_HRMS_DATA_04.DBF)存在文件大小异常;

原因分析

检查alert日志,启动过程有"ORA-27046: file size is not a multiple of logical block size"报错:

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Database mounted in Exclusive Mode Lost write protection disabled Completed: ALTER DATABASE MOUNT Mon Nov 17 11:20:43 2025 alter database open Errors in file /data/oracle/diag/rdbms/orcl/orcl/trace/orcl_dbw0_44519.trc: ORA-01157: cannot identify/lock data file 8 - see DBWR trace file ORA-01110: data file 8: '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF' ORA-27046: file size is not a multiple of logical block size Additional information: 1 Errors in file /data/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_44747.trc: ORA-01157: cannot identify/lock data file 8 - see DBWR trace file ORA-01110: data file 8: '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF' ORA-1157 signalled during: alter database open... Mon Nov 17 11:20:43 2025 Checker run found 1 new persistent data failures |

尝试recover该数据文件,同样报"ORA-27046"

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Mon Nov 17 11:23:57 2025 ALTER DATABASE RECOVER datafile 8 Media Recovery Start Serial Media Recovery started Mon Nov 17 11:23:57 2025 Errors in file /data/oracle/diag/rdbms/orcl/orcl/trace/orcl_dbw0_44519.trc: ORA-01157: cannot identify/lock data file 8 - see DBWR trace file ORA-01110: data file 8: '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF' ORA-27046: file size is not a multiple of logical block size Additional information: 1 Media Recovery failed with error 1110 ORA-283 signalled during: ALTER DATABASE RECOVER datafile 8 ... |

dbv检查数据文件,发现也是文件不符合多个块大小

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| $ dbv file=EPX_HRMS_DATA_04.DBF DBVERIFY: Release 19.0.0.0.0 - Production on Mon Nov 24 17:10:07 2025 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. DBV-00113: File (/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF) file size is not a multiple of block size |

尝试对该数据文件做offline操作,数据库是可以起来

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Mon Nov 17 11:28:41 2025 alter database datafile '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF' offline Completed: alter database datafile '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF' offline alter database open Beginning crash recovery of 1 threads parallel recovery started with 23 processes Started redo scan Completed redo scan ................省略部分日志....................... Mon Nov 17 11:28:49 2025 QMNC started with pid=49, OS id=67653 Completed: alter database open ARC3: Archival started ARC0: STARTING ARCH PROCESSES COMPLETE |

说明只有这一个数据文件有问题,导致数据库不能起来,但业务数据都在该数据文件上,不能做offline操作。

从主要报错内容"ORA-27046: file size is not a multiple of logical block size",可以看出,是这个数据文件不符合逻辑块尺寸大小,那么我们去检查一下这个数据文件看看是否符合逻辑块大小。

解决办法

检查数据文件的大小

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [oracle@localhost orcl]$ ll total 222273552 -rw-r----- 1 oracle oinstall 20135936 Nov 17 17:38 control01.ctl -rw-r----- 1 oracle oinstall 34359730176 Nov 17 12:13 EPX_HRMS_01.DBF -rw-r----- 1 oracle oinstall 34359730176 Nov 17 12:13 EPX_HRMS_DATA_02.DBF -rw-r----- 1 oracle oinstall 34359730176 Nov 17 12:13 EPX_HRMS_DATA_03.DBF -rw-r----- 1 oracle oinstall 29934763392 Nov 17 17:33 EPX_HRMS_DATA_04.DBF -rw-r----- 1 oracle oinstall 52429312 Nov 17 11:50 redo01.log -rw-r----- 1 oracle oinstall 52429312 Nov 17 11:50 redo02.log -rw-r----- 1 oracle oinstall 52429312 Nov 17 12:13 redo03.log -rw-r----- 1 oracle oinstall 21632131072 Nov 17 12:13 sysaux01.dbf -rw-r----- 1 oracle oinstall 3355451392 Nov 17 12:13 system01.dbf -rw-r----- 1 oracle oinstall 34358697984 Nov 17 11:28 temp01.dbf -rw-r----- 1 oracle oinstall 4335869952 Nov 17 12:13 undotbs01.dbf -rw-r----- 1 oracle oinstall 799547392 Nov 17 12:13 users01.dbf |

我们可以看到有问题的数据文件"EPX_HRMS_DATA_04.DBF",这个文件大小是29934763392字节,换算一下有多少个块,按8192字节逻辑块大小计算:

SQL> select 29934763392/8192 from dual;

29934763392/8192


3654145.921875

发现计算结果包含小数,确实不是整个块大小。

上面几个数据文件 EPX_HRMS_01.DBF、EPX_HRMS_DATA_02.DBF、EPX_HRMS_DATA_03.DBF的数据文件大小都是34359730176字节,计算一下块的大小刚好是个整数。

SQL> select 34359730176/8192 from dual;

34359730176/8192


4194303

确定需要的数据块数量,所以我们可以把"EPX_HRMS_DATA_04.DBF"数据文件补足整数块,把小数3654145.921875向上取整,有数据块个数3654146块,计算出大小

SQL> select 3654146*8192 from dual;

3654146*8192


29934764032

计算修正后文件大小:3654146 × 8192 = 29934764032字节

再计算差多少数据块

SQL> select 29934764032-29934763392 from dual;

29934764032-29934763392


640

计算需要增加的字节数:29934764032 - 29934763392 = 640字节

也就是"EPX_HRMS_DATA_04.DBF"这个数据文件再增加640块就变成整数个块。

使用dd命令追加数据块:

dd if=/dev/zero bs=1 count=640 >> /data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF

启动数据库

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01113: file 8 needs media recovery

ORA-01110: data file 8: '/data/oracle/oradata/orcl/EPX_HRMS_DATA_04.DBF'

执行数据文件恢复:

SQL> recover datafile 8;

Media recovery complete.

SQL> alter database open;

Database altered.

总结

1、数据文件大小必须是逻辑块大小的整数倍

2、oracle数据库启动校验比较严格,除了数据大小是要求数据块的整数倍,还有所有的数据文件的scn要一致,,才能正常启动。

3、通过追加空白数据块可修复文件大小异常,但需要通过recover应用归档日志和在线重做日志来恢复数据一致性。

相关推荐
l1t几秒前
DeepSeek辅助总结postgresql wiki提供的数独求解器
数据库·sql·postgresql
appearappear3 分钟前
大数据量处理
数据库
万行10 分钟前
SQL进阶&索引篇
开发语言·数据库·人工智能·sql
我是黄骨鱼21 分钟前
【零基础学数据库|第二篇】MySql启动!!!
数据库·mysql
陌上丨23 分钟前
什么是Redis的大Key和热Key?项目中一般是怎么解决的?
数据库·redis·缓存
Remember_99324 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
小园子的小菜24 分钟前
深入剖析HBase HFile原理:文件结构、Block协作与缓存机制
数据库·缓存·hbase
空空kkk29 分钟前
SSM项目练习——hami音乐(三)
java·数据库
好奇的菜鸟36 分钟前
Ubuntu 18.04 启用root账户图形界面登录指南
数据库·ubuntu·postgresql
天桥下的卖艺者37 分钟前
使用R语言编写一个生成金字塔图形的函数
开发语言·数据库·r语言