MySQL数据库 (二) 库的操作(增删查改),库的字符集和校验集,数据库的备份与恢复

目录

一、创建数据库

介绍根目录

库的创建

库的删除

总结:

二、编码问题:

认识系统编码:

指定编码创建数据库

验证不同检验集的影响

三、库的删改查

删除数据库

查看数据库

修改数据库

查看创建数据库的选项

四、数据库的备份和恢复

备份

恢复

五、查看连接情况

六、总结


上篇文章我们介绍了MySQL数据库的基础部分内容,本篇文章我们就来学习如何创建和使用数据库。

一、创建数据库

介绍根目录

/var/lib/mysql 是 Linux 系统里 MySQL 服务默认的数据根目录,mysqld 服务运行时所有落地磁盘的数据、日志、数据库目录、密钥文件都保存在这个文件夹内,目录归属 mysql 用户和用户组,由 MySQL 进程独占读写权限。在这个目录中,我们用 create database 库名创建数据库时,就会自动生成一个同名子文件夹,子目录内部存放对应数据表的 .ibd 数据文件;除此之外目录里还有ibdata1、ibtmp1这类 InnoDB 引擎共用的系统表空间文件,负责存储共享数据与回滚信息,binlog开头的是二进制日志文件,用来记录所有修改数据的 SQL 操作,各类 .pem 后缀文件是 MySQL 的 SSL 安全证书密钥,整份目录里所有文件都由 mysqld 服务统一管理,我们不能手动直接修改里面的文件,只能通过客户端发送 SQL 语句间接改动磁盘数据。

库的创建

基础创建语法:

create database 库名称;

直接创建指定名称数据库,如果同名数据库已经存在,会直接报创建重复的错误。

安全创建语法 (不存在才创建):

create databaseif not exists 库名称;

增加 if not exists判断,先检索系统里是否已有同名数据库,库不存在就新建,库已经存在则静默跳过、不报错。

举个例子:

当我们执行 create database database1; 成功后,MySQL 会在它的数据根目录 /var/lib/mysql/ 下自动生成同名文件夹 database1,这就是这个数据库在磁盘上的物理存储目录。这个文件夹初始为空,里面没有任何数据文件;后续我们在 database1 中执行建表语句时,该目录内才会生成 .ibd 格式的数据文件,用来存储数据表数据。

补充:

  1. 查看所有数据库用 show databases; (末尾带 s 复数),这条指令可以查出刚创建的 database1 和系统自带库,和磁盘目录里的文件夹一一对应。

  2. SQL 关键字大小写完全不敏感,create database、CREATE DATABASE、Create DataBase 三种写法全都能正常执行,MySQL 解析时自动忽略关键字大小写。

  3. 所以创建数据库的本质就是在 MySQL 的数据根目录 /var/lib/mysql/ 下,在操作系统层面上新建一个同名的空文件夹,同时在 MySQL 系统内置的数据字典里登记这条数据库记录。

  • 磁盘物理层面 : Linux 系统 /var/lib/mysql 目录生成和库名一模一样的子目录,这个文件夹就是数据库的物理载体,空库时文件夹内部没有任何数据文件,删除库就是直接删除这个整个文件夹。
  • MySQL 逻辑层面 : MySQL 会在自身系统表中记录这个数据库的名称、默认字符集、创建时间等元数据,执行 show databases; 能查到,靠系统记录完成库的逻辑管理。

库的删除

drop database 库名;

执行 drop database database1; 执行成功后,show databases; 结果里找不到 database1,同时磁盘 /var/lib/mysql 目录里对应的 database1 文件夹被系统整体删掉,文件夹内所有数据表文件跟着一并删除。

如果我们在 /var/lib/mysql 里新建一个文件夹,show databases; 查询时 MySQL 也会把这个文件夹识别成数据库;但我们一般不会这么做,所有库只用 create/drop database 语句管理,避免 MySQL 数据和磁盘文件不一致。

总结:

一个是MySQL层面的,一个是Linux文件系统层面的

  1. MySQL 层面就是数据库的系统元数据登记,执行 create database db_name; 时,除了 Linux 在 /var/lib/mysql 生成对应文件夹 (文件系统层面),MySQL 还会在自身内置的系统数据表中记录这条库信息,包含库名、默认字符集、创建时间等配置,这就是 MySQL 逻辑层面。我们执行 show databases; 能查到这个库,本质就是 MySQL 读取自己保存的这份登记信息;执行 use db_name; 切换数据库,也是 MySQL 依靠这条记录定位到对应的逻辑空间。反过来执行 drop database db_name;,除了删掉磁盘文件夹,MySQL 同步删除系统表里这条库的登记记录,之后 show databases; 就不再显示该库。

