【赵渝强老师】崖山数据库的物理存储结构

崖山数据库的物理存储结构就是指的YashanDB数据库在硬盘上存储的各种文件,包括:数据文件、联机日志文件、控制文件、归档日志文件、参数文件、告警日志文件、跟踪文件和备份文件等。下面分别介绍这些文件以及它们的作用。
![]() |
|---|
| 点击这里查看视频讲解:【赵渝强老师】崖山数据库的物理存储结构 |
数据文件(Data File)
一个数据库由多个表空间组成,而表空间可以由多个数据文件组成的,数据文件是真正存放数据库数据的。一个数据文件就是一个硬盘上的文件。表和索引中的数据在物理上是被存放在数据文件中的。当查询表中数据的时候,如果内存中没有该表的数据,那么YashanDB数据库的服务器进程将读取该表所在的数据文件,然后把数据存放到内存中。通过下面的语句可以查看当前数据库中存在的数据文件和对应的表空间:
SQL> select file_name,tablespace_name from dba_data_files;
# 输出的信息如下:
FILE_NAME TABLESPACE_NAME
------------------------------------------------------ -----------------
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp TEMP
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO
6 rows fetched.
当表空间中的数据文件写满时,可以通过下面的语句往表空间中添加新的数据文件。例如,往users表空间中添加一个10M大小的数据文件。
SQL> alter tablespace users
add datafile '/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02'
size 10M;
执行下面的语句重新查看YashanDB数据库的数据文件信息。
SQL> select file_name,tablespace_name from dba_data_files;
# 输出的信息如下:
FILE_NAME TABLESPACE_NAME
------------------------------------------------------- -----------------
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp TEMP
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02 USERS
7 rows fetched.
重做日志文件(Redo Log File)
一个数据库可以有多个联机重做日志文件,它记录了数据库的变化。例如,当YashanDB数据库产生异常时,导致对数据的改变没有及时写入到数据文件中。这时YashanDB数据库就会根据联机重做日志文件中的信息来获得数据库的变化信息,并根据这些信息把这些改变写到数据文件中。换句话来说,联机重做日志文件中记录的重做日志可以用来进行数据库实例的恢复。下图展示了YashanDB数据库写入数据的过程。

