目录
一、数据备份的重要性
二、数据库备份的类型
2.1 物理备份
① 冷备份(脱机备份)
② 热备份 (联机备份)
③ 温备份
2.2 逻辑备份
① 完全备份
② 差异备份
③ 增量备份
2.3 备份策略方式比较
三、常见的备份方式
物理冷备: (完全备份)
专用备份工具mydump或mysqlhotcopy (完全备份,逻辑备份)
启用二进制日志进行增量备份 (增量备份)
第三方工具备份
四、MySQL完全备份与恢复
4.1 什么是完全备份
4.2 完全备份的优缺点
4.3 完全备份的方法
1)物理冷备份与恢复
2)mysqldump备份与恢复
五、完全备份与恢复 操作演示
5.1 物理冷备份
备份操作
测试完全恢复
5.2 逻辑备份(使用mysqldump工具)
5.2.1 mysqldump完全备份
5.2.2 mysqldump完全恢复
六、MySQL增量备份与恢复
6.1 MySQL增量备份介绍
6.2 MySQL增量备份的方法
6.3 MySQL数据库增量恢复
七、增量备份与恢复 操作演示
7.1 增量备份
二进制文件介绍及开启
查看二进制文件的内容
在表中增加数据在进行增量备份
7.2 增量恢复
一般恢复
断点恢复
备份的主要目的是灾难恢复。
在生产环境中,数据的安全性至关重要。
任何数据的丢失都可能产生严重的后果。
造成数据丢失的原因:
数据库备份可以分为 物理备份 和 逻辑备份
物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份,这种类型的备份适用于在出现问题的时候需要快速恢复的大型重要数据库。
物理备份又可以分成冷备份(脱机备份)、热备份(联机备份)和温备份。
逻辑备份是对数据库逻辑组件的备份.表示为逻辑数据库结构,这种类型的备份适用于可以编辑数据值或表结构
从数据库的备份策略角度来看,备份又可分为完全备份、差异备份和增量备份
备份方式 | 完全备份 | 差异备份 | 增量备份 |
---|---|---|---|
完全备份时的状态 | 表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 |
(阿里云的工具:dts,支持热迁移)
优点:
缺点:
先关闭数据库,之后打包备份
systemctl stop mysqld #先关闭服务
mkdir /backup/ #创建备份目录
rpm -q xz #使用xz工具进行压缩,检查xz工具是否已安装
yum install xz -y #如果没安装,可以先yum安装
tar Jcf /backup/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data #打包数据库文件。/usr/local/mysql/data 为数据库文件存放目录
cd /backup/ #切换到备份目录
ls #查看目录内容
tar tf mysql_all_2022-06-05.tar.xz #查看tar包内的文件
rm -rf /usr/local/mysql/data/* //删除mysql的数据
systemctl start mysqld.service 开启数据库
mysql -uroot -p 尝试登录数据库
ls /usr/local/mysql/data/ 查看文件发现生成新的数据库文件
删除新生成的data目录
tar Jxf /backup/(保存的备份文件名) -C /backup/
cp /backup/usr/local/mysql/data /usr/local/mysql/
systemctl start mysqld.service
mysql -uroot -p123456 登录验证
MySQL自带的备份工具,可方便实现对MySQL的备份
mysqldump是常用的逻辑备份工具。
mysqldump可以将指定的库、表导出为SQL脚本。
1)完全备份一个或多个完整的库(包括库中所有的表)
mysqldump -uroot -p[密码] --databases 库名1 [库名2].. >/备份路径/备份文件名.sql
#导出的就是数据库脚本文件
2) 完全备份MySQL服务器中所有的库(包括库中所有的表)
mysqldump -u root -p[密码] --all-databases > / 备份路径/备份文件名.sql
3)完全备份指定库中的部分表
注意:只备份表,sql语句中只有对表的操作,没有对库的操作。恢复时需要人为确认库存在。
mysqldump -u root -p[密码] [-d] 库名 表名1 [表名2] ... > /备份路径/备份文件名.sql
#使用“-d"选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份
4)查看备份文件
备份文件中保存的是sql语句。即以sql语句的形式,把库、表结构、表数据保存下来。
cd /mysql_back
cat 包名 | grep -v "^--" |grep -v "^/" |grep -v "^$"
1)恢复数据库
先删除数据库,之后进行恢复。
##删除数据库yuji##
mysql -u root -p -e 'drop database wangwu;'
#"-e"选项,用于指定连接MySQL后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;' #查看当前有哪些数据库
##恢复数据库yuji##
mysql -u root -p < /mysql_back/wangwu.sql #重定向输入库文件
mysql -u root -p -e 'SHOW DATABASES;' #查看当前有哪些数据库
2)恢复数据表
当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
##删除yuji库中的class表##
mysql -u root -p -e 'drop table wangwu.account wangwu.account2;'
mysql -u root -p -e 'show tables from wangwu;' #查看yuji库中的表,已无class表
##恢复yuji库中的class表##
mysql -u root -p wangwu < /mysql_back/account_account2.sql #重定向导入备份文件,必须指定库名,且目标库必须存在
mysql -u root -p -e 'show tables from wangwu;'
使用mysqldump进行完全备份存在的问题
增量备份是什么:
增量备份的特点
MySQL没有提供直接的增量备份方法
可通过MySQL提供的二进制日志间接实现增量备份
MySQL二进制日志对备份的意义
一般恢复
基于位置恢复
基于时间点恢复
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1
#二进制日志有三种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认为STATEMENT
#server-id 为服务的序号,在MySQL主备、高可用中需要指定服务的序号
① STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
② ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大
create table info
insert into info values(1,'zhangsan');
insert into info values(2,'lisi');
delete id=zhangsan
③ MIXED 推荐使用
一般的语句使用statement,函数使用ROW方式存储。
#改为配置文件需要重启服务
systemctl restart mysqld
cp /usr/local/mysql/data/mysql-bin.000001 /mysql-bin/
#把日志文件复制到/mnt目录下慢慢看,可以直接使用cat查看
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
#--no-defaults : 默认字符集(不加会报UTF-8的错误)
#--base64-output=decode-rows: 使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
mysqladmin -uroot -p123456 flush-logs;
#刷新二进制日志文件(为了不重启,进行刷新,这样二进制文件会重新生成一个,相当于增量备份)
二进制日志中需要关注的部分
1、at :开始的位置点
2、end_log_pos:结束的位置 position (位置点)
3、时间戳
4、SQL语句
一般恢复
基于位置恢复
基于时间点恢复
将所有备份的二进制日志内容全部恢复
use wangwu;
delete from class1 where id=2; #删除今天新增加的数据
delete from class1 where id=3;
#增量恢复(今天新增加的两条数据记录保存在mysql-bin.000002日志中)
mysqlbinlog --no-defaults /bak/mysql-bin.000002 | mysql -u root -p
mysql -u root -p -e 'select * from wangwu.class1;' #查看表中数据
向class表中插入4条数据,之后刷新二进制日志,移动前一个日志
mysqladmin -u root -p flush-logs #刷新日志,生成新的二进制日志
cp /usr/local/mysql/data/mysql-bin.000003 /mysql-bin #将前一个日志复制到/bak/目录下
mysqlbinlog --no-defaults --base64-output=decode-rows -v /mysql-bin.000003 > /mysql-bin/nlog.txt #将二进制文件内容重定向到binlog.txt文件中
基于位置的断点恢复
mysqlbinlog --no-defaults --start-position='位置点' 文件名 | mysql -u root -p
#从某一个位置点开始恢复,一直到日志结尾
mysqlbinlog --no-defaults --stop-position='位置点' 文件名 | mysql -u root -p
#从日志开头,一直恢复到某一个位置点前结束
mysqlbinlog --no-defaults --start-position='xxx'--stop-position='位置点' 文件名 | mysql -u root -p
#从某一个位置点开始恢复,一直到某一个位置点前结束
示例1:
恢复最后两行,第7~8行
use wangwu;
delete from class1 where id between 4 and 7; #删除cid为4到7的数据记录
cat /mysql-bin/nlog.txt #查看二进制文件内容,找到小黄对应的位置点
#一直恢复到结尾
mysqlbinlog --no-defaults --start-position='9054' /mysql-bin/mysql-bin.000003 | mysql -u root -p
mysql -u root -p -e 'select * from wangwu.class;' #查看表数据
示例2:
只恢复第4行
use yuji;
delete from class1 where id between 6 and 7; #删除cid为6到7的数据记录
cat /mysql-bin/nlog.txt #查看二进制文件内容,找到竹笛后面的位置点
#从头开始恢复,在"id=4的行"的SQL语句后面截止
mysqlbinlog --no-defaults --stop-position='8765' /mysql-bin/mysql-bin.000003 | mysql -u root -p
mysql -u root -p -e 'select * from wangwu.class1;' #查看表数据
示例3:
恢复第5~6行
cat /mysql-bin/binlog.txt #查看二进制文件内容,找到id5和id6的位置点
#从id 5 恢复到 id 6
mysqlbinlog --no-defaults --start-position='8765' --stop-position='9343' /mysql-bin/mysql-bin.000003 | mysql -u root -p
mysql -u root -p -e 'select * from wangwu.class;' #查看表数据
基于时间点的断点恢复
注意:日期必须是"yyyy-mm-dd"的格式
mysqlbinlog --no-defaults --start-datetime='时间点' 文件名 | mysql -u root -p
#从某一个时间点开始恢复,一直到日志结尾
mysqlbinlog --no-defaults --stop-datetime='时间点' 文件名 | mysql -u root -p
#从日志开头,一直恢复到某一个时间点前结束
mysqlbinlog --no-defaults --start-datetime='起始时间点' --stop-datetime'结束时间点' 文件名 | mysql -u root -p
#从某一个时间点开始恢复,一直到某一个位置点前结束