这里我们说的 MySQL 整体就是服务端程序 (mysqld 后台进程),运行在 Linux 后台、监听端口、存磁盘数据、解析 SQL、管理 /var/lib/mysql 目录的 mysqld 程序 。而我们敲 mysql> 命令进入的黑框,是 MySQL 客户端,只负责输入 SQL 指令、把语句发给服务端,自身不存任何数据。当我们在客户端输入 create database xxx;,客户端把这条语句通过网络发给服务端进程,服务端一边在 Linux 的 /var/lib/mysql 建磁盘文件夹 (文件系统),一边在自己内部系统表登记库信息 (MySQL 逻辑层),两件事全是服务端完成。

二、编码问题:

只要是数据,无论是读取还是存储,都要有对应的编码格式,数据库作为专门管理数据的软件,对编码格式的规范要求更高,存入数据和取出数据需要使用统一的编码格式。所以我们在创建数据库时会定义两类编码格式。

第一类是字符集 character set,用来确定后续数据库内部存储数据时的编码规则,所有存入库中的字符都会按照这套编码转为二进制落地磁盘;

第二类是校验集 collation ,在字段匹配、数据排序,数据库做条件比对、字符大小判断都会依照这套编码规则,本质是数据读取比对阶段使用的配套编码,因此也叫校验集。

也正因如此,数据库在写入、查询、对比数据的全流程操作里,必须保持编码统一,编码格式不一致就极易出现中文乱码、查询匹配异常的问题。

认识系统编码:

我们可以通过指定的查询语句查看当前数据库的字符集与校对集:

字符集

查看当前库字符集使用 show variables like 'character_set_database';,如上,查询结果为 utf8mb4,这就是当前数据库用来存储字符数据的编码格式;

校验集

查看当前库校对集使用 show variables like 'collation_database';,对应配套校对集是 utf8mb4_unicode_ci,这个校对集依附 utf8mb4 字符集,用来负责字段对比、数据排序时的字符规则。

另外执行 show variables like 'collation_%'; 能够一次性查出全系统三处校对配置,分别是连接、当前库、服务全局的校对规则,当前环境里三项统一都是 utf8mb4_unicode_ci,全链路编码保持一致可以避免乱码问题。
此外我们还可以用 show charset; 语句查看所有的字符集:

也可以用 show collation; 查看所有的检验集

指定编码创建数据库

在创建数据库时遵循就近选用编码的原则,如果创建数据库的语句里没有手动写明字符集和校对集,MySQL 就会读取系统配置文件里预设的默认编码。如果创建数据库的语句中明确指定了编码参数,数据库就优先采用我们手动填写的字符集与校对规则。

验证不同检验集的影响

验证是否区分大小写:

我们通过创建两个数据库来验证不同校验集带来的差异,两个库选用相同的 utf8mb4 字符集,只修改校对规则,其中 test1 的校验集设为 utf8mb4_unicode_ci,test2 的校验集设为 utf8mb4_bin。

在老版本 MySQL 里,两个库对应的磁盘目录中都会生成 db.opt 配置文件,打开文件就能查看,文件内会完整记录该库默认绑定的字符集与校验集。这两个库的字符集一致,存储数据的编码格式没有区别,但检验规则不同直接影响数据对比和排序逻辑,utf8mb4_unicode_ci 在字段匹配、排序时不区分英文字母大小写,而 utf8mb4_bin 会严格区分大小写。

下面我们建表:

我们先进入 test1 数据库,执行 create table if not exists person(name varchar(20)); 建立 person 表,用 show tables; 可以查到建好的表,desc person; 能够查看表字段结构,随后逐条执行 insert 语句,往表里插入 a、b、A、B、c、D 六条大小写不同的数据,数据落地存储使用数据库配置的字符集编码。

执行 select * from person; 可以把全部六条数据完整查询出来。

接着执行 select * from person where name='a'; 进行条件检索,这条语句同时查出 a 和 A 两条数据,也就证明 test1 的 utf8_general_ci 校对规则在匹配字段时不区分英文字母大小写。

