#实例启停
# 启停流程及运行模式介绍
本文主要介绍启动单机部署和存算一体分布式集群部署的实例,如需了解共享集群的实例启动请查阅共享集群启停。
# 数据库实例启动三阶段
数据库实例从关闭启动到正常使用,要经过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
# 配置开机自启动
当数据库服务器因外界因素导致重启时,默认情况下数据库服务不会自动拉起,可根据需要配置数据库服务开机自启动。
创建并编写服务启动脚本。
脚本内容仅为示例,路径、变量值等信息需根据实际情况进行改写。
$ 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赋予脚本可执行权限。
$ sudo chmod +x /usr/local/bin/yashan_monit.sh创建并编写服务单元配置文件。
$ 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生效并启动服务。
$ 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检查服务状态。
$ 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(可选)若后续无需开机自启动,需执行如下命令禁用服务。
$ 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及之后阶段。
此种情况下,可通过恢复最新的可用备份集解决。

