#实例启停

# 启停流程及运行模式介绍

本文主要介绍启动单机部署和存算一体分布式集群部署的实例,如需了解共享集群的实例启动请查阅共享集群启停

# 数据库实例启动三阶段

数据库实例从关闭启动到正常使用,要经过NOMOUNT、MOUNT和OPEN三个阶段。

  • NOMOUNT:启动数据库实例,此时读取参数文件,但不加载数据库;本阶段仅允许sys用户登录。

  • MOUNT:启动数据库实例,读取控制文件,加载数据库,但数据库处于关闭状态;本阶段仅允许sys用户登录。

  • OPEN:启动数据库实例,加载并打开数据库。打开数据库时还可以按需选择数据库运行模式为READWRITE、READONLY或RESETLOGS。

可通过V$INSTANCE视图查看数据库实例运行状态。

$ yasql sys/********@192.168.1.2:1688

SQL> SELECT status FROM V$INSTANCE;
 
STATUS   
---------
MOUNTED 

# 数据库运行模式

数据库实例从NOMOUNT或MOUNT阶段启动到OPEN阶段时,支持READWRITE、READONLY、RESETLOGS和UPGRADE四种打开模式。

  • READWRITE:数据库默认打开为READWRITE模式,该模式下数据库支持完整的事务读写操作,用于正式生产环境。

  • READONLY:以只读模式打开数据库,限制数据库只读,不产生任何redo。单机主备部署时,物理备库默认使用该方式打开数据库。

  • UPGRADE:数据库升级时,升级工具yasboot使用此模式打开数据库,该模式下不允许建立新的会话连接,也不允许以该模式手动OPEN数据库。

  • RESETLOGS:当数据库进行了PITR(基于时间点的恢复)、数据库闪回或逻辑备库配置时,如果无法进行完全恢复,则需要通过RESETLOGS模式打开数据库,该模式将重新设置redo日志号。

    Caution:

    • 实际使用过程中,单机主备部署的物理备库均建议使用READONLY模式打开;该模式不适用于分布式、共享集群部署。
    • 若执行完全恢复操作时使用RESETLOGS模式打开数据库,会报YAS-02184错误并关闭实例。

# 操作准备

数据库实例启动时须确保yasom和yasagent进程处于开启状态,否则启停工具yasboot将提示connect: connection refused错误。通过ps -ef | grep -E "yasom|yasagent|yasdb"命令请确认数据库服务进程正常运行。

服务器重启时,yasom和yasagent进程会自动关闭,默认情况下数据库服务不会自动拉起,可参考如下操作以数据库安装用户重新拉起数据库服务;也可通过注册开机自启动功能于服务器重启时自动拉起yasom和yasagent进程,具体操作请查阅配置开机自启动

# 手动启动yasom和yasagent进程
$ yasboot process yasom start -c yashandb -t /home/yashan/install/hosts.toml
$ yasboot process yasagent start -c yashandb -t /home/yashan/install/hosts.toml

# 待yasom和yasagent进程启动后,才能启动数据库
$ yasboot cluster start -c yashandb -p sys_password

# 按需启动守护进程
$ yasboot monit start --cluster yashandb

# 启动数据库实例

  • yasboot工具:YashanDB支持通过yasboot工具将数据库实例调整至任意阶段。
  • SQL语句:YashanDB支持通过ALTER DATABASE语句将数据库实例从NOMOUNT阶段调整到MOUNT阶段或OPEN阶段,但ALTER DATABASE语句仅对语句执行实例生效。

# 启动到NOMOUNT阶段

以数据库安装用户使用yasboot工具将数据库实例启动到NOMOUNT阶段,命令如下:

# 方式一:先关闭然后启动数据库集群至NOMOUNT阶段
$ yasboot cluster stop -c yashandb -p sys_password
$ yasboot cluster start -c yashandb -p sys_password -m nomount
# 方式二:一键重启数据库集群至NOMOUNT阶段
$ yasboot cluster restart -c yashandb -p sys_password -m nomount

# 启动group_id为1的节点组至NOMOUNT阶段
$ yasboot group start -c yashandb -g 1 -p sys_password -m nomount
# 启动node_id为4-1的节点至NOMOUNT阶段
$ yasboot node start -c yashandb -n 4-1 -p sys_password -m nomount

数据库实例启动到NOMOUNT阶段后,查看V$INSTANCE视图的STATUS字段值为STARTED。

$ yasql sys/********@192.168.1.2:1688

SQL> SELECT status FROM V$INSTANCE;
 
STATUS   
---------
STARTED 

# 启动到MOUNT阶段

  • yasboot工具:可以通过数据库安装用户将数据库实例从任意阶段调整至MOUNT阶段。
  • SQL语句:以sys用户连接数据库,通过ALTER DATABASE语句将数据库实例从NOMOUNT阶段调整至MOUNT阶段。
# 方式一:先关闭然后启动数据库集群至MOUNT阶段
$ yasboot cluster stop -c yashandb -p sys_password
$ yasboot cluster start -c yashandb -p sys_password -m mount
# 方式二:一键重启数据库集群至MOUNT阶段
$ yasboot cluster restart -c yashandb -p sys_password -m mount

# 启动group_id为1的节点组至MOUNT阶段
$ yasboot group start -c yashandb -g 1 -p sys_password -m mount
# 启动node_id为4-1的节点至MOUNT阶段
$ yasboot node start -c yashandb -n 4-1 -p sys_password -m mount

数据库实例启动到MOUNTED阶段后,以任意用户连接数据库查看V$INSTANCE视图的STATUS字段值已更新为MOUNTED。

$ yasql sys/********@192.168.1.2:1688

SQL> SELECT status FROM V$INSTANCE;
 
STATUS   
---------
MOUNTED 

# 启动到OPEN阶段

可以通过以下两种方式将数据库启动到OPEN阶段:

  • yasboot工具:可以通过数据库安装用户将数据库实例从任意阶段调整至OPEN阶段。
  • SQL语句:以sys用户连接数据库,通过ALTER DATABASE语句将数据库实例从NOMOUNT阶段或MOUNT阶段调整至OPEN阶段。
# yasboot工具:
# 方式一:先关闭然后启动数据库集群至OPEN阶段
$ yasboot cluster stop -c yashandb -p sys_password
$ yasboot cluster start -c yashandb -p sys_password -m open
# 方式二:一键重启数据库集群至OPEN阶段
$ yasboot cluster restart -c yashandb -p sys_password -m open

# 启动group_id为1的节点组至OPEN阶段
$ yasboot group start -c yashandb -g 1 -p sys_password -m open
# 启动node_id为4-1的节点至OPEN阶段
$ yasboot node start -c yashandb -n 4-1 -p sys_password -m open

数据库实例启动到OPEN阶段后,查看V$INSTANCE视图的STATUS字段值已更新为OPEN。

$ yasql sales/********@192.168.1.2:1688

SQL> SELECT status FROM V$INSTANCE;
 
STATUS   
---------
OPEN 

可通过数据库V$DATABASE视图查看数据库打开模式。

SELECT database_id,database_name,open_mode FROM V$DATABASE;
 
    DATABASE_ID DATABASE_NAME    OPEN_MODE       
--------------- ---------------- -----------------
      569377301 yasdb            READ_WRITE   

主备部署时,还需关注主备角色的DATABASE_ROLE字段。

SELECT DATABASE_NAME,LOG_MODE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,BLOCK_SIZE,STATUS FROM  V$DATABASE;
  
DATABASE_NAME LOG_MODE    OPEN_MODE   PROTECTION_MODE      DATABASE_ROLE  BLOCK_SIZE STATUS
------------- ----------- ----------- -------------------- ------------- ----------- -------
yasdb         ARCHIVELOG  READ_ONLY   MAXIMUM PERFORMANCE  STANDBY              8192 NORMAL

# 关闭数据库实例

  • yasboot工具:YashanDB支持通过yasboot工具关闭数据库实例。
  • SQL语句:YashanDB支持通过SHUTDOWN语句关闭数据库实例,但SHUTDOWN语句仅对语句执行实例生效。

本文主要介绍关闭单机部署和存算一体分布式集群部署的实例,如需了解共享集群的实例关闭操作请查阅共享集群启停

# 关库模式

YashanDB支持按以下3种模式关闭数据库实例:

  • NORMAL:等待事务正常结束后关闭数据库,没有等待时间限制,建议选择该模式关闭数据库。

  • IMMEDIATE:强制中断所有数据库操作,将未完成的事务回退,等待脏页刷盘后关闭数据库。

  • ABORT:强制中断所有数据库操作并关闭数据库,不等待脏页刷盘。这种关闭模式不等待脏页刷盘,会使启动时间变长。

Caution:

仅当服务器宕机、断电或人为强制关库时才建议使用ABORT模式,否则应避免使用该模式。

# 关闭操作

yasboot工具和SQL语句均可以按指定模式关闭数据库实例,命令/语句如下:

# 可使用-s参数指定关库模式,省略则默认为IMMEDIATE
$ yasboot cluster stop -c yashandb -p sys_password
$ yasboot cluster stop -c yashandb -p sys_password -s normal
$ yasboot cluster stop -c yashandb -p sys_password -s immediate
$ yasboot cluster stop -c yashandb -p sys_password -s abort

# 关闭group_id为1的节点组
$ yasboot group stop -c yashandb -g 1 -p sys_password
# 关闭node_id为4-1的节点
$ yasboot node stop -c yashandb -n 4-1 -p sys_password -s normal

# 配置开机自启动

当数据库服务器因外界因素导致重启时,默认情况下数据库服务不会自动拉起,可根据需要配置数据库服务开机自启动。

  1. 创建并编写服务启动脚本。

    脚本内容仅为示例,路径、变量值等信息需根据实际情况进行改写。

    $ sudo vi /usr/local/bin/yashan_monit.sh
    
    #!/bin/bash
    MONIT_AUTOSTART="true"                  # 是否监控monit进程,true表示是,其他值表示否
    YASDB_USER=yashan                               # YashanDB的安装用户
    YASDB_HOME=/data/yashan/yasdb_home/{version_number}     # YashanDB的HOME目录
    INTERVAL=3                                # 监控间隔,单位为秒,定期根据进程名监控对应进程是否正常,若否则重新启动
    
    # 加载YashanDB环境变量
    env LD_LIBRARY_PATH=$YASDB_HOME/lib
    
    while true; do    
        if "$MONIT_AUTOSTART" = "true"; then
            if ! pgrep -a monit | grep "$YASDB_HOME" > /dev/null; then
                echo "$(date) monit abnormal, try restart..." 
                su - $YASDB_USER -c "source ~/.bashrc && $YASDB_HOME/om/bin/monit -c $YASDB_HOME/om/monit/monitrc" &
            fi
        fi
        sleep "$INTERVAL"
    done
    
  2. 赋予脚本可执行权限。

    $ sudo chmod +x /usr/local/bin/yashan_monit.sh
    
  3. 创建并编写服务单元配置文件。

    $ sudo vi /etc/systemd/system/yashan_monit.service
    
    [Unit]
    Description=Yashan Monitor
    After=network.target
    
    [Service]
    ExecStart=/usr/local/bin/yashan_monit.sh
    Type=simple
    Restart=always
    StandardOutput=syslog
    StandardError=syslog
    
    [Install]
    WantedBy=multi-user.target
    
    
  4. 生效并启动服务。

    $ sudo systemctl daemon-reload
    
    $ sudo systemctl enable yashan_monit
    Created symlink from /etc/systemd/system/multi-user.target.wants/yashan_monit.service to /etc/systemd/system/yashan_monit.service.
    
    $ sudo systemctl start yashan_monit
    
  5. 检查服务状态。

    $ systemctl status yashan_monit
    yashan_monit.service - Yashan Monitor
    Loaded: loaded (/etc/systemd/system/yashan_monit.service; enabled; vendor preset: disabled)
    Active: active (running) since Thu 2025-06-12 10:41:01 CST; 4s ago
    Main PID: 3580 (yashan_monit.sh)
    CGroup: /system.slice/yashan_monit.service
           ├─3580 /bin/bash /usr/local/bin/yashan_monit.sh
           └─3589 sleep 3
    
  6. (可选)若后续无需开机自启动,需执行如下命令禁用服务。

    $ sudo systemctl stop yashan_monit
    
    $ sudo systemctl disable yashan_monit
    Removed symlink /etc/systemd/system/multi-user.target.wants/yashan_monit.service.
    
    $ systemctl status yashan_monit
    ● yashan_monit.service - Yashan Monitor
        Loaded: loaded (/etc/systemd/system/yashan_monit.service; disabled; vendor preset: disabled)
        Active: inactive (dead)
    

# 启动实例失败场景处理方法

# 环境变量未设置或错误

以下为YashanDB实例成功启动的三个关键环境变量,设置错误将导致无法启动到NOMOUNT及之后阶段,请根据实际情况将环境变量调整至正确值:

  • YASDB_HOME:YashanDB默认软件目录
  • YASDB_DATA:YashanDB默认数据目录
  • LD_LIBRARY_PATH:YashanDB依赖包目录,使用yasboot sql或yaql前必须先正确配置该环境变量

# 控制文件验证失败

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参数,再重新启动实例。

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

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

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

# 数据文件丢失或损坏

  • 内置表空间数据文件丢失或损坏

    如出现内置表空间数据文件丢失或损坏的情况,实例将无法启动到MOUNT及之后阶段。

    此种情况下,通常可以通过恢复最新的可用备份集解决,若不存在备份集则只能通过找回文件、物理恢复等方式解决。

  • 用户数据文件丢失或损坏

    当用户表空间挂载的数据文件出现丢失或损坏时,通常可以通过恢复最新的可用备份集解决,若不存在备份集则可通过YashanDB提供的逃生通道进行应急处理,保证数据库能正常启动、打开和运行,具体操作请查阅数据文件损坏后的应急处理

# redo文件丢失或损坏

如出现redo文件丢失或损坏的情况,实例将无法启动到MOUNT及之后阶段。

此种情况下,可通过恢复最新的可用备份集解决。

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