#数据文件管理

# 数据文件的存放位置

默认情况下,数据文件存放在$YASDB_DATA/dbfiles目录下(SCOL数据默认存放在与data同级的local_fs目录下)。

共享集群部署模式下的数据文件存放在+DG/dbfiles目录下,访问方式请参考YFS文件管理

$ cd $YASDB_DATA/dbfiles
$ ls -lrt
total 1122904
...
-rw-r----- 1 yashan yashan 134217728 Oct 19 11:50 redo1
-rw-r----- 1 yashan yashan 134217728 Oct 19 14:15 redo2
-rw-r----- 1 yashan yashan 134217728 Oct 19 11:50 redo3
-rw-r----- 1 yashan yashan 134217728 Oct 19 11:50 redo4
-rw-r----- 1 yashan yashan  67108864 Oct 19 11:50 temp
-rw-r----- 1 yashan yashan  67108864 Oct 19 11:50 swap
-rw-r----- 1 yashan yashan  67108864 Oct 19 11:50 users
-rw-r----- 1 yashan yashan  67108864 Oct 19 14:00 sysaux
-rw-r----- 1 yashan yashan  67108864 Oct 19 14:15 system
-rw-r----- 1 yashan yashan 134217728 Oct 19 14:15 undo
-rw-r----- 1 yashan yashan  67108864 Oct 19 14:15 dwf
-rw-r----- 1 yashan yashan  25370624 Oct 19 14:15 ctrl1
-rw-r----- 1 yashan yashan  25370624 Oct 19 14:15 ctrl2
-rw-r----- 1 yashan yashan  25370624 Oct 19 14:15 ctrl3
...

其中:

  • redo:redo日志文件
  • temp/swap/users/sysaux/system/undo:表空间数据文件
  • dwf:双写文件
  • ctrl:控制文件

# 数据文件的查看

除了直接在操作系统进入到数据文件存放的目录查看外,还可以通过数据库的DBA_DATA_FILES和V$DATAFILE视图查看,如下:

SELECT file_name FROM DBA_DATA_FILES;

FILE_NAME                                                        
---------------------------------------------------------------- 
/home/yashan/yashandb/yasdb_data/dbfiles/system                    
/home/yashan/yashandb/yasdb_data/dbfiles/sysaux                    
/home/yashan/yashandb/yasdb_data/dbfiles/undo                      
/home/yashan/yashandb/yasdb_data/dbfiles/temp                      
/home/yashan/yashandb/yasdb_data/dbfiles/swap                      
/home/yashan/yashandb/yasdb_data/dbfiles/users                     
/home/yashan/yashandb/yasdb_data/dbfiles/temp_undo                 
/home/yashan/yashandb/yasdb_data/dbfiles/users02.dbf               
/home/yashan/yashandb/yasdb_data/dbfiles/mytest01.dbf  

集群:
SELECT file_name FROM DBA_DATA_FILES;

FILE_NAME                                                        
---------------------------------------------------------------- 
+DG0/dbfiles/system                                             
+DG0/dbfiles/sysaux                                             
+DG0/dbfiles/temp                                               
+DG0/dbfiles/swap                                               
+DG0/dbfiles/users                                              
+DG0/dbfiles/undo1                                              
+DG0/dbfiles/undo2                                              
+DG0/dbfiles/undo3                                              

SELECT name FROM V$DATAFILE;

NAME                                                             
---------------------------------------------------------------- 
/home/yashan/yashandb/yasdb_data/dbfiles/system                    
/home/yashan/yashandb/yasdb_data/dbfiles/sysaux                    
/home/yashan/yashandb/yasdb_data/dbfiles/undo                      
/home/yashan/yashandb/yasdb_data/dbfiles/temp                      
/home/yashan/yashandb/yasdb_data/dbfiles/swap                      
/home/yashan/yashandb/yasdb_data/dbfiles/users                     
/home/yashan/yashandb/yasdb_data/dbfiles/temp_undo                 
/home/yashan/yashandb/yasdb_data/dbfiles/users02.dbf               
/home/yashan/yashandb/yasdb_data/dbfiles/mytest01.dbf 

