故障描述

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

数据库启动过程中出现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、逻辑块大小的整数倍就是数据文件大小必须

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

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