硬盘坏了,数据还找得回来吗?
引例 一个月的毕业设计
你花了一个月做毕业设计,文件都存在 D 盘。今天开机,D 盘坏了——一个月的心血一下子全没了。这时才后悔:当初为什么不复制一份到 U 盘或网盘?
数据库里存的是成绩、订单、账户余额,丢了更找不回来。所以要提前备份,出了事再用备份还原。
把数据库的数据复制一份保存起来,以防万一。例如导出成一个 .sql 文件,放到另一台电脑或网盘上。
数据库出了事,用备份把数据恢复回来。也叫恢复。一般是把 .sql 文件重新导入 MySQL。
备份的两个原则:尽早、经常——越早开始越好,定期做;多地、多份——不要只放在数据库这一台机器上。
备份的分类
引例 饭店大扫除
饭店做大扫除,可以关门停业彻底打扫;也可以照常营业但暂时不接新客;还可以边营业边打扫。打扫的范围也可以不同:每次全店都扫,或者只扫上次之后弄脏的地方。
备份数据库也一样,可以从三个角度来分。
直接复制数据库在硬盘上的文件。好比把 Word 文件本身拷走。
导出成 SQL 语句:怎么建表、插入哪些数据。本章的 mysqldump 就是逻辑备份。
| 冷备份 | 关掉数据库再备份。最稳妥,但要停止服务。 |
| 温备份 | 数据库在运行,只能读,不能写。 |
| 热备份 | 数据库照常读写,同时备份。技术要求最高。 |
每次备份全部数据。
备份自上一次完全备份以来变化的部分。
备份自上一次备份(不管哪种)以来变化的部分。
易混差异备份以上一次完全备份为准,越往后越大,还原只要两个文件;增量备份以上一次备份为准,每次都小,还原要把每一份按顺序用上。
用 mysqldump 备份
引例 搬家前列一张清单
搬家前,把书架上每一格放了哪些书写成一张清单。到了新家,照着清单一本本摆回去,书架就和原来一模一样。
mysqldump 做的就是这张清单:把建表语句和每一行数据,写成一个 .sql 文本文件。
mysqldump -u 用户 -p 库名 [表名…] > 文件.sql,在系统命令行里执行,不是在 MySQL 里。| 想备份 | 加上 |
|---|---|
| 几个库 | --databases 库1 库2 |
| 所有库 | --all-databases |
| 只要表结构 | --no-data |
mysqldump、mysql、mysqlbinlog 开头的程序SELECT、SHOW、CREATE 等开头的 SQL 语句用 mysql 还原
引例 游戏读档
打 boss 失败了,从存档点重来。备份出来的 .sql 文件里全是 CREATE TABLE 和 INSERT 语句,把它们再执行一遍,表就重新建起来,数据也插回去了。
还原就是「读档」:让 mysql 程序把备份文件读进去执行。
mysql -u 用户 -p 库名 < 文件.sql。备份用 mysqldump 和 >,还原用 mysql 和 <。| 备份 | 还原 | |
|---|---|---|
| 程序 | mysqldump | mysql |
| 符号 | > | < |
| 方向 | 数据库 → 文件 | 文件 → 数据库 |
mysqldump -u root -p teaching > D:/db_backup/teaching.sql mysql -u root -p teaching < D:/db_backup/teaching.sql
注意备份时没加 --databases,文件里就没有 CREATE DATABASE。还原前要先在 MySQL 里建好空库,否则报错 1049。
导入导出、数据库迁移
引例 把课程表发给别的部门
别的部门想要一份课程表,用 Excel 打开。可 .sql 备份文件只有 MySQL 认得。给别的程序用,就要导出成普通的文本文件:一行一条记录,字段之间用逗号隔开。
备份还原是 MySQL 自己用;导入导出是和外面交换数据。
-- 导出:把 c 表写成文本文件 SELECT * FROM teaching.c INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/c.txt' FIELDS TERMINATED BY ','; -- 导入:把文本文件读进已经建好的表 LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/c.txt' INTO TABLE teaching.c_copy FIELDS TERMINATED BY ',';
注意MySQL 只允许读写指定文件夹里的文件,用 SHOW VARIABLES LIKE 'secure_file_priv'; 查看是哪个。导出、导入的 FIELDS 写法要一致。
| 情况 | 做法 |
|---|---|
| 同一版本,换服务器 | 停掉 MySQL,复制整个数据目录,再启动 |
| 升级 MySQL 版本 | mysqldump 备份 → 装新版本 → mysql 还原 |
| 换成别的数据库系统 | 数据类型、SQL 写法都不同,要借助专门工具 |
大多数时候,迁移就是「在旧服务器备份,到新服务器还原」。
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| 空表 |
日志:数据库的黑匣子
引例 飞机的黑匣子
飞机上的黑匣子记录着飞行中的重要事件,出了事故,靠它还原经过。MySQL 运行时也在不停地记录:出了什么错,改了哪些数据,执行了哪些语句,哪条语句跑得特别慢。
这些记录就是日志。四种日志,各记各的事。
启动、停止、运行出错的信息。默认开数据库启动不了、突然崩溃,先看它。
所有修改数据的操作。默认开和备份配合,能把数据恢复到某个时间点。最重要。
所有操作,包括每一条 SELECT。默认关用来审计;数据量很大,平时不开。
执行时间超过阈值(默认 10 秒)的语句。默认关用来找出拖慢系统的 SQL。
-- 二进制日志开了没有,有哪些文件 SHOW VARIABLES LIKE 'log_bin'; SHOW BINARY LOGS; -- 打开慢查询日志,超过 2 秒就算慢 SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2;