【数据库启停】运维速查:Linux上Oracle / MySQL / SQL Server 启停命令全清单(带注释)

sql 复制代码
══════════════════════════════════════════════════════════════
Linux 操作系统:Oracle / MySQL / SQL Server 常见启动与停止命令(完整版·带注释)
(覆盖:systemd + 官方工具 + 数据库内部命令 + 基本探活)
══════════════════════════════════════════════════════════════

一、Oracle(单实例 / GI / RAC)

【0. 说明(Oracle 启停前的"老规矩")】
- 一般用 oracle 用户做数据库启停;有 GI/RAC/ASM 的,用 grid 用户 + srvctl 更规范
- 操作前确认 ORACLE_SID / ORACLE_HOME(避免"停错库"这种工伤)
- 生产停库优先 shutdown immediate;abort 属于"断电",最后手段

──────────────────────────────────────────────────────────────
1) 单实例(非 RAC)--- SQL*Plus 启停数据库(数据库内部命令)
──────────────────────────────────────────────────────────────

进入(oracle 用户):
  su - oracle                           # 切到 oracle 用户(加载 profile)
  export ORACLE_SID=ORCL                # 指定要操作的实例名(关键!)
  sqlplus / as sysdba                   # 本机 OS 认证登录(需要 OSDBA 权限)

启动:
  startup;                              # 启动实例 + mount + open(完整启动)
  -- startup mount;                     # 启到 MOUNT:常用于恢复/切换归档/维护控制文件
  -- startup nomount;                   # 启到 NOMOUNT:常用于建库、重建控制文件等

停止:
  shutdown immediate;                   # 推荐:尽快干净停库,回滚未提交事务、断开会话
  -- shutdown transactional;            # 等现有事务结束再停(更温和,但可能等很久)
  -- shutdown abort;                    # 强制停(相当于"拔电源")
                                        # 典型后续:startup(让实例起来做恢复)再 shutdown immediate

补充(只停实例不关库?一般不建议乱用):
  -- alter system disable restricted session;  # 示例:解除限制(非停库命令,仅举例)
  -- alter system enable restricted session;   # 示例:限制新连接(维护场景可能用)

──────────────────────────────────────────────────────────────
2) Listener(监听)启停(客户端能否连上常看它)
──────────────────────────────────────────────────────────────

进入(oracle 用户):
  su - oracle                           # 监听通常由 oracle 管(看你的部署规范)

查看/启动/停止:
  lsnrctl status                        # 看监听状态、监听地址、注册服务
  lsnrctl start                         # 启动监听(默认 LISTENER,也可指定名)
  lsnrctl stop                          # 停止监听(注意:停监听≠停数据库)

提示:
- 监听停了,数据库还在;本机 bequeath 连接可能还能进(取决于连接方式)
- RAC 环境更建议通过 srvctl 管监听资源(更统一)

──────────────────────────────────────────────────────────────
3) 有 Grid Infrastructure / Oracle Restart / RAC --- 用 srvctl(生产推荐)
──────────────────────────────────────────────────────────────

说明:
- GI/RAC 环境里,数据库、监听、VIP、ASM、服务(service)是"资源链"
- 用 srvctl 能确保按依赖顺序启动/停止,减少"资源残留/漂移"问题

══════════════════════════════════════════════════════════════
RAC/GI 环境启停常用操作(只需在一个节点执行)--- 带注释速查
说明:以下命令建议用 grid 用户执行。正常情况下无需每个节点分别操作,
     因为 GI 会按"资源定义/依赖关系"在集群内协调执行。
══════════════════════════════════════════════════════════════
0)首先,怎么一眼确认你是不是 RAC???
在任意节点用 grid 用户:
su - grid
olsnodes
输出 多个节点名(比如 teimes1、teimes2...)→ ✅ RAC/集群
只输出 一个节点名 → ❗不是 RAC(可能是 Oracle Restart 单机)
再补一个更硬的确认:
crsctl check cluster
这条在集群环境会有 cluster 相关返回;单机 Restart 通常没有 cluster 这一层。


1)停/启"整个数据库"(所有实例一起停/起)
【适用场景】
- 计划停库窗口:整库维护、停机升级、全库级别操作
【特点】
- ✅ 只在任意一个节点执行一次即可
- GI 会把所有节点上的该库实例统一停/起,并维护资源状态一致

