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 适合脚本;停库前最好心里有事务/复制状态
══════════════════════════════════════════════════════════════