下面我们再在 test2 数据库中再做上面的操作:

同样创建 person 数据表,再逐条插入 a、A、b、B、c、C 六条数据,全量查询时六条数据也都正常存在磁盘中。

在 test2 里执行 select * from person where name='a';,最终结果只出现小写 a 一条数据,由此验证 test2 的 utf8_bin 校验规则严格区分大小写。

除此之外我们还可以对比排序:

我们继续通过 order by 排序语句验证两种校对规则带来的排序差异,先在 test2 库执行 select * from person order by name;,结果里大写 A、B、C 排在前面,小写 a、b、c 排在末尾,这是 utf8_bin 检验集的特点,大写字母二进制数值更小,优先靠前排列;随后切换到 test1 库再次执行相同的排序查询,数据变成 a 和 A 挨在一起、b 和 B 挨在一起的排布,因为 utf8_general_ci 不区分大小写,排序时把同一个字母的大小写视作同等字符。

所以综上,两种库存储数据的字符集完全一致,只是校验集不同,最终排序结果也不同,直观体现检验规则编码的影响。

三、库的删改查

删除数据库

drop database 库名称;

执行这条删除语句之后,我们在 MySQL 客户端中执行 show databases; 查看库列表,已经查询不到被删除的数据库;在 Linux 系统 /var/lib/mysql 数据根目录里,对应这个数据库的文件夹就会被整体删除,文件夹内包含的所有数据表文件也会跟着级联清除。

这里需要重点留意,删库属于高危操作,一旦执行数据无法找回,日常使用里不能随意执行删除数据库的指令。

查看数据库

show databases 库名称;

use 库名称;

查看数据库的语句是 show databases 库名称;。在我们通过查询找到目标数据库后,如果需要对库内的表和数据执行操作,就必须使用 use 库名称; 进入目标数据库,这条指令同时也可以实现不同数据库之间的切换。

确认自己在哪个数据库中:

select database(); ---- 函数

如果我们想要确认当前客户端正处在哪个数据库中,可以使用 select database();,这是 MySQL 内置函数,执行后会返回当前所处的库名。

如上图,我们执行 select 函数之后结果为 d1,代表此刻会话处于 d1 数据库中。

修改数据库

alter database 库名称;

修改数据库的关键字是 alter database,日常最常用的场景就是修改数据库的字符集与校对集。

假如我们想修改一下字符集和检验集:

操作前可以先用 select database(); 确认当前所处的数据库,如上图查询结果为 test2,随后执行 alter database test2 charset=gbk collate gbk_chinese_ci; 来更改编码配置。

修改完成后去查看 test2 目录下的 db.opt 文件,能够看到文件里记录的 character-set 和 collation 已经从原本的 utf8、utf8_bin 更新成 gbk 与 gbk_chinese_ci,代表库的默认编码修改成功。

查看创建数据库的选项

我们可以通过 show create database 库名称; 查看数据库的创建配置,这条指令会展示出数据库的创建语句以及默认编码信息,上一步我们已经把 test2 的字符集修改为 gbk,所以初次查询时语句里标注了 default character set gbk。这里附带三点细节说:

  1. MySQL 虽然建议 SQL 关键字大写,但语法上大小写没有强制限制
  2. 库名两侧的反引号用来规避库名和 SQL 关键字重名的报错问题;
  3. /*!40100 xxx */ 不是注释,它属于版本条件执行语法,只有MySQL版本大于 4.01 时,里面的编码配置语句才会生效。

那现在我们再改回来:我们再执行 alter database test2 charset=utf8 collate utf8_general_ci;,将字符集改回 utf8,再次执行查看语句,建库信息里的字符集同步变为 utf8,也就代表数据库默认编码修改生效。

四、数据库的备份和恢复

备份

MySQL 使用 mysqldump逻辑备份,本质是导出可执行的 SQL 语句,包含库结构、表结构、数据,方便恢复与迁移。

mysqldump -u 用户名 -p 其他选项 库名 > 备份文件.sql

  1. -u 用户名:指定登录 MySQL 的账号,例:-u root。
  2. -p:代表输入密码,建议只写 - p,执行后交互式输入密码,不要直接在命令后写密码(安全隐患)。
  3. > 备份文件.sql:重定向符号,将备份内容写入指定 SQL 文件,文件可自定义路径与名称。