集群:
SELECT name FROM V$DATAFILE;

NAME                                                             
---------------------------------------------------------------- 
+DG0/dbfiles/system                                             
+DG0/dbfiles/sysaux                                             
+DG0/dbfiles/temp                                               
+DG0/dbfiles/swap                                               
+DG0/dbfiles/users                                              
+DG0/dbfiles/undo1                                              
+DG0/dbfiles/undo2                                              
+DG0/dbfiles/undo3                                              

通过DBA_DATA_FILES和V$DATAFILE视图还可以查看数据文件的其他属性,比如文件号、文件大小、文件对应的表空间和文件状态等信息。

# 数据文件的维护

# 添加数据文件

一个表空间可以有多个数据文件组成,当表空间的空间使用完或者数据文件达到最大值时,可以通过给表空间扩容的方式添加数据文件。

新建表空间方式添加数据文件:

CREATE TABLESPACE ts_yashan DATAFILE 
'/home/yashan/yashandb/yasdb_data/dbfiles/test01' size 100M autoextend OFF;

表空间扩容方式添加数据文件:

ALTER TABLESPACE ts_yashan ADD DATAFILE 
'/home/yashan/yashandb/yasdb_data/dbfiles/test02' size 100M autoextend OFF;

# 离线数据文件(单机部署中)

Warn:

生产系统上请谨慎操作。

某些场景下,例如数据文件损坏、不再使用或者需进行安全隔离,可能需要对指定的数据文件做离线(offline)处理(内置表空间的数据文件无法执行此操作)。

对于文件损坏等异常情况,只能在数据库为MOUNT状态时offline,其他情况建议在OPEN状态下进行offline。

Warn

对于文件正常使用的情况下,offline后其数据仍将正常被备份,因此不能对其进行更名或者外部删除等非法操作,否则会导致备份操作失败。 正常生产环境的dbfile如果offline时间过长,且在此期间生成的归档文件丢失,会导致该dbfile无法online,后续无法正常使用,请谨慎操作。 对于主备环境,建议在主机上执行offline,备机会自动同步offline操作,而不是在备机上执行offline,这将导致备机出现need repair异常。

执行offline的语法:

ALTER DATABASE DATAFILE 'datafile' OFFLINE;
ALTER DATABASE DATAFILE 'datafile' OFFLINE DROP;

数据库未开启归档时,必须指定DROP。

# 数据库文库损坏后的应急处理

# 场景

数据库中表空间下的数据文件发生丢失、损坏等情况,导致数据库无法正常启动。

# 措施

启用逃生通道,在数据库处于mount模式下将丢失或损坏的数据文件offline,然后打开数据库。

# 步骤

1.通过数据库启动时的报错信息或日志,定位出异常的数据文件:

$ open file /home/yashan/YASDB_DATA/dbfiles/SALES0 failed, errno 2, error message "No such file or directory"
Failed to start instance

或者在发现数据库为abnormal状态时,查询V$DIAG_INCIDENT排查是否因某个文件损坏导致abnormal。

2.启动数据库到mount状态:

$ yasboot cluster restart -c yashandb -m mount

3.将异常的数据文件offline:(当数据库未开启归档时,必须指定DROP选项,否则无须指定)

ALTER DATABASE DATAFILE 'SALES0' OFFLINE DROP;

4.此时可以正常打开数据库,数据文件对应表空间被offline:

ALTER DATABASE OPEN;
 
SELECT tablespace_name, status FROM DBA_TABLESPACES WHERE tablespace_name='SALES'; 
TABLESPACE_NAME                                                  STATUS    
---------------------------------------------------------------- --------- 
SALES                                                            OFFLINE  

5.对于异常数据文件的读取提示错误:

SELECT * FROM area;
YAS-02247 file 6 can not be read at this time

Note

1.主备环境中,在备机上也可执行上述操作,但会导致其状态被置为need repair,无法正常使用。

2.尽量只在主机上执行上述操作,通过主备同步,使备机上相应的数据文件也被offline。

3.本文所述场景、措施及操作并不涵盖内置表空间的数据文件,当内置表空间的数据文件发生丢失或损坏时,应使用物理恢复等其他手段。