故障描述

上了安全設備,導致數據庫服務器異常宕機後無法正常啓動;

數據庫啓動過程中出現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應用歸檔日誌和在線重做日誌來恢復數據一致性。