前言
数据备份的重要性
1、在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果
2、造成数据丢失的原因
● 程序错误
● 人为操作错误
● 运算错误
● 磁盘故障
● 灾难(如火灾,地震)和盗窃
一、数据库备份的分类
1.1 从物理与逻辑的角度,备份可分为物理备份和逻辑备份
1.1.1 物理备份
1. 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
2. 物理备份方法
● 冷备份(脱机备份):是在关闭数据库的时候进行的
● 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
● 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
1.1.2 逻辑备份
● 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份
1.2 从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份
1.2.1 完全备份
● 完全备份:每次对数据库进行完整的备份
1.2.2 差异备份
● 差异备份:备份自从上次完全备份之后被修改过的文件
1.2.3 增量备份
● 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
二、MySQL完全备份与恢复
2.1 常见的备份方法
2.1.1 物理冷备
● 备份时数据库处于关闭状态,直接打包数据库文件
● 备份速度快,恢复时也是最简单的
2.1.2 专业备份工具mysqldump或mysqlhotcopy
● mysqldump常用的逻辑备份工具
● mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
2.1.3 启用二进制日志进行增量备份
● 进行增量备份,需要刷新二进制日志
2.1.4 第三方工具备份
● 免费的MySQL热备份软件Percona XtraBackup
2.2 MySQL完全备份简介
● 是对整个数据库、数据库结构和文件结构的备份
● 保存的是备份完成时刻的数据库
● 是差异备份与增量备份的基础
● 每次对数据进行完整的备份,完全备份是增量备份的基础,完全备份保存的是备份完成时刻的数据库
● 优点:备份与恢复操作简单方便
● 缺点:数据存在大量的重复,占用大量的备份空间,备份与恢复时间长
2.3 数据库完全备份分类
2.3.1物理冷备份与恢复
● 关闭MySQL数据库
● 使用tar命令直接打包数据库文件夹
● 直接替换现有MySQL目录即可
- 在MySQL中先创建auth库,再创建users表,写入一行记录(用于验证)
mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
- 先关闭数据库服务,再打包备份
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# mkdir /backup
[root@server1 ~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data
[root@server1 ~]# cd /backup/
[root@server1 backup]# ll
总用量 1368
-rw-r--r--. 1 root root 1400335 11月 4 12:15 mysql_all-2020-11-04.tar.gz
- 将原来的数据移走到备份文件夹中,解压刚才备份的tar包到/opt目录下,再移动到mysql服务的文件夹中。
[root@server1 backup]# mv /usr/local/mysql/data/ /backup/
[root@server1 backup]# tar zxf mysql_all-2020-11-04.tar.gz -C /opt/
[root@server1 backup]# mv /opt/usr/local/mysql/data/ /usr/local/mysql/data
- 重启mysql服务,登录mysql,查看数据是否恢复
[root@server1 mysql]# systemctl start mysqld.service
2.3.2 mysqldump备份与恢复
● MySQL自带的备份工具,可方便实现对MySQL的备份
● 可以将指定的库、表导出为SQL脚本(.sql结尾)
● 使用命令MySQL导入备份的数据
1. mysqldump命令对单个库进行完全备份
● mysqldump -u 用户名 -p [密码][选项][数据库] > /备份路径/备份文件名
● 单库备份的示例
mysqldump -u root -p auth > /backup/auth.sql
mysql -u root -p mysql > /backup/mysql.sql
2. mysqldump命令对多个库进行完全备份
● mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2]… > /备份路径/备份文件名
● 多库备份的示例
mysqldump -u root -p --databases auth mysql > /backup/databases-auth-mysql.sql
3. mysqldump备份补充
mysqldump -u root -p --all-databases > 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表的结构
4. mysqldump备份恢复
● 方法一:mysql命令恢复(在Linux中)
● mysql -u 用户名 -p [密码] < 库备份脚本的路径
[root@server1 ~]# mysqldump -u root -p client_user_info > client_user_info-$(date +%F).sql
mysql> drop database client;
mysql> show databases;
mysql> create database client;#建立空库
[root@server1 ~]# mysql -u root -p client < client_user_info-$(date +%F).sql
● 方法二:source命令恢复(在mysql>中)
[root@server1 ~]# mysqldump -u root -p client_user_info > client_user_info-$(date +%F).sql
mysql> drop database client;
mysql> create database client;
mysql> use client;
mysql> source /root/client_user_info-$(date +%F).sql
2.3.2 恢复表的操作
- 恢复表时同样可以使用source或者mysql命令
- source恢复表的操作与恢复库的操作相同
- 当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库民,且目标库必须存在
● mysql -u 用户名 -p [密码] < 表备份脚本的路径
● mysql -u root -p mysql < /backup/mysql-user.sql - 可以使用Shell脚本自动实现定时备份
三、MySQL增量备份与恢复
3.1 MySQL增量备份
1. 使用mysqldump进行完全备份存在的问题
● 备份数据中有重复数据
● 备份时间与恢复时间过长
2. MySQL增量备份是自上一次备份后增加/变化的文件或者内容
3. 特点
● 没有重复数据,备份量不大,时间短
● 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复
4. MySQL没有提供直接的增量备份方法
5. 可通过MySQL提供的二进制日志间接实现增量备份
6. MySQL二进制日志对备份的意义
● 二进制日志保存了所有更新或者可能更新数据库的操作
● 二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
● 只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
完整备份
mysqldump -uroot -p cloud > /opt/bak_sql/cloud-$(date +%F).sql#备份数据库
开启增量备份
vi /etc/my.cnf
[mysql]
log_bin=/usr/local/mysql/data/mysql_bin
service mysqld restart
下面开始操作增量备份
mysqladmin -uroot -p flush-logs#将二进制日志更新,产生新的日志文件查询产生新的日志
cd /user/local/mysql/data
ls -lh#查询增量备份结果
查询该二进制日志内容是否正确
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003
再次操作,再次增量备份
insert into ttt values('sisi','90');#正确操作
delete from ttt where name='jack';#误删除
insert into ttt values('haha','65');#正确操作
开始操作增量备份
mysqladmin -uroot -p flush-logs#将二进制日志更新,产生新的日志文件
#查询产生新的日志
cd /usr/local/mysql/data
ls -lh#查询增量备份结果
查询该二进制日志内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000004
3.2 MySQL数据库增量恢复
3.2.1 一般恢复
● 将所有备份的二进制日志内容全部恢复
mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p
3.2.2 基于位置恢复
● 数据库在某一时间点可能既有错误的操作也有正确的操作
● 可以基于精准的位置跳过错误的操作
#删除原先坏掉的那张表
use cloud;
delete from ttt where name='sisi';#误删除
delete from ttt where name='haha';#误删除
#查询该二进制日志内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000004
#上一次正确操作的位置点停止
mysqlbinlog --no-defaults --stop-position='559' /usr/local/mysql/data/mysql_bin.000004 | mysql -uroot -p
#下一次正确操作的位置点开始
mysqlbinlog --no-defaults --stop-position='655' /usr/local/mysql/data/mysql_bin.000004 | mysql -uroot -p
3.2.3 基于时间点恢复
● 跳过某个发生错误的时间点实现数据恢复
#删除原先坏掉的那张表
use cloud;
drop table ttt;
#还原完全备份的那个数据库;
mysql -u root -p cloud < /opt/bak_sql/client-2019-03-14.sql #还原完全备份的数据库
#停止错误的时间
mysqlbinlog --no-defaults --stop-datetime='2019-03-14 12:13:20' /usr/local/mysql/data/mysql_bin.000004 | mysql -uroot -p
#开始正确的时间
mysqlbinlog --no-defaults --start-datetime='2019-03-14 12:13:30' /usr/local/mysql/data/mysql_bin.000004 | mysql -uroot -p