MySQL实例就是那个“跑起来的mysqld进程”
你启动MySQL服务时执行
sudo service mysql start,真正被拉起来的,是一个名叫
mysqld的后台进程——这个进程及其占用的内存、线程、日志缓冲区、查询缓存、连接管理器等合在一起,就叫“MySQL实例”。它不存数据,但管着所有数据库文件的读写、权限校验、SQL解析和事务调度。你连不上数据库?大概率是这个实例没在跑,而不是某个库丢了。
一个实例可以管多个数据库,但一个数据库不能跨实例
实例是“操作系统级”的存在(Linux上
ps aux | grep mysqld能看到),而数据库(比如
travel_db)只是它内部的一组逻辑命名空间和物理文件集合(如
travel_db/*.ibd)。关键事实:
SHOW DATABASES;列出的是当前实例下所有数据库,不是整个服务器上所有可能存在的库 两个同名数据库(如都叫
test)可以共存,只要它们属于不同端口的实例(例如
3306和
3307实例各有一个
test) 你无法用一条SQL把
db1.users和
db2.orders“跨库关联”后直接写入第三个实例——必须靠应用层或FEDERATED引擎间接实现
常见混淆点:为什么有人觉得“实例=数据库”?
因为本地开发环境通常只启一个MySQL实例,又只建一两个库,久而久之就默认“我连的这个IP+端口,就等于我操作的那个库”。但真实部署中:
多租户SaaS系统常为每个客户配独立实例(隔离CPU/内存/慢查询影响) 微服务架构下,订单服务、用户服务可能各自连不同端口的实例,哪怕它们物理在同一台机器 误删DROP DATABASE myapp;只删库,不影响同实例下的
monitoring库;但若执行
sudo systemctl stop mysql,所有库同时不可用
怎么验证当前连的是哪个实例?
光看
SELECT DATABASE();不够——它只告诉你当前
USE的是哪个库。真正确认实例身份,得查底层:
SELECT @@port;—— 看监听端口(默认3306,但可能是3307/3308…)
SELECT @@socket;—— 看Unix域套接字路径,不同实例路径不同
SELECT VERSION(), @@hostname;—— 结合主机名和版本,区分集群中不同节点的实例
别依赖库名反推实例——同一个库名在不同实例里完全合法,也经常出现。
