文章目录
- 数据库基本操作
-
- [1.1 创建与删除数据库(CREATE / DROP DATABASE)](#1.1 创建与删除数据库(CREATE / DROP DATABASE))
-
- [一、创建数据库:`CREATE DATABASE`](#一、创建数据库:
CREATE DATABASE) -
- [1. 基础语法](#1. 基础语法)
- [2. 字符集与排序规则的选择](#2. 字符集与排序规则的选择)
- [3. 查看数据库定义](#3. 查看数据库定义)
- [二、删除数据库:`DROP DATABASE`](#二、删除数据库:
DROP DATABASE) -
- [1. 语法与风险](#1. 语法与风险)
- [2. 权限要求](#2. 权限要求)
- [3. 文件系统层面的本质](#3. 文件系统层面的本质)
- [一、创建数据库:`CREATE DATABASE`](#一、创建数据库:
- [1.2 字符集与排序规则(编码集和校验集)](#1.2 字符集与排序规则(编码集和校验集))
-
- 一、字符集与排序规则的定义
- 二、查看系统当前的编码与校验环境
- 三、创建数据库时显式指定字符集与排序规则
-
- [1. 基本指定语法](#1. 基本指定语法)
- [2. 实操验证与常见误区](#2. 实操验证与常见误区)
- 四、继承规则:"就近原则"深度剖析
- 五、为什么校验集影响"读取与比较"
- 补充:数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的!
- [1.3 数据库环境切换、对象查看与属性修改](#1.3 数据库环境切换、对象查看与属性修改)
-
- 一、切换当前数据库:`USE`
- [二、确认当前所在库:`SELECT DATABASE()`](#二、确认当前所在库:
SELECT DATABASE()) - [三、查看库内对象:`SHOW TABLES`](#三、查看库内对象:
SHOW TABLES) - [四、客户端界面管理:`system clear`](#四、客户端界面管理:
system clear) - [五、修改数据库属性:`ALTER DATABASE`](#五、修改数据库属性:
ALTER DATABASE) - 六、数据库级排序规则变更的深层影响(校验规则落地)
- 实践建议
- [1.4 逻辑备份与恢复、进程监控及物理存储文件差异](#1.4 逻辑备份与恢复、进程监控及物理存储文件差异)
-
- [一、逻辑备份工具:`mysqldump` 的核心用法与 `-B` 参数解析](#一、逻辑备份工具:
mysqldump的核心用法与-B参数解析) -
- [1. 基础语法与两种典型模式](#1. 基础语法与两种典型模式)
- [2. `-B` 与非 `-B` 的本质区别(极其重要)](#2.
-B与非-B的本质区别(极其重要)) - [3. 备份文件的存放位置(Linux 目录与 MySQL 数据路径的澄清)](#3. 备份文件的存放位置(Linux 目录与 MySQL 数据路径的澄清))
- [二、恢复操作:`source` 命令与流程](#二、恢复操作:
source命令与流程) -
- [1. 标准恢复流程(以带 `-B` 的备份文件为例)](#1. 标准恢复流程(以带
-B的备份文件为例)) - [2. 非 `-B` 备份文件的恢复(需手动建库)](#2. 非
-B备份文件的恢复(需手动建库)) - [3. 恢复时的字符集注意事项](#3. 恢复时的字符集注意事项)
- [1. 标准恢复流程(以带 `-B` 的备份文件为例)](#1. 标准恢复流程(以带
- [三、实时监控数据库连接状态:`SHOW PROCESSLIST`](#三、实时监控数据库连接状态:
SHOW PROCESSLIST)
- [一、逻辑备份工具:`mysqldump` 的核心用法与 `-B` 参数解析](#一、逻辑备份工具:
数据库基本操作
MySQL关键字大小写不敏感;列名通常不区分大小写;数据库名、表名大小写敏感性受操作系统文件系统影响(Linux通常敏感,Windows通常不敏感)。
1.1 创建与删除数据库(CREATE / DROP DATABASE)
在 MySQL 中,数据库(Database)是最高层的逻辑存储容器,用于组织表、视图、存储过程等对象。
一、创建数据库:CREATE DATABASE
1. 基础语法
sql
CREATE DATABASE [IF NOT EXISTS] db_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
db_name:数据库名称,需遵循标识符规则(长度不超过64个字符,可由字母、数字、下划线组成,不能以数字开头,不能是保留字)。IF NOT EXISTS:条件子句。若省略,当数据库已存在时会报错ERROR 1007 (HY000): Can't create database '...'; database exists;加上后,仅会在不存在时创建,存在时则发出警告(Warning)但不中断执行。CHARACTER SET:指定默认字符集 ,用于该数据库内新建的所有表(除非表级单独指定)。MySQL 8.0 起默认字符集为utf8mb4,较之旧版的latin1更友好地支持 Unicode 和 emoji。COLLATE:指定默认排序规则 ,与字符集绑定。例如utf8mb4_general_ci(不区分大小写)或utf8_ bin区分大小写
2. 字符集与排序规则的选择
字符集决定编码方式,排序规则决定字符串比较和排序的逻辑。实际生产中应结合业务需求选择:
- 多语言环境 :推荐
utf8mb4+utf8mb4_unicode_ci,兼容所有 Unicode 字符。 - 仅中文环境且追求性能 :可使用
gbk或utf8,但utf8在 MySQL 中并非完整 UTF-8(最多3字节),无法存储某些特殊字符,故新项目应规避。 - 大小写敏感场景 :选择
utf8mb4_bin(二进制比较)或utf8mb4_general_cs(区分大小写,但注意部分排序规则可能不支持)。
示例:
sql
-- 创建默认字符集的数据库(使用服务器全局设置)
CREATE DATABASE mydb;
-- 指定 utf8mb4 及不区分大小写的排序规则
CREATE DATABASE app_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 安全创建(若已存在则忽略)
CREATE DATABASE IF NOT EXISTS test_db
CHARACTER SET utf8mb4;
3. 查看数据库定义
创建完成后,可通过以下命令验证:
sql
SHOW DATABASES; -- 列出所有数据库
SHOW CREATE DATABASE app_db; -- 显示完整的创建语句(含字符集等,显式的是被优化过的语句)
输出示例:


二、删除数据库:DROP DATABASE
1. 语法与风险
sql
DROP DATABASE [IF EXISTS] db_name;
- 该操作不可逆:数据库内的所有表、数据、视图、存储过程等对象将永久删除,且释放关联的物理存储空间。
IF EXISTS:若数据库不存在,可抑制错误,仅产生警告。
示例:
sql
DROP DATABASE old_db; -- 若 old_db 不存在则报错
DROP DATABASE IF EXISTS temp_db; -- 安全删除
2. 权限要求
- 执行
CREATE DATABASE需拥有全局CREATE权限。 - 执行
DROP DATABASE需拥有全局DROP权限。 - 通常这些权限仅授予管理员或具有相应角色的账号,普通应用账号不应持有,以防误操作。
3. 文件系统层面的本质
在MySQL中,创建一个数据库并不是什么高深莫测的操作------它的本质就是在数据目录下创建一个文件夹。
Linux 下通过系统包管理器安装的 MySQL,默认数据目录几乎都是 /var/lib/mysql/;但它不是 Linux 固定规则,而是 MySQL 的 datadir 配置决定的。 当你执行:
- 创建数据库 :本质是在数据目录下创建一个空目录,并生成一个
db.opt文件(MySQL 5.7及之前)用于存储该库的默认字符集和排序规则;在 MySQL 8.0 中,此信息直接写入数据字典,不再依赖db.opt文件,但目录仍然存在。 - 删除数据库 :本质是递归删除该目录及其下所有文件(包括表空间文件
.ibd、分区文件等)。对于使用独立表空间(innodb_file_per_table=ON)的 InnoDB 表,每个表的.ibd文件会随库一起删除;若使用共享表空间(ibdata),则只删除数据字典中的记录,物理空间不会立即释放。
注意 :直接通过操作系统命令 rm -rf 删除数据库目录是极其危险且不推荐的做法,因为 MySQL 的数据字典和缓存不会同步更新,会导致服务异常甚至崩溃。务必使用 DROP DATABASE 语句。
1.2 字符集与排序规则(编码集和校验集)
在深入管理数据库之前,我们必须先厘清两个决定数据"如何存放"与"如何比较"的核心属性------字符集(Character Set)与排序规则(Collation)。很多看似奇怪的查询结果(如大小写敏感、乱码、索引失效)根源往往在于这两者的配置。本节将透彻解析它们在数据库层面的含义、查看方式、指定方法以及至关重要的"就近原则"继承链。
一、字符集与排序规则的定义
-
字符集(编码集) :定义了哪些字符可以被存储,以及它们被转换为二进制数据时的具体编码规则 。例如
utf8、utf8mb4、gbk等。它决定了数据库"用什么语言"来记录你写入的文本。 -
排序规则(校验集) :依赖于特定字符集,定义了字符之间的比较和排序逻辑 。它决定了
WHERE条件中的等值比较(=)、ORDER BY的排列顺序以及GROUP BY的分组依据。本质上,排序规则是读取和比较数据时所采用的编码格式规范,它告诉 MySQL 如何"理解"二进制数据 ,从而判断'a'是否等于'A',或者'张'是否大于'李'。
两者的关系 :字符集划定"能存什么"的范围,排序规则定义"怎么比大小"。一个字符集可对应多个排序规则(如 utf8_general_ci、utf8_bin 等)。
sql
字符
↓
字符集(Character Set)
↓
编码成字节
↓
存储
读取字节
↓
字符集解码
↓
得到字符
比较/排序
↓
Collation
二、查看系统当前的编码与校验环境
在进行创建操作前,建议先探查 MySQL 服务端的默认设定,这有助于理解未显式指定时的行为。
通过以下指令可查看全局及当前数据库的字符集与排序规则:
sql
查看数据库级别的默认字符集(当前选中的库)
SHOW VARIABLES LIKE 'character_set_database';
查看数据库级别的默认排序规则
SHOW VARIABLES LIKE 'collation_database';
查看数据库支持的字符集
show charset;
查看数据库支持的字符集校验规则
show collation;
此外,执行 SHOW CHARSET; 可列出 MySQL 支持的所有字符集及其默认排序规则,方便你在设计时做出合适选择。
三、创建数据库时显式指定字符集与排序规则
在 CREATE DATABASE 语句中,你可以通过 CHARACTER SET(或简写 CHARSET)和 COLLATE 子句来精确控制数据库的这两个属性。
1. 基本指定语法
sql
-- 方式一:使用 CHARACTER SET(完整写法)
CREATE DATABASE d3 CHARACTER SET utf8;
-- 方式二:使用 CHARSET(简写,效果与方式一完全等价)
CREATE DATABASE d2 CHARSET=utf8;
-- 方式三:同时指定字符集和排序规则(最严谨)
CREATE DATABASE d4 CHARACTER SET utf8 COLLATE utf8_general_ci;
关键细节:
CHARSET是CHARACTER SET的同义词,两者可互换。- 子句后的等号(
=)为可选符号,CHARSET utf8与CHARSET=utf8均合法,但官方文档更推荐使用空格分隔(避免解析歧义)。 - 若只指定字符集未指定排序规则,MySQL 会自动选用该字符集的默认排序规则 (例如
utf8的默认规则通常为utf8_general_ci)。
2. 实操验证与常见误区
我们通过一组连续的创建操作来观察不同写法的效果:
sql
-- 创建 d1:不指定任何属性,完全依赖系统默认值(此处受 character_set_server 影响)
CREATE DATABASE d1;
-- 创建 d2:使用 CHARSET 简写并指定 utf8
CREATE DATABASE d2 CHARSET=utf8;
-- 创建 d3:使用完整的 CHARACTER SET 指定 utf8
CREATE DATABASE d3 CHARACTER SET utf8;
-- 创建 d4:同时指定字符集和排序规则
CREATE DATABASE d4 CHARACTER SET utf8 COLLATE utf8_general_ci;
关于语法错误的警示 :在实操中,若执行
CREATE DATABASE db4 CHARSET=utf8 COLLATE utf8_general_ci;遭遇语法报错,请优先检查库名是否包含特殊字符或是否为保留字(如db4并非保留字,但若版本差异或输入存在不可见字符则可能报错)。稳妥起见,应遵循官方标准写法:CREATE DATABASE d4 CHARACTER SET utf8 COLLATE utf8_general_ci;(将CHARSET写全为CHARACTER SET,并使用空格而非等号连接参数,可最大程度避免解析异常)。
四、继承规则:"就近原则"深度剖析
MySQL 中的字符集和排序规则具有严格的层级继承关系,其核心法则可概括为 "就近原则" ------ 即 子级未显式定义时,向上追溯父级定义;谁离得最近,谁说了算。
继承链路(自上而下)
1. 服务器级别(character_set_server / collation_server)
↓(若 CREATE DATABASE 未指定)
2. 数据库级别(character_set_database / collation_database)
↓(若 CREATE TABLE 未指定)
3. 表级别(CHARACTER SET / COLLATE)
↓(若 字段定义 未指定)
4. 字段(列)级别(最终存储与比较的生效规则)
落实到数据库创建场景的解读:
- 数据库级"就近" :在执行
CREATE DATABASE时,若语句中显式指定了字符集或排序规则,则优先采用指定的值(即使与服务器变量相悖)。这就是最高优先级的"近"。 - 继承退路 :若
CREATE DATABASE中未指定 字符集,则自动继承character_set_server和collation_server的当前值(注意:并非继承character_set_database,因为此时database尚不存在)。 - 表的继承 :数据库创建完毕后,后续在该库内新建表时,若
CREATE TABLE未指定字符集/排序规则,则自动沿用该数据库的设定。同理,表中的字段若未单独指定,则沿用表的设定。
举例说明:
- 若服务器默认字符集为
latin1,执行CREATE DATABASE mydb;,则mydb的编码为latin1(继承自服务器)。 - 若执行
CREATE DATABASE mydb2 CHARACTER SET utf8;,则mydb2无视服务器默认值,强制使用utf8(显式指定的"就近"规则生效)。 - 在
mydb2中建表CREATE TABLE t1 (name VARCHAR(10));,因未指定表级编码,t1的默认字符集自动继承数据库的utf8。
理解这一规则对于多租户架构、数据迁移和避免乱码问题至关重要。请记住:MySQL 总是优先采用离数据定义最近的编码指令。
五、为什么校验集影响"读取与比较"
数据库的排序规则(校验集)不仅仅服务于 ORDER BY。当你执行 SELECT * FROM user WHERE name = 'John' 时,MySQL 必须使用校对规则来判断存储的二进制值与 'John' 是否逻辑相等。
- 若排序规则为
utf8_general_ci(ci即 Case Insensitive),则'john'与'John'被视为相等。 - 若排序规则为
utf8_bin(二进制比较),则两者被视为不相等。
因此,校验集本质上是读取和比较数据时所使用的编码格式与大小写敏感策略的集合体,它深刻影响着查询结果的准确性和索引的使用效率。
在生产环境中,建议在建库阶段就明确指定字符集(如 utf8mb4)和符合业务逻辑的排序规则(如 utf8mb4_unicode_ci),避免依赖不明确的服务器默认值,从而让数据库的"存储语言"和"比较逻辑"始终在掌控之中。
补充:数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的!
数据库对数据进行任何操作(存储、查询、修改、传输)时,都必须保证参与操作的各个环节使用相同或兼容的字符编码,否则会导致数据乱码、丢失或比较错误。
例如:
用户输入:
你好
经过:
客户端编码
↓
连接层编码
↓
MySQL服务器编码
↓
数据库/表字段编码
↓
存储文件编码
如果每一层都是:
UTF-8 → UTF-8 → UTF-8 → UTF-8
那么数据能够正确保存和读取。
但如果:
客户端:GBK
↓
MySQL连接:UTF-8
↓
数据库:UTF-8
客户端发送的字节会被错误解释,最终可能出现:
你好
↓
乱码
↓
????
所以数据库操作的本质是:
字符不是直接存储的,而是先按照某种编码转换成字节,再存入数据库;读取时再按照对应编码把字节还原成字符。只有编码规则一致,字节才能被正确解释。
实际 MySQL 中通常统一设置:
sql
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_results utf8mb4
即:
客户端
↓
utf8mb4
↓
MySQL
↓
utf8mb4
↓
存储
保证整个链路编码一致。
1.3 数据库环境切换、对象查看与属性修改
在完成数据库的创建(CREATE)与删除(DROP)之后,日常运维中最频繁的操作便是环境切换 与状态确认 。同时,数据库创建完成后并非一成不变,其字符集与排序规则等属性也允许在后期进行动态调整 。本节将围绕 USE、SELECT DATABASE()、SHOW TABLES、ALTER DATABASE 以及客户端辅助命令展开,并再次深入探讨排序规则在数据库层面变更时产生的深远影响。
一、切换当前数据库:USE
MySQL 客户端连接到服务端时,默认不会自动选中任何数据库(除非在连接字符串中指定)。在执行增删改查(DML/DDL)前,必须明确目标工作库。
语法:
sql
USE db_name;
该命令将当前会话的"默认数据库"切换至指定库。此后,若执行 SELECT * FROM table_name 而未加库名前缀,MySQL 将默认在此库中查找该表。
注意:
- 这是一条客户端命令 ,不需要在末尾加分号(
;)亦可执行(但加分号不报错)。 - 若切换的数据库不存在,会报错
ERROR 1049 (42000): Unknown database '...'。
二、确认当前所在库:SELECT DATABASE()
在多库切换的复杂运维场景下,误操作"跑错库"是生产事故的高发诱因。MySQL 提供了内置函数用于精准回显当前会话的默认数据库。
用法:
sql
SELECT DATABASE();
返回结果:
- 若当前已通过
USE选中了某个数据库,则返回该库的名称(字符串)。 - 若当前未选中任何数据库(即刚登录或执行过
USE空值),则返回NULL。
扩展实践:
在编写自动化运维脚本时,通常会在执行危险 DDL(如 DROP)前,先执行 SELECT DATABASE() 并将结果赋值给变量进行校验,这是一种非常有效的防御性编程习惯。
三、查看库内对象:SHOW TABLES
当成功切换至目标库后,首要操作往往是浏览该库中已存在的表、视图等对象。
基础用法:
sql
SHOW TABLES; 该命令将列出当前默认数据库中的所有非临时表(Temporary Table 除外)。
跨库查看(不切换上下文):
若想在不切换当前库的情况下查看其他数据库中的表,可使用:
sql
SHOW TABLES FROM other_db_name;
例如,当前位于 d4 库,但想查看 d2 库的表结构概览,执行此命令即可,且不会影响当前会话的 DATABASE() 返回值。
理解"建表见 use" :在 MySQL 的逻辑中,
CREATE TABLE语句若不指定库名(即不写db_name.table_name),则必然依赖于当前USE选中的数据库 。因此,USE与SHOW TABLES是密切配合的"导航与地图"组合------前者定位目的地,后者呈现该地的所有资产清单。
四、客户端界面管理:system clear
在长期的命令行交互中,终端屏幕往往被历史 SQL 语句和输出结果塞满,严重影响视觉专注度。MySQL 客户端支持通过 system 命令调用操作系统 Shell 指令。
清屏指令:
- Linux / macOS 系统:
system clear;或简写为\! clear; - Windows 系统:
system cls;或\! cls;
注意:
- 该命令仅清理客户端本地的显示缓冲区,不对数据库服务端产生任何影响,也不涉及事务或锁。
- 这是在纯文本终端(
mysql命令行)下极其高频的辅助操作,能够帮助 DBA 在排查复杂问题时保持清晰的输出视图。
五、修改数据库属性:ALTER DATABASE
MySQL不支持直接数据库重命名
数据库创建后,其元数据属性(主要是默认字符集和默认排序规则)允许通过 ALTER DATABASE 语句进行动态调整。这为业务迁移或编码规范升级提供了极大的灵活性。
标准语法:
sql
ALTER DATABASE db_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
使用示例:
sql
-- 将 d1 库的默认字符集修改为 utf8mb4
ALTER DATABASE d1 CHARACTER SET utf8mb4;
-- 同时修改字符集和排序规则
ALTER DATABASE d2 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
关键深层认知(容易误判的陷阱):
ALTER DATABASE 修改的仅仅是数据库级别的默认值 (即更新数据字典中记录的 character_set_database 和 collation_database)。它并 不会 递归修改该库中已经存在的数据表及字段的字符集或排序规则。
- 影响范围 :仅作用于修改之后 在该库中新建的表(且新建表时未显式指定表级编码),以及在该库中执行
CREATE TABLE ... LIKE或CREATE TABLE ... SELECT时继承的默认值。 - 存量对象 :库内已有的旧表、旧字段,其存储的二进制数据和比较逻辑完全不受影响,依旧保持各自建表时的独立设定。
六、数据库级排序规则变更的深层影响(校验规则落地)
结合上述 ALTER DATABASE 的特性,我们再来深入剖析校验规则(Collation)在数据库层面变更所产生的涟漪效应。这一点常被初学者误解,认为"改了库就能改一切",实则不然。
-
新建对象的逻辑锚点 :数据库的排序规则是该库内所有新表字符串列的"遗传母体"。若规划初期将库设为
utf8_general_ci(大小写不敏感),后期通过ALTER DATABASE ... COLLATE utf8_bin改为二进制敏感,那么后续新建的用户名表将自动采用严格敏感的对比逻辑;而旧表中的用户名字段如果未手动转换,仍然保持旧的大小写不敏感规则。这会导致业务代码中同一套查询逻辑在访问新旧表时返回截然不同的结果集。 -
动态默认上下文 :即使未切换
USE目标库,执行CREATE TABLE db_name.new_table ...时,新表的默认规则取自db_name的数据库定义,而非当前会话的character_set_connection。这进一步凸显了数据库级校验规则作为"存储基因"的权威性。 -
查看当前生效的库级定义 :修改完成后,可通过
SHOW CREATE DATABASE db_name;来确认修改是否生效,输出中会清晰展示当前的CHARACTER SET与COLLATE设定。
实践建议
- 变更前备份 :在生产环境执行
ALTER DATABASE修改字符集或排序规则前,务必导出该库的所有建表语句(mysqldump --no-data),用以对照存量对象的编码差异。 - 统一规划原则 :强烈建议在项目初始化阶段就通过
CREATE DATABASE定死字符集与排序规则,尽量避免后期修改库级属性。若实在需要变更整体编码,应通过新建库、数据迁移、重命名切换的方式进行,远比单纯修改库定义更彻底、更可控。
1.4 逻辑备份与恢复、进程监控及物理存储文件差异
当数据库进入稳定运行期,备份恢复 与性能监控 便成为日常运维的核心命题。MySQL 提供了原生的逻辑备份工具 mysqldump,它不直接操作物理文件,而是生成包含 CREATE 和 INSERT 语句的文本文件,从而实现跨版本、跨平台的迁移与恢复 。同时,理解 mysqldump 的 -B 参数差异、source 恢复流程、SHOW PROCESSLIST 的实时监控能力,以及不同存储引擎在磁盘上留下的"足迹",是区分一个合格 DBA 与普通开发者的关键分水岭。
一、逻辑备份工具:mysqldump 的核心用法与 -B 参数解析
mysqldump 是 MySQL 服务端自带的客户端备份工具,它在命令行 shell 中执行(而非 mysql 交互式客户端内部)。其核心能力是将一个或多个数据库、表的结构和数据导出为纯 SQL 文本。
1. 基础语法与两种典型模式
语法:
mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
bash
# 模式一:不指定 -B(非 -B 模式)
mysqldump -u root -p db_name [table1 table2 ...] > backup.sql
# 模式二:指定 -B(--databases 的简写)
mysqldump -u root -p -B db_name [db_name2 ...] > backup.sql
2. -B 与非 -B 的本质区别(极其重要)
-
非
-B模式(默认):- 导出的 SQL 文件中 不包含
CREATE DATABASE和USE db_name语句。 - 恢复时,必须手动创建 目标数据库(
CREATE DATABASE ...),并切换至该库(USE ...)后再执行source导入。若库不存在或未选中,恢复将直接报错。 - 适用场景:将数据导入到已存在的目标库中,或只备份库中的部分表。
- 导出的 SQL 文件中 不包含
-
带
-B模式 (--databases):- 导出的 SQL 文件中自动包含
CREATE DATABASE IF NOT EXISTS db_name和USE db_name语句。 - 恢复时无需预先创建库 ,直接执行
source,工具会自动完成建库与切换动作。 - 支持同时备份多个数据库,例如
mysqldump -B db1 db2 db3 > all_backup.sql。 - 适用场景:全库迁移、异地灾备恢复,以及需要保留库名和库级属性的场景。
- 导出的 SQL 文件中自动包含
实战对比:
bash
# 备份 d4 库(非 -B),不含建库语句
mysqldump -u root -p d4 > d4_noB.sql
# 备份 d4 库(带 -B),含建库语句
mysqldump -u root -p -B d4 > d4_withB.sql
# 如果备份的不是整个数据库,而是其中的一张表,怎么做?
mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql
#同时备份多个数据库
mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
通过 grep "CREATE DATABASE" d4_*.sql 可直观验证差异------带 -B 的文件包含该行,非 -B 的文件则没有。
3. 备份文件的存放位置(Linux 目录与 MySQL 数据路径的澄清)
关键认知修正 :mysqldump 生成的是普通文本文件 ,其输出路径由 shell 的重定向符 > 决定,与你是否在 MySQL 数据目录(如 /var/lib/mysql)下操作毫无关系。
- 备份文件可以存放在任意 Linux 目录下 ,例如
/home/backup/、/tmp/或当前用户的家目录。 - 不需要 、也不应该 将备份文件"扫描"或移动到 MySQL 的物理存储路径(
/var/lib/mysql)下。该目录仅供数据库引擎直接读写二进制数据文件使用,放入文本 SQL 文件不仅无效,还可能因权限或空间问题引发服务异常。 - 正确做法:将备份文件统一存放在专用的备份磁盘或远程存储(如 NFS、对象存储)中,通过
mysql客户端从任意路径读取并恢复。
二、恢复操作:source 命令与流程
恢复逻辑备份本质上是将 SQL 文本文件中的语句重新执行一遍。这通常在 mysql 交互式客户端内完成。
1. 标准恢复流程(以带 -B 的备份文件为例)
sql
-- 无需预先建库,直接登录客户端执行
mysql -u root -p
在客户端内执行 source 命令(注意:这是客户端内部命令,不是 SQL 语句)
source /path/to/d4_withB.sql;
执行后,MySQL 会逐条读取文件中的 CREATE DATABASE、USE、CREATE TABLE、INSERT 等命令,完整重建库结构和数据。
2. 非 -B 备份文件的恢复(需手动建库)
sql
-- 先手动创建目标库(假设备份自 d4,恢复为 d4_restore)
CREATE DATABASE d4_restore CHARACTER SET utf8mb4;
-- 切换至该库
USE d4_restore;
-- 再执行恢复
source /path/to/d4_noB.sql;
若省略 CREATE DATABASE 和 USE,直接 source 会报 ERROR 1046 (3D000): No database selected。
3. 恢复时的字符集注意事项
source 恢复时,客户端的 character_set_client、character_set_connection 等变量会影响 SQL 文件的解析。若备份文件包含特殊字符,建议在 source 前执行 SET NAMES utf8mb4; 确保编码对齐。
三、实时监控数据库连接状态:SHOW PROCESSLIST
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况。
在备份或恢复等耗时操作执行期间,或当数据库出现卡顿、锁等待时,DBA 需要即时查看当前 MySQL 服务端正在处理的线程列表。
语法:
sql
SHOW PROCESSLIST;
sql
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | test | Sleep | 1386 | | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
输出关键字段解读:
| 字段 | 含义 |
|---|---|
| Id | 线程唯一标识符(连接 ID) |
| User | 执行该线程的 MySQL 用户名 |
| Host | 客户端的来源 IP 与端口 |
| db | 当前线程锁定的默认数据库(若未选中则为 NULL) |
| Command | 线程类型(Query 表示正在执行 SQL,Sleep 表示空闲,Killed 等) |
| Time | 当前状态持续秒数(常用于定位慢查询或长事务) |
| State | 更详细的执行阶段(如 Sending data、Waiting for table lock) |
| Info | 当前正在执行的完整 SQL 语句(若为空则无可显示) |
实用技巧:
- 排查阻塞 :当
Time值过大且State为Waiting for table metadata lock或Locked时,表明存在锁竞争。 - 杀掉异常线程 :结合
KILL [connection_id];强制终止失控的查询或未提交的事务。 - 查看完整语句 :默认
Info列只显示前 100 个字符,若需查看完整 SQL,可使用SHOW FULL PROCESSLIST;。
MySQL中的不同存储引擎负责管理数据的方式不同,因此在磁盘上生成的物理文件类型、文件后缀以及文件数量也不同。