#控制文件管理

控制⽂件是YashanDB最关键的物理⽂件之⼀,是数据库实例挂载的⼊⼝。它记录了数据库的物理结构(例如数据库名、数据⽂件和重做⽇志⽂件的位置和名称、创建时间戳)以及状态信息(例如当前⽇志序列号、检查点SCN、归档⽇志信息、RMAN备份信息),充当数据库实例启动、运⾏和恢复操作所必需的核⼼信息。数据库启动时必须读取控制⽂件以定位其他⽂件并验证完整性,并在运⾏过程中不断更新以反映数据库结构变化和当前状态,是数据库⼀致性维护和故障恢复的基⽯。

YashanDB中,数据库每个实例节点上的控制文件数及文件存储路径配置相互独立,相关配置由配置参数CONTROL_FILES指定,默认配置如下:

相关配置 默认值
控制文件数量 3个
互为副本,最多支持8个
控制文件名称 单机部署、存算一体分布式集群部署:ctrl1、ctrl2、ctrl3
共享集群/分布式集群部署:ctrlfile0、ctrlfile1、ctrlfile2
控制文件存储路径 单机部署、存算一体分布式集群部署:$YASDB_DATA/dbfiles
共享集群/分布式集群部署:+DG0/dbfiles

在实际使用中,应根据实际的磁盘空间规划、容灾需求、IO性能优化方案等自定义规划控制文件数量及其存放路径,具体配置方式如下:

  • 安装数据库时

    • (推荐)在{集群名称}.toml文件中指定配置参数CONTROL_FILES配置控制文件的数量及各个文件的存放路径。

    • 单机或存算一体分布式集群部署时,可以在{集群名称}.toml文件中指定建库参数CTRL_FILE_NUM配置控制文件的数量,但单纯只指定CTRL_FILE_NUM时所有控制文件的存放路径均为$YASDB_DATA/dbfiles。

  • 安装完成后

    • 对于已有数据库,可通过配置参数CONTROL_FILES调整控制文件的数量及各个文件的存放路径。

    • 新建数据库时,在执行CREATE DATABASE时可通过CONTROLFILES关键字指定控制文件的数量及各个文件的存放路径。

控制文件的信息由数据库自动维护,不允许手动操作控制文件,否则会导致数据库出现预期外的异常。

本文主要介绍安装完成后如何查看控制文件配置、调整已有控制文件的路径、增/减文件副本、备份与恢复控制文件以及常见的异常处理等。

# 查看控制文件信息

# 通过配置参数查看

通过配置参数CONTROL_FILES可以查看控制文件信息,且数据库处于NOMOUNT、MOUNT或OPEN任意阶段均可。

以安装用户登录数据库所在服务器,执行如下命令即可查询相应信息。

# 场景1:查看全局的控制文件配置
$ yasboot cluster config show -c yashandb -q CONTROL_FILES

# 场景2:查看指定节点的控制文件配置(本文以1-1节点为例)
$ yasboot node config show -c yashandb --node-id 1-1 -q CONTROL_FILES

# 通过视图查看

通过GV$CONTROLFILE/V$CONTROLFILE视图可以查看全局或当前节点的控制文件信息,要求数据库处于MOUNT或OPEN阶段。

单机部署中,通过动态视图仍只能查询当前节点上的相关信息。

SELECT ID,NAME,BLOCK_SIZE,FILE_SIZE_BLKS,BYTES FROM V$CONTROLFILE;

  ID NAME                                                BLOCK_SIZE FILE_SIZE_BLKS       BYTES
---- ------------------------------------------------- ------------ -------------- -----------
   0 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1            8192           3507    28729344
   1 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2            8192           3507    28729344
   2 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3            8192           3507    28729344

# 调整现有控制文件的路径

出于以下影响因素考量,可按需调整现有控制文件的路径:

  • 控制文件所在路径磁盘空间不足。

  • 为避免I/O瓶颈,将控制文件分散到不同的物理磁盘上。

  • 为提高系统容灾能力,将控制文件放在不同的物理磁盘。

