#redo日志文件管理

YashanDB的redo日志文件用于记录数据库产生的物理日志,可被用于数据库宕机重演和主备复制。

# 查看redo日志文件

# 查看物理文件

使用安装用户登录数据库所在服务器,进入redo日志文件的存放路径查看对应的物理文件,redo日志文件存放在$YASDB_DATA/dbfiles目录。

$ cd $YASDB_DATA/dbfiles
$ ls -lrt redo*
total 15456
-rw-r----- 1 yashan yashan 104857600 Jun 16 09:49 redo2
-rw-r----- 1 yashan yashan 104857600 Jun 16 09:49 redo3
-rw-r----- 1 yashan yashan 104857600 Jun 17 11:45 redo0
-rw-r----- 1 yashan yashan 104857600 Jun 18 15:15 redo1

# 通过视图查看

通过V$LOGFILE视图可以查看redo日志文件的信息。

SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;

THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
      1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
      1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 INACTIVE
      1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 CURRENT

redo日志文件的状态包括NEW、CURRENT、ACTIVE和INACTIVE,详细介绍如下表所示。

状态 说明
NEW 未使用过的新文件。
CURRENT 当前正在写入的文件。
当文件写满(即自动切换)或手动切换时,会选取一个NEW或INACTIVE状态的文件作为下一个CURRENT文件,原CURRENT文件会变为ACTIVE状态。
如不存在NEW或INACTIVE状态的文件则会触发checkpoint。
ACTIVE 刚从CURRENT状态完成切换的文件,文件中可能存在部分内容暂未写入磁盘,或暂未归档(若已开启归档模式)。
执行checkpoint并等待归档完成(若已开启归档模式)后,会变成INACTIVE状态。
INACTIVE 文件内容已全部写入磁盘,且已归档(若已开启归档模式)。

# 管理redo日志文件

YashanDB要求至少并存3个redo日志文件,且会默认创建3个名称为redo1/redo2/redo3,大小为128M,BLOCKSIZE为4K的redo日志文件。

redo日志文件是循环复用的,文件数量、单个文件的大小等均与数据库性能挂钩,且无法直接扩展redo日志的大小(需通过添加新的大文件+删除原有小文件的方式实现),应根据业务需求进行合理规划,详情请查阅数据库配置调优

在共享集群部署中,redo日志文件是各个实例独享的,添加/删除redo日志文件时需连接对应实例再操作其专属文件。

# 添加redo日志文件

若初始配置无法满足业务/性能需求,可通过ALTER DATABASE语句自定义添加redo日志文件。

# 前提条件

  • 添加redo日志文件要求数据库处于OPEN阶段。

  • 已按需规划redo日志文件的配置:

    • filename:文件名,可根据现存文件进行编号顺延。

    • SIZE:文件大小,可根据

    • BLOCKSIZE:文件的块大小,可省略,默认为4096,需指定为512的整数(若非整数倍则创建时自动向上取整)。