命令:
  su - grid
  srvctl stop  database -d <DB_UNIQUE_NAME> -o immediate
  # stop database:停止该数据库资源(通常会停掉所有实例)
  # -d <DB_UNIQUE_NAME>:数据库唯一名(GI 资源名),不是随便写的
  # -o immediate:停库方式(等价于 shutdown immediate 的语义:尽快干净停)

  srvctl start database -d <DB_UNIQUE_NAME>
  # start database:启动该数据库资源(通常会把需要的实例按策略拉起)
  # GI 会按依赖顺序处理(如 ASM/监听/服务等,视资源定义)

  srvctl status database -d <DB_UNIQUE_NAME>
  # status database:查看数据库资源状态(验证是否已停/已起、在哪些节点运行)


2)只维护某一个节点(滚动维护:只停某节点的实例)
【适用场景】
- 单节点补丁/重启/硬件维护:想"业务不中断",一次只动一个节点
【特点】
- ✅ 命令只需要在一个节点执行
- 通过 -i 指定实例名,等价于指定"停哪个节点上的那个实例"

命令:
  su - grid
  srvctl stop  instance -d <DB_UNIQUE_NAME> -i <INSTANCE_NAME> -o immediate
  # stop instance:只停止指定实例(不会把整个库都停掉)
  # -i <INSTANCE_NAME>:实例名,通常形如 UTF8CDB1 / UTF8CDB2(常见 1/2 对应节点1/节点2)
  # -o immediate:该实例用 immediate 方式停(干净、常用)

  srvctl start instance -d <DB_UNIQUE_NAME> -i <INSTANCE_NAME>
  # start instance:只启动指定实例(滚动恢复/滚动启动用)

提示:
- <INSTANCE_NAME> 一般像 UTF8CDB1 / UTF8CDB2、mescdb1 / mescdb2
- 实例与节点的对应关系可用:
  srvctl status database -d <DB_UNIQUE_NAME>
  # 看每个实例当前跑在哪个节点


3)监听(listener)要不要每个节点都操作?
【结论】
- 用 srvctl 管监听时:✅ 一般也只需执行一次,GI 会按资源定义处理
- 只想动某个节点的监听:✅ 可指定节点名 -n <NODE_NAME>

A) 一次命令全管(按资源定义处理):
  su - grid
  srvctl stop  listener
  # stop listener:停止监听资源(具体停哪些监听/节点,取决于你环境资源定义)

  srvctl start listener
  # start listener:启动监听资源

B) 只操作某个节点的监听(定点维护):
  su - grid
  srvctl stop  listener -n <NODE_NAME>
  # -n <NODE_NAME>:指定节点名(例如 teimes1 / teimes2 之类,以你环境为准)

  srvctl start listener -n <NODE_NAME>


小提醒(很关键):
- "停监听"≠"停数据库":监听停了,实例可能还在跑,只是客户端连接会受影响。
- RAC 里尽量避免在每个节点手动 lsnrctl / sqlplus shutdown 来"各停各的",
  容易导致资源状态不一致;用 srvctl 才是统一口径。
══════════════════════════════════════════════════════════════


二、MySQL(5.7 / 8.0)

【0. 说明】
- MySQL 在 Linux 上最常见是 systemd 托管:服务名可能是 mysqld 或 mysql
- 停止建议走 systemctl 或 mysqladmin shutdown(让引擎自己做干净退出)

──────────────────────────────────────────────────────────────
1) systemd 服务启停(最常用、最符合运维体系)
──────────────────────────────────────────────────────────────

查看服务名 & 状态:
  sudo systemctl status mysqld           # 常见:RHEL/CentOS 系
  # 或:sudo systemctl status mysql      # Debian/Ubuntu 某些安装方式

启动/停止/重启:
  sudo systemctl start  mysqld           # 启动 MySQL 服务
  sudo systemctl stop   mysqld           # 停止 MySQL 服务(systemd 发停止信号)
  sudo systemctl restart mysqld          # 重启(生产慎用,先评估连接/事务影响)

提示:
- stop 卡住:优先看日志(/var/log/mysqld.log 或 journalctl -u mysqld)
- 重启前最好确认主从/业务窗口(别把高峰当练手场)

──────────────────────────────────────────────────────────────
2) mysqladmin 正常关库(脚本/自动化常用)
──────────────────────────────────────────────────────────────

