数据库的备份与恢复
一、数据库备份的重要性
数据库备份的重要性主要体现在:
- 提高系统的高可用性和灾难可恢复性,在数据库系统崩溃是。没有数据库备份就没办法找到数据。
- 使用数据库备份还原数据库,是数据库崩溃是提供数据恢复最小代价的最优方案,如果让用户重新添加数据,代价太大。
- 没有数据就没有一切,数据库备份是一种防范灾难的强力手段。
使用数据库的过程中,有多种原因造成数据的丢失:
- 程序错误:指对数据库操作的程序难免有些错误,造成数据丢失。
- 人为错误:误操作造成的数据被破坏,也可能是黑客对系统攻击造成的。
- 计算机失败:指运行数据库的服务器操作系统或软件损坏,有可能造成数据的损坏。
- 磁盘失败:指硬盘等存储数据的硬件设备,长时间运行后可能损坏,造成数据丢失。
二、数据库的备份分类
从物理与逻辑的角度,备份可分为
- 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份方法
- 冷备份(脱机备份):是在关闭数据库的时候进行的
- 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
- 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
- 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份
从数据库的备份策略角度备份可分为:
- 完全备份:每次对数据库进行完整的备份
- 差异备份:备份自从上次完全备份之后被修改过的文件
- 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
三、完全备份、增量备份概述与对比
完全备份:
- 是对整个数据库、数据库结构和文件结构的备份;
- 保存的是备份完成时刻的数据库;
- 是差异备份与增量备份的基础
- 每次对数据进行完整的备份
优点: 备份与恢复操作简单方便
缺点:
数据存在大量的重复;
占用大量的备份空间;
备份与恢复时间长。
增量备份:
- MySQL增量备份是自上一次备份后增加/变化的文件或者内容 特点
- 没有重复数据,备份量不大,时间短;
- 依靠二进制日志文件进行逐次增量备份,单个文件丢失则数据不完整,安全性低
MySQL二进制日志对增量备份有重要的作用
-
二进制日志保存了所有更新或者可能更新数据库的操作;
-
二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件;
-
只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
备份方式比较
备份方式 | 完全备份 | 差异备份 | 增量备份 |
---|---|---|---|
完全备份时的状态 | 表1、表2 | 表1、表2 | 表1、表2 |
第1次添加内容 | 创建表3 | 创建表3 | 创建表3 |
备份内容 | 表1、表2、表3 | 表3 | 表3 |
第2次添加内容 | 创建表4 | 创建表4 | 创建表4 |
备份内容 | 表1、表2、表3、表4 | 表3、表4 | 表4 |
四、完全备份的实例
1.4.1、冷备份与数据恢复
备份前需要先停止数据库服务,在直接打包压缩数据库文件
数据库所有文件目录位置:/usr/local/mysql/data
故障时,停止服务,将故障的数据库文件移走到备份文件夹中,解压刚才备份数据库包到/restore目录下,再移动到/usr/local/mysql/data下,再重启服务
恢复成功
1.4.2、mysqldump备份与恢复
备份方法:
mysqldump -u root -p --all-databses > all-data-$(date +%F).sql
###备份所有数据库到当前目录下的all-data-$(date +%F).sql 文件
mysqldump -u root -p -databases auth mysql > auth-mysql.sql ###备份auth和mysql库
mysqldump -u root -p auth > auth-$(date +%F).sql ###备份auth数据库
mysqldump -u root -p mysql user > mysql-user-$(date +%F).sql ###备份mysql的user表
mysqldump -u root -p -d mysql user > /tmp/desc-mysql-user.sql ###备份mysql库user表的结构
实例一
单独备份一个auth库
mysql> drop database auth;
Query OK, 3 rows affected (0.02 sec)
mysql> create database test;#命名可根据需要
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
方法一:在数据库外导入
[root@server1 ~]# mysql -u root -p test < auth-2020-11-02.sql #将刚刚备份的导入test
Enter password:
方法二:在数据库内用source
#这里必须要use 数据库,否则无法有对应的数据库可以导入
mysql> use test;
mysql> source /auth-2020-11-02.sql;
查看恢复结果
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| info |
| test |
| zf |
+-------------------+
3 rows in set (0.00 sec)
mysql> select * from info;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 2 | liqi | 杭州 |
|