# 操作步骤

  1. 以DBA用户连接并登录数据库。

    $ yasql sales/********@192.168.1.2:1688
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 查看现有redo日志文件。

SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;

THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
      1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
      1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 INACTIVE
      1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 CURRENT
  1. 执行ALTER DATABASE ADD LOGFILE语句,添加新的redo日志文件。

    ALTER DATABASE ADD LOGFILE ('redo4q' SIZE 200M,'redo5' SIZE 64G BLOCKSIZE 4k,'redo6' SIZE 64G PARALLEL 8);
    
    SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;
    
    THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
    ------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
          1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
          1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 ACTIVE
          1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 CURRENT
          1            3 $YASDB_DATA/dbfiles/redo4                          4096                 51200                     0            0 NEW
          1            4 $YASDB_DATA/dbfiles/redo5                           4096              16777216                     0            0 NEW
          1            5 $YASDB_DATA/dbfiles/redo6                           4096              16777216                     0            0 NEW
    

# 切换redo日志文件

redo日志文件的切换方式分为:

  • 自动切换:CURRENT状态的redo日志文件写满时,数据库会自动选择一个处于NEW或INACTIVE状态的文件进行切换。如不存在NEW或INACTIVE状态的文件则会触发checkpoint。

  • 手动切换:

    • 单切换:执行ALTER SYSTEM SWITCH LOGFILE语句可强制切换redo日志文件,即使数据库处于归档模式,该操作仍不会自动归档。

    • 归档 + 切换:数据库处于归档模式时,执行ALTER SYSTEM ARCHIVE LOG CURRENT语句可归档当前CURRENT状态的redo日志文件,同时会切换redo日志文件。

-- 方式一:强制切换
ALTER SYSTEM SWITCH LOGFILE;

-- 方式二:在归档模式下,归档 + 切换
-- 查看当前数据库的归档模式
SELECT database_name,log_mode FROM V$DATABASE;

DATABASE_NAME    LOG_MODE          
---------------- -----------------
yashandb            ARCHIVELOG      
-- 确认LOG_MODE = ARCHIVELOG后才能执行后续操作
ALTER SYSTEM ARCHIVE LOG CURRENT;

-- 查看redo日志文件信息
SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;

THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
      1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
      1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 INACTIVE
      1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 ACTIVE
      1            3 $YASDB_DATA/dbfiles/redo4                          4096                 51200                     2            4 CURRENT
      1            4 $YASDB_DATA/dbfiles/redo5                           4096              16777216                     0            0 NEW
      1            5 $YASDB_DATA/dbfiles/redo6                           4096              16777216                     0            0 NEW

# 删除redo日志文件

如发生下述情况,可通过ALTER DATABASE语句删除redo日志:

  • 磁盘发生故障时,可通过删除故障磁盘上redo日志文件避免写入不可访问的文件。

  • redo日志文件存储在不恰当的位置。

  • 通过增加更大的redo日志文件 + 删除原有的小文件实现redo文件容量扩展。

Caution:

为了保证数据库正常运行以及数据安全,仅允许直接删除NEW或INACTIVE状态的redo日志文件。

# 前提条件

添加redo日志文件要求数据库处于OPEN阶段。

# 操作步骤

  1. 以DBA用户连接并登录数据库。

    $ yasql sales/********@192.168.1.2:1688
    YashanDB SQL Enterprise Edition Release {version_number} x86_64
    
    Connected to:
    YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux
    
    SQL> 
    
  2. 查看现有redo日志文件。

    SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;
    
    THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
    ------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
          1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
          1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 INACTIVE
          1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 ACTIVE
          1            3 $YASDB_DATA/dbfiles/redo4                          4096                 51200                     2            4 CURRENT
          1            4 $YASDB_DATA/dbfiles/redo5                           4096              16777216                     0            0 NEW
          1            5 $YASDB_DATA/dbfiles/redo6                           4096              16777216                     0            0 NEW
    
  3. 根据目标文件的状态选择操作步骤:

    直接执行ALTER DATABASE DROP LOGFILE语句即可删除NEW或INACTIVE状态的redo日志文件。

    ALTER DATABASE DROP LOGFILE 'redo6';
    
    SELECT thread#,id,name,block_size,block_count,used_blocks,SEQUENCE#,status FROM V$LOGFILE;
    
    THREAD#           ID NAME                                                               BLOCK_SIZE           BLOCK_COUNT           USED_BLOCKS    SEQUENCE# STATUS
    ------- ------------ ---------------------------------------- ------------ --------------------- --------------------- ------------ -----------------
          1            0 $YASDB_DATA/dbfiles/redo1                           4096                 32768                  7482            1 INACTIVE
          1            1 $YASDB_DATA/dbfiles/redo2                           4096                 32768                 32768            2 INACTIVE
          1            2 $YASDB_DATA/dbfiles/redo3                           4096                 32768                  8200            3 ACTIVE
          1            3 $YASDB_DATA/dbfiles/redo4                          4096                 51200                     2            4 CURRENT
          1            4 $YASDB_DATA/dbfiles/redo5                           4096              16777216                     0            0 NEW
    
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流