故障描述
上了安全设备,导致数据库服务器异常宕机后无法正常启动;
数据库启动过程中出现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应用归档日志和在线重做日志来恢复数据一致性。