我们在 Linux 系统的终端里执行 mysqldump 备份命令 mysqldump -P3306 -uroot -p -B test1 > test1.sql,回车之后按照提示输入数据库 root 用户的密码,命令执行完毕后,使用 ll 指令查看当前目录,能够看到生成了 test1.sql 备份文件。打开这份 sql 文件可以发现,文件内部完整保存了整套 SQL 语句,从创建 test1 数据库、切换使用数据库,到删除原有 person 表、重建 person 表结构,再到插入全部已存数据的语句都被完整记录,这也就说明 mysqldump 属于逻辑备份,备份文件不单存储数据表中的业务数据,同时把建库、建表、录入数据的全量操作语句一并保存,后续依靠该文件就可以完整还原出一模一样的数据库环境。

恢复

那我们又怎么通过备份进行恢复呢?

source + 备份文件的完整路径;

我们进入 MySQL 交互终端,采用 source 指令完成数据库恢复,执行 source /home/MySQL/ test1.sql; 并填写备份文件的完整路径,系统逐条执行备份文件里的建库、建表、插入数据等 SQL 语句。

语句执行结束后输入 show tables; 进行校验,查询结果中出现 person 数据表,就代表 test1 数据库已经完整恢复成功。

注意事项:

当我们想要一次性备份多个数据库时,可以依靠 - B 参数接续多个库名即可;当备份命令没有添加 - B 参数时,备份文件不含创建库的语句,恢复前要手动新建空数据库,再使用 source 导入数据,日常工作里尽量搭配 - B 参数做备份,后续恢复和库迁移会更加便捷,数据库尽量避免随意删除与重命名。

借助备份加恢复的方式我们也能实现数据库的重命名,先通过 mysqldump -B 原库名 > 备份.sql 把原数据库完整导出备份,之后在 MySQL 里新建目标名称的空库,登录数据库用 source 备份文件路径执行恢复,数据就全部导入新名字的库中,最后确认数据无误后删掉原来的旧库,也就实现了数据库改名,依靠 - B 参数让备份自带建库语句,省去手动建库的步骤。

一般不能轻易改(重命名)和删除库

五、查看连接情况

用来查看都有哪些客户端在连接我们的数据库:

show procsslist;

我们在 MySQL 交互环境里执行 show processlist;,用来查看当前所有连入数据库的客户端连接信息,执行后表格里会逐条展示每条连接的详情,其中 Id 是连接编号、User 是登录用户名、Host 是客户端连接地址、db 代表当前操作的数据库,Command 标记连接状态,示例里一条为 Sleep 休眠空闲状态、一条是 Query 正在执行查询命令,Time 记录连接持续时长,Info 字段显示正在执行的 SQL 语句,凭借这份查询结果,我们就能清晰掌握哪些用户、哪些设备正在连接访问数据库。

六、总结

本文介绍了MySQL数据库的管理操作,包括创建、删除、备份和恢复数据库的方法,以及字符集和校对集的设置问题。主要内容包括:1)创建数据库时会在指定目录生成同名文件夹,并记录元数据;2)删除数据库会同时删除物理文件夹和逻辑记录;3)字符集和校对集影响数据存储和比较规则;4)使用mysqldump进行逻辑备份,通过source命令恢复;5)查看客户端连接情况。文章还强调了删除数据库的危险性,并提供了数据库重命名的解决方案。

谢谢大家的观看!

相关推荐
前端与小赵1 小时前
数据库交互全链路实战:通用封装、批量优化与动态查询三大核心模块
数据库·python·sql
霸道流氓气质1 小时前
异步任务提交 + Redis 状态轮询模式实战指南
数据库·redis·缓存
GEO_youxuan1 小时前
2026年自定义报表工具推荐:五家优选品牌专业深度评测
数据库
mN9B2uk171 小时前
数据库性能优化三:程序操作优化
数据库
霸道流氓气质2 小时前
Spring Boot + Jasypt 实战指南:配置文件敏感信息加密完全手册
数据库·spring boot·oracle
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??
java·开发语言·数据库·mysql·面试·排序算法
我是一颗柠檬2 小时前
【Java项目技术亮点】多级缓存一致性方案:Canal+MQ实现数据库与缓存的最终一致
java·数据库·spring·缓存·kafka·rocketmq
WarPigs2 小时前
C# EntityFramework笔记
数据库·c#
csdn_aspnet2 小时前
mysql 查询树形,id与pid关联
数据库·mysql·tree·树形