从上图可以看出,当前客户端成功提交事务时,数据有可能还没有写到数据文件上。如果此时数据库实例发生了崩溃,写入的数据是会丢失的。当重新启动数据库实例时,YashanDB会利用成功写入的重做日志来恢复实例在内存中的数据,这个过程叫做实例恢复。由YashanDB数据库的SMON进程自动完成。
通过下面的语句查看当前YashanDB数据库中存在的联机重做日志文件和对应的日志组信息。
SQL> select id,name,status from v$logfile;
# 输出的信息如下:
ID NAME STATUS
-- --------------------------------------------------- ---------
0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE
1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE
2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 CURRENT
3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE
4 rows fetched.
重做日志文件不同状态的含义如下:
-
NEW
未使用过的新文件。 -
CURRENT
当前正在写入的文件。当文件写满(即自动切换)或手动切换时,会选取一个NEW或INACTIVE状态的文件作为下一个CURRENT文件,原CURRENT文件会变为ACTIVE状态。如不存在NEW或INACTIVE状态的文件则会触发checkpoint。 -
ACTIVE
刚从CURRENT状态完成切换的文件,文件中可能存在部分内容暂未写入磁盘,或暂未归档(若已开启归档模式)。执行checkpoint并等待归档完成(若已开启归档模式)后,会变成INACTIVE状态。 -
INACTIVE
文件内容已全部写入磁盘,且已归档(若已开启归档模式)。
下面是关于重做日志文件的一些基本操作。
(1)添加新的重做日志文件。
SQL> alter database add logfile ('redo5' size 200m);
(2)重新查询已存在的重做日志文件。
SQL> select id,name,status from v$logfile;
# 输出的信息如下:
ID NAME STATUS
--- ---------------------------------------------------- ---------
0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE
1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE
2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 CURRENT
3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE
4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 NEW
5 rows fetched.
(3)切换重做日志文件。
SQL> alter system switch logfile;
(4)重新查询已存在的重做日志文件。
SQL> select id,name,status from v$logfile;
# 输出的信息如下:
ID NAME STATUS
--- ---------------------------------------------------- ---------
0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE
1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE
2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 ACTIVE
3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE
4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 CURRENT
5 rows fetched.
(5)触发一个检查点,并重新查询已存在的重做日志文件。
SQL> alter system checkpoint;
SQL> select id,name,status from v$logfile;
# 输出的信息如下:
ID NAME STATUS
--- ----------------------------------------------------- ---------
0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE
1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE
2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 INACTIVE
3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE
4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 CURRENT
5 rows fetched.
控制文件(Control File)
一个数据库至少要有一个控制文件,控制文件中存放了YashanDB数据库的物理结构信息。这些物理结构信息就包括:
(1)数据库的名字。
(2)数据文件和联机日志文件的名字及位置。
(3)创建数据库时的时间戳。
(4)备份的元信息。
YashanDB数据库在启动过程中,会根据控制文件中记录的数据文件和联机重做日志文件的位置信息来打开数据库。由于控制文件非常重要,为了更好的保护数据库,通常在执行数据库备份时是需要备份控制文件的。
可以通过下面的语句查看当前存在的控制文件。
SQL> select name from v$controlfile;
# 输出的信息如下:
NAME
----------------------------------------------------------------
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl1
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl2
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl3
3 rows fetched.
可以看到在默认情况下,YashanDB数据库有三个控制文件,这三个控制文件的内容是一样的。这样的方式称之为控制文件的多路复用。即使其中的一个控制文件出现了问题,YashanDB数据库也可以使用另一个控制文件。这样也不会因为数据库的损坏从而造成数据的丢失。
归档日志文件
归档日志文件是联机重做日志文件的副本,它也记录了对数据库改变的历史。下面的语句将查看当前数据库的日志模式。
SQL> select log_mode from v$database;
# 输出的信息如下:
LOG_MODE
-----------------
ARCHIVELOG
1 row fetched.
YashanDB数据库默认是归档模式。在归档模式下,YashanDB可以执行数据库的联机备份,或者叫做数据库的热备份;而在非归档模式下,YashanDB只能执行数据库的离线备份,或者叫做数据库的冷备份。
参数文件
配置参数文件是名为yasdb.ini的文本文件,存放在$YASDB_DATA/config路径下,产品安装时所指定的数据库初始配置参数将保存在此文件中,后续数据库运行过程中对配置参数的非memory修改也将持久化到此文件中。下面展示了参数文件的内容:
$ pwd
/home/yashan/yasdb/yasdb_data/db-1-1/config
$ cat yasdb.ini
# 输出的信息如下:
_CLUSTER_ID=2fd38e8003d1f864a081f24c187d4b2e
NODE_ID=1-1:1
CONTROL_FILES=('?/dbfiles/ctrl1', '?/dbfiles/ctrl2', '?/dbfiles/ctrl3')
ARCH_CLEAN_IGNORE_MODE=BACKUP
CGROUP_ROOT_DIR=/sys/fs/cgroup
LISTEN_ADDR=192.168.79.10:1688
REPLICATION_ADDR=192.168.79.10:1689
RUN_LOG_FILE_PATH=/home/yashan/yasdb/log/db-1-1/run
RUN_LOG_LEVEL=INFO
SLOW_LOG_FILE_PATH=/home/yashan/yasdb/log/db-1-1/slow
CHARACTER_SET=UTF8
TIME_ZONE = +08:00
DATA_BUFFER_SIZE = 512M
CHECKPOINT_TIMEOUT = 300
密码文件
密码文件是名为yasdb.pwd的文本文件,不可直接进行编辑,其路径受PASSWORD_FILE参数控制。该文件用于存储SYS用户的密码。
SQL> show parameter PASSWORD_FILE;
# 输出的信息如下:
NAME VALUE
----------------- -----------------------
PASSWORD_FILE ?/instance/yasdb.pwd
1 row fetched.
密码文件内容为加密后信息,虽然为文本文件,但不能直接修改里面的内容。
告警日志文件
告警日志文件按照时间的先后顺序,记录了数据库的重大活动和所发生的错误信息以及警告信息。因此,当YashanDB数据库出现任何问题的时候,首先就应当检查告警日志文件。警报文名字的格式是alert.log。警报文件的位置默认保存在了存放在$YASDB_DATA/log/alert目录下,如下所示:
$ pwd
/home/yashan/yasdb/yasdb_data/db-1-1/log/alert
$ tail alert.log
# 输出的信息如下:
2025-12-03 15:35:11.569|12|Incident|0|0||the incident was controlled by flood, problem id=4, last incident id=77
2025-12-03 15:45:38.294|12|Incident|0|0||the incident was controlled by flood, problem id=6, last incident id=80
2025-12-03 15:54:53.672|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=82
2025-12-03 17:10:29.602|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=87
2025-12-03 17:58:03.305|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=90
2025-12-03 18:11:16.950|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=91
2025-12-04 15:00:03.294|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=96
2025-12-04 15:50:00.629|12|Incident|0|0||the incident was controlled by flood, problem id=3, last incident id=107
2025-12-04 15:52:31.697|12|Incident|0|0||the incident was controlled by flood, problem id=2, last incident id=116
2025-12-04 15:52:32.767|12|Incident|0|0||the incident was controlled by flood, problem id=5, last incident id=118
跟踪文件
跟踪文件是每个YashanDB数据库服务器进程都有的日志文件。当数据库运行中出现问题时,通过查看跟踪文件中的内容可以帮助诊断YashanDB数据库的问题。因为每个服务器进程都会将错误信息写到跟踪文件中。因此,数据库管理员DBA就可以根据跟踪文件的信息来查看进程中所发生的错误。在默认情况下,YashanDB数据库的跟踪文件的位置保存在$YASDB_DATA/diag/trace/目录下。
备份文件
备份文件就是在数据库发生介质损坏的时候用来还原(Restore)数据库并执行恢复(Recover)数据的文件。


浙公网安备 33010602011771号