数据库实例是运行的mysqld进程,负责管理数据操作;数据库是磁盘上的物理文件集合。实例包含内存结构和线程,数据库对应datadir下的.ibd、.frm等文件。实例可管理多个数据库,但连接目标是实例而非数据库。

数据库实例不是数据库本身,而是一个正在运行的 MySQL 服务进程(mysqld),它负责管理、解析和执行对数据库文件的所有操作;数据库则是磁盘上的一组物理文件(如 .ibd、.frm),用来持久化存储数据。
数据库实例是程序,数据库是文件
MySQL 实例本质是操作系统中的一个后台进程,包含内存结构(如缓冲池、日志缓冲区)和一组线程(如主线程、IO线程、SQL解析线程等)。它不直接等于数据,而是“看管”数据的管家。数据库则对应 datadir 目录下的实际文件集合——比如你创建一个叫 sales 的数据库,MySQL 就会在 datadir/sales/ 下生成若干 .ibd(表数据)、.frm(旧版表结构)或 .sdi(新版结构定义)等文件。
- 没有实例,数据库文件只是静态二进制数据,无法被 SQL 访问或修改
- 没有数据库文件,实例可以启动,但无法提供有效数据服务(会报错或仅支持系统库操作)
- 一台服务器可运行多个 MySQL 实例(不同端口、不同配置、不同
datadir),每个实例彼此隔离
一个实例可管理多个数据库
MySQL 实例启动后,通过 SQL 命令 CREATE database db_name; 可以在该实例下创建任意数量的数据库。每个数据库相互独立,拥有自己的表、视图、存储过程和权限设置。系统自带的 mysql、information_schema、performance_schema、sys 也都是运行在同一个实例下的数据库。
- 连接时指定的是实例(如
localhost:3306),不是某个数据库 - 登录后用
USE db_name;切换当前操作的数据库 - 跨库查询可用
db1.table1 JOIN db2.table2,前提是权限允许且在同一实例中
实例与数据库的生命周期不同步
你可以停止 MySQL 实例(systemctl stop mysqld),此时所有数据库都不可访问,但它们的文件仍完整保留在磁盘上;你也可以删除某个数据库(DROP DATABASE test;),只删掉对应目录及其中所有文件,实例本身继续运行,其他数据库不受影响。
- 备份数据库 = 备份
datadir下对应子目录或使用mysqldump - 备份实例 = 除数据库文件外,还需备份配置文件(
my.cnf)、日志(binlog、Error log)、用户权限信息(mysql库) - 克隆实例 = 复制整个
datadir+ 配置 + 启动脚本,并调整端口、socket、pid-file 等避免冲突
常见混淆点澄清
有人把“连上 MySQL”说成“连上数据库”,其实准确说是“连上 MySQL 实例”,然后才选择操作哪个数据库。类似地,“重启数据库”实际是重启 mysqld 进程(即实例),不是重启某张表或某个库。
-
mysql -u root -p连的是实例,默认进入空上下文,尚未选定数据库 -
mysql -u root -p -D app_db是连接实例后自动执行USE app_db - 错误提示 “Unknown database ‘xxx’” 是实例正常运行,但该数据库不存在
- 错误提示 “Can’t connect to local MySQL server” 是实例没启动或连接参数错(如端口、socket 路径)