在生产环境中,数据的安全性是至关重要的,任何数据的丢失收客易产生严重的后果
造成数据丢失的原因
从物理与逻辑的角度,备份可分为物理备份和逻辑备份
1、物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
2、逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份
从数据库的备份策略角度,备份可分为完全备份、差异备份、增量备份
完全备份是对整个数据库的备份、数据库结构的文件结构的备份
完全备份保存的是备份完成时刻的数据库
完全备份是增量备份的基础
完全备份的优点
完全备份的缺点
MySQL数据库的备份可以采用多种方式
mysqldump命令
mysqldump命令对单个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名
[root@localhost mysql]# mysqldump -u root -p school > /opt/school.sql
mysqldump命令对多个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --databases 库名 1 [库名2] ... > /备份路径/备份文件名
[root@localhost ~]# mysqldump -u root -p --databases school mysql > /opt/db_school_mysql.sql
对所有库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
[root@localhost ~]# mysqldump -u root -p --opt --all-databases > /opt/all.sql
在实际生产环境中,存在对某个特定表的维护操作,此时mysqldump同样发挥重大作用
使用mysqldump备份表的操作
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
[root@localhost ~]# mysqldump -u root -p school info > /opt/school_info.sql
#备份表的结构
[root@localhost ~]# mysqldump -u root -p -d school info > /opt/school_info.sql
使用mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入
使用source恢复数据库的步骤
mysql> source /opt/all.sql
使用mysql命令恢复数据
mysql -u 用户名 -p [密码] < 库备份脚本的路径
[root@localhost ~]# mysql -u root -p < /opt/all.sql
恢复表时同样可以使用source或者mysql命令进行
source恢复表的操作与恢复库的操作相同
当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
mysql -u 用户名 -p [密码] < 表备份脚本的路径
[root@localhost ~]# mysql -u root -p school < /opt/school_info.sql
在生产环境中,可以使用shell脚本自动实现定期备份
定期实施备份,制定备份计划或者策略,并严格遵守
除了进行完全备份,开启MySQL服务器的日志功能是很重要的
使用统一的和易理解的备份文件名称
使用mysqldump进行完全备份的存在的问题
增量备份就是备份自上一次备份之后增加或变化的文件或者内容
增量备份的特点
MySQL没有提供直接的增量备份方法
可以通过MySQL提供的二进制日志(binary logs)间接实现增量备份
MySQL进制日志对备份的意义
基于时间点恢复
增量恢复的方法
1、一般恢复
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
2、基于位置的恢复
mysqlbinlog --stop-position='操作 id' 二进制日志 | mysql -u 用户名 -p 密码
mysqlbinlog --start-position='操作 id' 二进制日志 | mysql -u 用户名 -p 密码
3、基于时间点的恢复
从日志开头截止到某个时间点的恢复
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
从某个时间点到日志结尾的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
从某个时间点到某个时间点的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
1、新建数据库和数据表,插入数据
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test
Database changed
mysql> create table info (
-> ID int(4) not null primary key auto_increment,
-> 姓名 varchar(10) not null,
-> 成绩 decimal(3,1) not null);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into info (姓名,成绩) values ('test01',88),('test02',80);
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from info;
+----+--------+--------+
| ID | 姓名 | 成绩 |
+----+--------+--------+
| 1 | test01 | 88.0 |
| 2 | test02 | 80.0 |
+----+--------+--------+
2 rows in set (0.00 sec)
2、对创建的数据库进行完全备份
[root@localhost ~]# mysqldump -u root -p test > /opt/test.sql
Enter password:
[root@localhost ~]# ls /opt
test.sql
[root@localhost ~]#
3、开启MySQL的二进制日志功能
[root@localhost ~]# vim /etc/my.cnf
...
[mysqld]
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysqladmin -u root -p flush-logs
Enter password:
[root@localhost ~]#
5、导出数据库更改日志并查看更改操作时间
#因为日志文件输出的是乱码,无法读取,可以用64位解码器输出按行读取显示
[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001 > /opt/bak.txt
[root@localhost ~]# vim /opt/bak.txt
6、误删操作恢复且后来添加的数据记录依然能够存在
(1)执行完全恢复
mysql> source /opt/test.sql
Query OK, 0 rows affected (0.01 sec)
...
mysql> select * from info;
+----+--------+--------+
| ID | 姓名 | 成绩 |
+----+--------+--------+
| 1 | test01 | 88.0 |
| 2 | test02 | 80.0 |
+----+--------+--------+
2 rows in set (0.00 sec)
(2)基于时间恢复后添加的两条数据记录
[root@localhost ~]# mysqlbinlog --no-defaults --stop-datetime='2020-01-08 11:00:13' /usr/local/mysql/data/mysql-bin.000001 | mysql -u root -p
Enter password:
[root@localhost ~]# mysqlbinlog --no-defaults --start-datetime='2020-01-08 11:00:27' /usr/local/mysql/data/mysql-bin.000001 | mysql -u root -p
Enter password:
#查看数据已经恢复
mysql> select * from info;
+----+--------+--------+
| ID | 姓名 | 成绩 |
+----+--------+--------+
| 1 | test01 | 88.0 |
| 2 | test02 | 80.0 |
| 3 | test03 | 65.0 |
| 4 | test04 | 92.0 |
+----+--------+--------+
4 rows in set (0.00 sec)