ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL学习(2)数据库创建与备份实战指南

MySQL学习(2)数据库创建与备份实战指南

🔥keyipatience:个人主页

🎬作者简介:C/C++后端开发学习者

🌟专栏传送门:《c++》《linux》《c++高阶数据结构》《c++数据结构与算法》《前端学习》

《Git》《Mysql》

⭐️patience is key in life

创建数据库

create database [if not exists] 库名 [character set 字符集] [collate 校对规则];
  • []包裹的内容代表可选,可以写,也可以省略
  • if not exists:判断,如果同名数据库不存在才创建;库已经存在时不会抛出错误,写脚本、初始化项目强烈建议带上
  • character set(简写charset):字符集,决定数据库可以存储哪些文字符号
  • collate:校对规则,决定字符串怎么对比、怎么排序,比如是否区分英文字母大小写

示例 1:最简创建数据库(不指定字符集、校对规则)

create database db1; //解释:创建名为 `db1` 的数据库。 缺点:没有指定字符集,会使用 mysql 服务的默认字符集,不同版本默认值不一样,容易出现中文乱码,**实际开发不推荐**。

示例 2:带上 if not exists,避免重复创建报错

create database if not exists db2;

判断,没有 db2 就新建;已经有 db2,则不执行任何操作,不会报错。

示例 3:创建数据库,指定字符集 utf8mb4

create database if not exists db3 character set utf8mb4;

utf8mb4是开发首选字符集,支持中文、特殊符号、emoji 表情。

名称最大字节支持 emoji推荐程度
utf8(mysql)3 字节不支持不推荐
utf8mb44 字节支持首选

示例 4:完整版(字符集 + 校对规则,项目最推荐写法)

create database if not exists db4 character set utf8mb4 collate utf8mb4_general_ci;

解释:

  • 字符集:utf8mb4
  • 校对规则:utf8mb4_general_ci
    • 后缀ci= case insensitive,意思:比较字符串不区分大小写,a和A判定为相等。

补充:如果你想要区分大小写,可以使用utf8mb4_bin

create database if not exists db5 character set utf8mb4 collate utf8mb4_bin;

案例 1:不区分大小写(utf8mb4_general_ci)

-- 创建数据库,指定校对规则 create database if not exists test1 character set utf8mb4 collate utf8mb4_general_ci; -- 切换进入库 use test1; -- 创建测试表 create table person(name varchar(20)); -- 插入测试数据 insert into person values('a'); insert into person values('A'); insert into person values('b'); insert into person values('B');

等值查询测试

select * from person where name='a';

查询结果:

+------+ | name | +------+ | a | | A | +------+

排序测试

select * from person order by name;

输出顺序:a,A,b,B解释:大小写视为相同,先放 a 相关,再放 b 相关

案例 2:区分大小写(utf8mb4_bin)

create database if not exists test2 character set utf8mb4 collate utf8mb4_bin; use test2; create table person(name varchar(20)); insert into person values('a'); insert into person values('A'); insert into person values('b'); insert into person values('B');

等值查询测试

select * from person where name='a';

查询结果:

+------+ | name | +------+ | a | +------+

解释:二进制严格匹配,只会匹配小写的a,大写A不会被查到

排序测试

select * from person order by name;

输出顺序:A,B,a,b原理:ascii 码大写字母编码数字更小,排在前面

查看数据库

查询当前服务器上所有数据库

show databases;

查看某个数据库的详细创建信息

show create database db4;

作用:可以看到这个数据库当前使用的字符集、校对规则。

查看当前处于哪一个数据库

select database();

查看 MySQL 当前所有正在连接、正在执行的会话(连接进程),排查慢查询、异常连接、卡死、可疑登录。

show processlist;

修改数据库(修改字符集、校对规则)

只能修改字符集和校对规则,不能修改数据库名字!!数据库的名字不能轻易改动

alter database db4 character set utf8mb4 collate utf8mb4_general_ci;

切换数据库(进入数据库)

想要操作库里面的表,必须先切换到这个数据库

use db4;

删除数据库

高危操作!删除之后,库里面所有表、全部数据都会直接消失,无法恢复!

drop database if exists db1; //`if exists`:只有数据库存在才删除,不存在也不会报错。

数据库备份与恢复

前提:mysqldump是 mysql 自带的备份工具,在系统命令行执行,不是在 mysql 内部命令行,要先退出 mysql 连接。

备份 mysqldump

mysqldump -P端口号 -u用户名 -p密码 -b 数据库名 > 备份文件路径
  • -P3306:指定端口,默认 3306,端口是 3306 时可以省略
  • -u root:登录用户名
  • -p123456:登录密码(p和密码之间不要空格;也可以只写-p,回车后再输入密码,更安全,不会明文显示密码)
  • -b(也就是--databases):带上这个参数,备份文件里自带 create database + use 语句,恢复的时候不用手动先建库
  • >:重定向符号,把导出的 sql 内容写入文件

示例 1:备份单个数据库(带 -b,推荐写法)

mysqldump -p3306 -u root -p123456 -b mytest > d:/mytest.sql

导出后的mytest.sql里面包含:建库、建表、插入数据的全部 sql 语句。

示例 2:只备份库里面某几张表(不带 -b)

mysqldump -u root -p123456 mytest user student > d:/table_backup.sql

这种写法没有建库语句,恢复前必须自己先建好数据库,并且use切换进去。

示例 3:一次性备份多个数据库

mysqldump -u root -p123456 -b db1 db2 db3 > d:/multi_db.sql

数据还原

情况 1:备份时加了-B(--databases)

mysqldump -u root -p -B test1 > test1.sql

还原不需要手动创建数据库,不需要选库

方式 1:source 方式(进入 mysql 客户端里面执行)

mysql -u root -p source /home/ubuntu/mysqlydm/test1.sql;

方式 2:命令行管道导入(不用进 mysql)

mysql -u root -p < test1.sql

情况 2:备份时没有-B(单库导出 / 只导出几张表)

备份示例(导出 test1 库里面 student、score 两张表)

mysqldump -u root -p test1 student score > table.sql

特点:sql 文件没有 create database,没有 use,只有建表和数据 还原必须三步:建库 → 切换到这个库 → 导入

方式 1:source 写法

-- 1. 手动创建数据库(字符集最好和原来一致 utf8mb4) create database test1 character set utf8mb4 collate utf8mb4_unicode_ci; -- 2. 使用这个数据库 use test1; -- 3. 执行还原 source /home/ubuntu/mysqlydm/table.sql;

方式 2:命令行管道导入(必须在命令指定库名)

mysql -u root -p test1 < table.sql

这里末尾的test1就是指定导入到哪个库里,等价于use test1

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进