适用范围
23.2
问题概述
测试手动删除数据文件,创建表或则切换redo日志提示报错:YAS-06023 database is set to read-only because of database abnormal
测试过程
简要说明下测试过程。
咱们对数据库运维要有敬畏之心,准备测试表后,然后来个数据库全备:
SQL> create table backuptable( b1 int,b2 int) tablespace yyt01;
Succeed.
SQL> insert into backuptable values(2,3);
1 row affected.
SQL> commit;
Succeed.
SQL> backup database full format '/home/yashan/full';
Succeed.
bash-4.2$ cd dbfiles
-bash-4.2$ ls
ctrl1 ctrl2 ctrl3 dwf redo1 redo2 redo3 redo4 swap sysaux system temp undo users yyt01 yyt02
-bash-4.2$ ll
total 3584604
-rw-r----- 1 yashan yashan 25370624 May 31 08:13 ctrl1
-rw-r----- 1 yashan yashan 25370624 May 31 08:13 ctrl2
-rw-r----- 1 yashan yashan 25370624 May 31 08:13 ctrl3
-rw-r----- 1 yashan yashan 67108864 May 31 08:13 dwf
-rw-r----- 1 yashan yashan 134217728 May 31 08:13 redo1
-rw-r----- 1 yashan yashan 134217728 May 23 08:37 redo2
-rw-r----- 1 yashan yashan 134217728 May 31 07:58 redo3
-rw-r----- 1 yashan yashan 134217728 May 31 08:12 redo4
-rw-r----- 1 yashan yashan 67108864 May 31 07:58 swap
-rw-r----- 1 yashan yashan 67108864 May 31 07:58 sysaux
-rw-r----- 1 yashan yashan 67108864 May 31 08:13 system
-rw-r----- 1 yashan yashan 67108864 May 31 07:58 temp
-rw-r----- 1 yashan yashan 402653184 May 31 08:13 undo
-rw-r----- 1 yashan yashan 67108864 May 4 09:46 users
-rw-r----- 1 yashan yashan 2147483648 May 31 08:12 yyt01
-rw-r----- 1 yashan yashan 104857600 May 23 08:43 yyt02模拟操作系统上删除数据文件,看下数据库的表现:
1)查看测试表数据,可以正常显示,数据来自buffer cache:
-bash-4.2$ rm yyt02 yyt01
-bash-4.2$ s
YashanDB SQL Personal Edition Release 23.2.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.2.1.100 x86_64 - X86 64bit Linux
SQL> select * from backuptable;
B1 B2
------------ ------------
2 3
1 row fetched.
SQL> alter system checkpoint;
Succeed.
SQL> select * from backuptable;
B1 B2
------------ ------------
2 32)由于数据库处于read only模式,任何COMMIT操作都会报错,包括手动切换redo日志文件:
SQL> create table backuptable2( b1 int,b2 int) tablespace users;
YAS-06023 database is set to read-only because of database abnormal
SQL> truncate table backuptabl;
YAS-06023 database is set to read-only because of database abnormal
SQL> alter system switch logfile;
YAS-06023 database is set to read-only because of database abnormal
3)检查数据库视图v$database,状态显示abnorma,open_mode显示read_write,很明显,这里open_mode列显示的信息同报错提示信息不匹配。
如果数据库处于abnorma状态,故障处理恢复后,需要手动切回正常状态。
SQL> select status,open_mode from v$database;
STATUS OPEN_MODE
--------------------------------- -----------------
ABNORMAL READ_WRITE
1 row fetched.
4)检查数据文件yyt01和yyt02的状态,仍然显示ONLINE,实际上数据文件已经不存在,看起来这个地方的显示信息有待优化。
SQL> @f
TABLESPACE_NAME FILE_ID FILE_NAME BYTES BLOCKS STATUS AUTO_EXTEND
------------------ ------------ -------------------------------------------------- --------------------- ------------ --------- -----------
SYSTEM 0 /yashan/yasdb_data/db-1-1/dbfiles/system 67108864 8192 ONLINE ON
SYSAUX 1 /yashan/yasdb_data/db-1-1/dbfiles/sysaux 67108864 8192 ONLINE ON
TEMP 2 /yashan/yasdb_data/db-1-1/dbfiles/temp 67108864 8192 ONLINE ON
SWAP 3 /yashan/yasdb_data/db-1-1/dbfiles/swap 67108864 8192 ONLINE ON
USERS 4 /yashan/yasdb_data/db-1-1/dbfiles/users 67108864 8192 ONLINE ON
UNDO 5 /yashan/yasdb_data/db-1-1/dbfiles/undo 402653184 49152 ONLINE ON
YYT01 6 /yashan/yasdb_data/db-1-1/dbfiles/yyt01 2147483648 262144 ONLINE OFF
YYT01 7 /yashan/yasdb_data/db-1-1/dbfiles/yyt02 104857600 12800 ONLINE OFF
SQL> @ts
ID TABLESPACE_NAME BLOCK_SIZE TOTAL_BYTES USER_BYTES USER_BLOCKS STATUS CONTENTS ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT
------------ ------------------ ------------ ----------- ----------- ----------- ----------------- ----------------- --------------- ------------------------
0 SYSTEM 8192 67108864 40108032 4896 ONLINE PERMANENT AUTO BITMAP
1 SYSAUX 8192 67108864 62259200 7600 ONLINE PERMANENT AUTO BITMAP
2 TEMP 8192 67108864 61865984 7552 ONLINE TEMPORARY UNIFORM BITMAP
3 SWAP 8192 67108864 66060288 8064 ONLINE SWAP UNIFORM BITMAP
4 USERS 8192 67108864 66060288 8064 ONLINE PERMANENT AUTO BITMAP
5 UNDO 8192 402653184 114900992 14026 ONLINE UNDO AUTO BITMAP
6 YYT01 8192 2252341248 2250178560 274680 ONLINE PERMANENT AUTO BITMAP
7 rows fetched.
5)刷新buffer cache,再次查询测试表,提示不能打开文件
SQL> alter system flush buffer_cache;
Succeed.
SQL> select * from backuptable;
YAS-00313 failed to open file /yashan/yasdb_data/db-1-1/dbfiles/yyt01, errno 2, error message "No such file or directory"
SQL>
查询视图v$diag_incident:

测试结论:
我们可以看到删除数据文件后,数据文件显示状态和数据库的open_mode显示正常,与实际提示报错信息和数据文件实际状态不一致。而且数据库处于abnormal状态,恢复后需要手动干预,否则无法进行事务commit提交。
备注说明:
故障状态
YashanDB检测到异常故障时,防止扩散影响,会将数据库的状态置为ABNORMAL,数据库处于故障只读状态,可以查询,不能执行写的业务。当数据库为ABNORMAL状态时,可以查看V$DIAG_INCIDENT视图或告警日志明确故障原因。
故障修复后,需要手动执行语句( ALTER DATABASE CONVERT TO NORMAL;)消除ABNORMAL状态:
常见的故障及修复建议:





