暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

手动删除崖山数据库文件后发现的一些缺陷

原创 杨有田 2024-06-04
258

适用范围

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            3

2)由于数据库处于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状态:

 

常见的故障及修复建议:

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论