Warn:

请勿单独在操作系统层面移动控制文件。

# 前提条件

  • 调整现有控制文件的路径需重启待调整配置的目标数据库节点(后文简称“目标节点”)。

  • 如需移动现有控制文件至其他路径,必须严格遵守如下操作顺序:

    1. 修改控制文件路径配置(CONTROL_FILES参数)。

    2. 关闭目标节点。

    3. 移动对应的物理文件至目标路径。

    4. 启动目标节点。

  • 在目标节点所在服务器上为目标控制文件规划并创建新存储路径(单次操作可调整多个文件的路径),YashanDB的安装用户(即yashan)需具备对应路径的全部权限。

# 操作步骤

本文以调整运行状态下的测试环境的现有控制文件ctrl3的路径为例,实际操作时需将路径、用户等示例值替换为实际值。

  1. 以安装用户登录数据库安装服务器。

  2. 获取目标节点相关信息。

    # 查看节点ID
    $ yasboot cluster status -c yashandb -d
    
    # 查看目标节点的控制文件配置(本文以1-1节点为例)
    $ yasboot node config show -c yashandb --node-id 1-1 -q control_files
    +---------------------------------------------------------------------------------------------------------------------------------+
    | parameters    | area                                     | default_value                  | current_value                       |
    +---------------------------------------------------------------------------------------------------------------------------------+
    | CONTROL_FILES | (控制文件1, 控制文件2, …控制文件n)      | ('?/dbfiles/ctrl1', '?/dbfiles | ('?/dbfiles/ctrl1', '?/dbfiles/ctrl |
    |               |                                          | /ctrl2', '?/dbfiles/ctrl3')    | 2', '?/dbfiles/ctrl3')              |
    +---------------+------------------------------------------+--------------------------------+-------------------------------------+
    
  3. 修改目标节点的控制文件配置参数。

    # 修改目标节点的控制文件配置参数,将ctrl3的路径修改为新规划的目标路径
    $ yasboot node config set -c yashandb --node-id 1-1 -k control_files -v ('/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1','/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2','/data/yashan/yasdb_data/db-1-1/backup/ctrl3')
    

    此时不会校验新路径是否存在、是否可访问。

  4. 关闭目标节点。

    $ yasboot node stop -c yashandb -n 1-1
    
  5. 以安装用户登录目标节点所在服务器。

  6. 在操作系统层面移动物理文件ctrl3。

    $ mv /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3 /data/yashan/yasdb_data/db-1-1/backup/ctrl3
    
  7. 在操作系统层面,检查确认物理文件ctrl3的存储路径。

    ls -l /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1
    ls -l /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2
    ls -l /data/yashan/yasdb_data/db-1-1/backup/ctrl3
    
  8. 启动目标节点。

    $ yasboot node start -c yashandb -n 1-1
    

    如果数据库节点启动成功,表示修改控制文件路径成功。如果启动失败并提示控制文件相关异常,请查阅控制文件相关异常处理

  9. 以DBA用户连接并登录数据库目标节点。

    $ yasql sales/********@192.168.1.2:1688 
    
  10. 在数据库层面,检查确认控制文件ctrl3的存储路径。

    SELECT ID,NAME,BLOCK_SIZE,FILE_SIZE_BLKS,BYTES FROM V$CONTROLFILE;
      ID NAME                                                BLOCK_SIZE FILE_SIZE_BLKS       BYTES
    ---- ------------------------------------------------- ------------ -------------- -----------
      0 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1            8192           3507    28729344
      1 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2            8192           3507    28729344
      2 /data/yashan/yasdb_data/db-1-1/backup/ctrl3             8192           3507    28729344
    

# 新增控制文件

出于以下影响因素考量,可按需增加控制文件副本数:

  • 为提高容错能力、防止单点故障,可以增加副本数。

  • 为满足更严格的高可用需求,在关键生产环境中增加更多的副本数。

# 前提条件

  • 新增控制文件副本需重启待调整配置的目标数据库节点(后文简称“目标节点”)。

  • 在目标节点所在服务器上为新控制文件副本规划并创建新存储路径(单次操作可新增多个文件副本),YashanDB的安装用户(即yashan)需具备对应路径的全部权限。

  • 根据现有控制文件数确认新副本的文件名,文件名格式为ctrlN(通常,N按控制文件总数顺序编号)。

# 操作步骤

本文以为运行状态下的测试环境新增1个控制文件副本ctrl4为例,实际操作时需将路径、用户等示例值替换为实际值。

  1. 以安装用户登录数据库安装服务器。

  2. 获取目标节点相关信息。

    # 查看节点ID
    $ yasboot cluster status -c yashandb -d
    
    # 查看目标节点的控制文件配置(本文以1-1节点为例)
    $ yasboot node config show -c yashandb --node-id 1-1 -q control_files
    +---------------------------------------------------------------------------------------------------------------------------------+
    | parameters    | area                                     | default_value                  | current_value                       |
    +---------------------------------------------------------------------------------------------------------------------------------+
    | CONTROL_FILES | (控制文件1, 控制文件2, …控制文件n)      | ('?/dbfiles/ctrl1', '?/dbfiles | ('?/dbfiles/ctrl1', '?/dbfiles/ctrl |
    |               |                                          | /ctrl2', '?/dbfiles/ctrl3')    | 2', '?/dbfiles/ctrl3')              |
    +---------------+------------------------------------------+--------------------------------+-------------------------------------+
    
  3. 修改目标节点的控制文件配置参数。

    # 修改目标节点的控制文件配置参数,新增1个控制文件的信息
    $ yasboot node config set -c yashandb --node-id 1-1 -k control_files -v ('/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1','/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2','/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3','/data/yashan/yasdb_data/db-1-1/backup/ctrl4')
    

    此时不会校验新文件是否存在、路径是否可访问。

  4. 关闭目标节点。

    $ yasboot node stop -c yashandb -n 1-1
    
  5. 以安装用户登录目标节点所在服务器。

  6. 在操作系统层面,基于已有控制文件在目标路径下复制生成新的文件ctrl4。

    $ cp /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3 /data/yashan/yasdb_data/db-1-1/backup/ctrl4
    
  7. 在操作系统层面,检查确认物理文件ctrl4。

    ls -l /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3    
    ls -l /data/yashan/yasdb_data/db-1-1/backup/ctrl4
    
  8. 启动目标节点。

    $ yasboot node start -c yashandb -n 1-1
    

    如果数据库节点启动成功,表示修改控制文件路径成功。如果启动失败并提示控制文件相关异常,请查阅控制文件相关异常处理

  9. 以DBA用户连接并登录数据库目标节点。

    $ yasql sales/********@192.168.1.2:1688 
    
  10. 在数据库层面,检查确认控制文件ctrl4。

    SELECT ID,NAME,BLOCK_SIZE,FILE_SIZE_BLKS,BYTES FROM V$CONTROLFILE;
      ID NAME                                                BLOCK_SIZE FILE_SIZE_BLKS       BYTES
    ---- ------------------------------------------------- ------------ -------------- -----------
      0 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1            8192           3507    28729344
      1 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2            8192           3507    28729344
      2 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl3            8192           3507    28729344
      3 /data/yashan/yasdb_data/db-1-1/backup/ctrl4             8192           3507    28729344
    

# 备份与恢复控制文件

调整现有控制文件的路径、新增控制文件副本均属于保障控制文件高可用的方式。同时,也可以通过备份与恢复进一步提高控制文件的高可用能力。

在YashanDB中,备份与恢复控制文件通过备份与恢复整个数据库实现,具体操作请查阅备份与恢复

# 删除控制文件

出于以下影响因素考量,可按需减少控制文件副本数(一般不推荐):

  • 磁盘资源紧张,减少非必要副本。

Warn:

必须保留至少1个控制文件。

# 前提条件

删除控制文件副本需重启待调整配置的目标数据库节点(后文简称“目标节点”)。

# 操作步骤

本文以为运行状态下的测试环境删除1个控制文件副本为例,实际操作时需将路径、用户等示例值替换为实际值。

  1. 以安装用户登录数据库安装服务器。

  2. 获取目标节点相关信息。

    # 查看节点ID
    $ yasboot cluster status -c yashandb -d
    
    # 查看目标节点的控制文件配置(本文以1-1节点为例)
    $ yasboot node config show -c yashandb --node-id 1-1 -q control_files
    +---------------------------------------------------------------------------------------------------------------------------------+
    | parameters    | area                                     | default_value                  | current_value                       |
    +---------------------------------------------------------------------------------------------------------------------------------+
    | CONTROL_FILES | (控制文件1, 控制文件2, …控制文件n)      | ('?/dbfiles/ctrl1', '?/dbfiles | ('?/dbfiles/ctrl1', '?/dbfiles/ctrl |
    |               |                                          | /ctrl2', '?/dbfiles/ctrl3')    | 2', '?/dbfiles/ctrl3')              |
    +---------------+------------------------------------------+--------------------------------+-------------------------------------+
    
  3. 修改目标节点的控制文件配置参数。

    # 修改目标节点的控制文件配置参数,删除控制文件ctrl3的信息
    $ yasboot node config set -c yashandb --node-id 1-1 -k control_files -v ('/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1','/data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2')
    

    按需删除物理文件ctrl3。

  4. 重启目标节点使配置生效。

    $ yasboot node restart -c yashandb -n 1-1
    
  5. 以DBA用户连接并登录数据库目标节点。

    $ yasql sales/********@192.168.1.2:1688 
    
  6. 检查确认控制文件信息。

    SELECT ID,NAME,BLOCK_SIZE,FILE_SIZE_BLKS,BYTES FROM V$CONTROLFILE;
      ID NAME                                                BLOCK_SIZE FILE_SIZE_BLKS       BYTES
    ---- ------------------------------------------------- ------------ -------------- -----------
      0 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl1            8192           3507    28729344
      1 /data/yashan/yasdb_data/db-1-1/dbfiles/ctrl2            8192           3507    28729344
    

# 常见异常处理

YashanDB在实例启动时进行控制文件校验,出现如下情况时,实例将无法启动到MOUNT及之后阶段:

  • 控制文件实际路径与CONTROL_FILES参数配置路径不一致

    启动数据库实例时,若出现类似failed to open file …… , errno 2, error message "No such file or directory"报错则说明控制文件实际路径与CONTROL_FILES参数配置路径不一致,解决方法如下:

    • 方法一:在操作系统层面调整控制文件的路径,或通过现有文件在提示信息对应的路径下生成相应的新文件。

    • 方法二:启动实例到NOMOUNT阶段后修改CONTROL_FILES参数,再重新启动实例。

  • 控制文件中的数据库版本与实例版本不一致

    启动数据库实例时,若出现类似database version x.x.x incompatible with YashanDB version x.x.x提示则说明控制文件中的数据库版本与实例版本不一致,请根据实际情况选择是否进行版本升级。

  • 控制文件组成员的数据库ID不一致

    启动数据库实例时,若出现类似database id of the control file does not match other control files提示则说明控制文件组成员的数据库ID不一致,通常出现在同1台服务器上存在多个数据库实例的场景,CONTROL_FILES参数可能误配成了其他数据库的控制文件,将其修改为正确的控制文件路径即可。

  • 全套控制文件均与数据库不匹配

    启动数据库实例时,若出现类似invalid file: ……, the reason: mismatching with the control file提示则说明全套控制文件均与数据库不匹配,解决方法如下:

    • 方法一:在操作系统层面找到正确的控制文件并将其移动至正确路径。

    • 方法二:启动实例到NOMOUNT阶段后修改CONTROL_FILES参数,再重新启动实例。

    • 方式三:恢复最新的可用备份集。

  • 所有控制文件均已丢失或损坏

    若所有控制文件的物理文件均已丢失或损坏,则只能通过恢复最新的可用备份集解决。

edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流