关库:
  mysqladmin -uroot -p shutdown          # 通过管理接口让 mysqld 自己有序退出
                                        # -p 会提示输入密码(更安全)

探活:
  mysqladmin -uroot -p ping              # 返回 "mysqld is alive" 表示服务可用

──────────────────────────────────────────────────────────────
3) MySQL 客户端内部命令关库(需要权限)
──────────────────────────────────────────────────────────────

进入:
  mysql -uroot -p                        # 登录到 MySQL

执行:
  SHUTDOWN;                              # 需要 SUPER 或 SHUTDOWN 权限(版本/权限模型略有差异)

三、SQL Server(Microsoft SQL Server on Linux)

【0. 说明】
- Linux 上 SQL Server 服务名基本固定:mssql-server
- 生产常用 systemctl stop/start
- 用 T-SQL 的 SHUTDOWN 属于从引擎内部停机,权限要求高(一般需 sysadmin)

──────────────────────────────────────────────────────────────
1) systemd 服务启停(最主流)
──────────────────────────────────────────────────────────────

状态/启动/停止/重启:
  sudo systemctl status mssql-server     # 查看服务状态与最近日志
  sudo systemctl start  mssql-server     # 启动 SQL Server 引擎
  sudo systemctl stop   mssql-server     # 停止 SQL Server 引擎(推荐方式)
  sudo systemctl restart mssql-server    # 重启(评估业务影响,谨慎)

提示:
- 有问题先看:journalctl -u mssql-server(比瞎猜强)
- 端口默认 1433(也可能被改)

──────────────────────────────────────────────────────────────
2) sqlcmd 发停机指令(需 sysadmin,生产更常见 systemctl stop)
──────────────────────────────────────────────────────────────

正常停机(相对温和):
  /opt/mssql-tools*/bin/sqlcmd -S localhost -U sa -P '<password>' -Q "SHUTDOWN"
                                        # 通过 SQL 发停机命令,需要足够权限

立即停机(更强硬):
  /opt/mssql-tools*/bin/sqlcmd -S localhost -U sa -P '<password>' -Q "SHUTDOWN WITH NOWAIT"
                                        # NOWAIT:更"急停",慎用(类似不给缓冲时间)

四、快速确认"活没活着"(运维探活三板斧)

──────────────────────────────────────────────────────────────
1) 通用进程检查(看主进程在不在)
──────────────────────────────────────────────────────────────

  ps -ef | egrep "pmon|mysqld|sqlservr" | grep -v grep
  # pmon:Oracle 实例标识进程(每个实例一个)
  # mysqld:MySQL 主进程
  # sqlservr:SQL Server 引擎进程

──────────────────────────────────────────────────────────────
2) 通用端口检查(看监听是否在、谁在占用)
──────────────────────────────────────────────────────────────

  ss -lntp | egrep ":1521|:3306|:1433"
  # 1521:Oracle Listener 默认端口(也可能是其他)
  # 3306:MySQL 默认端口
  # 1433:SQL Server 默认端口

──────────────────────────────────────────────────────────────
3) 数据库侧快速探活(更贴近"真正可用")
──────────────────────────────────────────────────────────────

Oracle:
  ps -ef | grep pmon                     # 看实例是否起来
  lsnrctl status                         # 看监听与服务注册
  srvctl status database -d <DB_UNIQUE_NAME>   # RAC/GI 看资源状态(更权威)

MySQL:
  mysqladmin -uroot -p ping              # 返回 alive 说明服务可连接

SQL Server:
  /opt/mssql-tools*/bin/sqlcmd -S localhost -U sa -P '<password>' -Q "SELECT @@VERSION"
                                        # 能返回版本信息,说明引擎可用

══════════════════════════════════════════════════════════════
运维备注(经验主义但好用):
- Oracle:有 GI/RAC 尽量用 srvctl;shutdown abort/SQLServer nowait 都别当日常手段
- MySQL:systemctl 是主线;mysqladmin 适合脚本;停库前最好心里有事务/复制状态
══════════════════════════════════════════════════════════════
相关推荐
小高不会迪斯科8 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
e***8908 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
小白同学_C8 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖8 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_949146538 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天9 小时前
大模型幻觉问题
运维·服务器
失忆爆表症10 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师10 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g