MySQL备份与恢复
文章目录
一、数据库备份的分类
数据的安全性任何数据的丢失都可能产生严重的后果
造成数据丢失的原因
程序错误
人为操作错误
运算错误
磁盘故障
灾难(如火灾、地震)和盗窃
1、 常见的备份方法
1.1 物理备份
数据库备份可以分为物理备份和逻辑备份。
备份时数据库处于关闭状态,直接打包数据库文件备份速度快,恢复时也是最简单的
1.2 逻辑备份
逻辑备份是对数据库逻辑组件的备份.表示为逻辑数据库结构这种类型的备份适用于可以编辑数据值或表结构
专用备份工具mydump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MylSAM和ARCHIVE表
启用二进制日志进行增量备份
进行增量备份,需要刷新二进制
MysQL支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。
2、备份策略
从数据库的备份策略角度,备份可分为
完全备份:每次对数据库进行完整的备份
差异备份:备份自从上次完全备份之后被修改过的文件
增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
2.3 完全备份
每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长
每次都进行完全备份,会导致备份文件占用空间巨大,并且有大量的重复数据,恢复时,直接使用完全备份的文件即可
2.4 差异备份
备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份
每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,再恢复差异备份的数据
2.5 增量备份
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失
每次增量备份都是在备份在上一次完成全备份
每次增量备份都是备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间
恢复数据,需要按照次序恢复完全备份和增量备份的数据
备份方式比较备份方式
| 备份方式 | 完全备份 | 差异备份 | 增量备份 |
|---|---|---|---|
| 完全备份时状态 | 表1、表2 | 表1 、表2 | 表1 、表2 |
| 第一次添加内容 | 创建表 | 创建表3 | 创建表 |
| 备份内容 | 表1、表2、表3 | 表3 | 表3 |
| 第二次添加内容 | 创建表4 | 创建表4 | 创建表4 |
| 备份内容 | 表1、表2、表3、表4 | 表3、表4 | 表4 |
逻辑备份的策略(增、全、差异)如何选择逻辑备份策略(频率)合理值区间力
一周一次的全备,全备的时间需要在不提供业务的时间区间进行 PM 10点AM5:00之间进行全备
增量:3天/2天/1天一次增量备份差异:选择特定的场景进行备份
—个处理(NFS)提供额外空间给与mysql 服务器用
3、日志作用
错误日志
用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
通用查询日志
用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
二进制日志
用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认己开启
log-bin=mysql-bin 或 log_bin=mysql-bin
中继日志
一般情况下它在Mysql主从同步(复制)、读写分离集群的从节点开启。主节点一般不需要这个日志
慢查询日志
用圣记录所有执行时间超过long query time秒的语句查询语句执行时间长,以便提醒优化,默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysgl_slow_guery.lclong_query time=5 #设置超过5秒执行的语句被记录,缺省时为10秒
配置文件
MySQL的日志默认保存位置为/usr/local/mysql/data
vim /etc/my.cnf
[mysqld]
log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
log-bin=mysql-bin
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
-----------------
systemctl restart mysqld
mysql -u root -P
show variables like 'general%'; #查看通用查询日志是否开启
#variables表示变量like表示模糊查询
show variables like 'log_bin%'; #查看二进制日志是否开启
show variables like '%slow%'; #查看慢查询日功能是否开启
show variables like 'long_query_time'; #查看慢查询时间设置
set global slow_query_log=ON; #在数据库中设置开启慢查询的方法
二进制自志开启后,重启mysql会在目录中查看到二进制日志
cd /usr/local/mysql/data
ls
mysql-bin.000001 #开启二进制日志时会产生一个索引文件及一个索引列表
索引文件:记录更新语句
#重启mysql的时候会更新索引文件,用于记录新的更新语句,刷新二进制日志
mysql-bin.index #二进制日志文件的索引
二、实践检验
1、完全备份与恢复
实验环境
use kgc;
create table if not exists test1 (id int(4) not null auto_increment,
name varchar(10) not null,
age char (10) not null,
hobby varchar(50),
primary key (id)) ;
insert into test1 values(1,'lisi',20,'running');
insert into test1 values(2,'wangwu',30,'singing');
1.1 物理冷备份与恢复
systemctl stop mysqld
yum -y install xz
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/ #压缩备份
mv /usr/local/mysql/data/ /opt/
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C / #解压恢复
cd /usr/local/mysql/data
mv /usr/local/mysql/data/* ./
1.2 mysqldump备份与恢复(温备份)
create table test2 (id int,name char(10),age int,sex char(4));
insert into test2 values(1,'user',11,'性别');
insert into test2 values(2,'user',11,'性别');
①完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1[库名2] ... >/备份路径/备份文件名.sql
#导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases kgc >/opt/kgc.sql #备份一个kgc库
mysqldump -u root -p --databases mysql kgc > /opt/mysql-kgc.sql #备份mysql与kgc两个库
②定全备份MySQL服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases >/opt/all.sql
③完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2]...> /备份路径/备份文件名.sqI
例:
mysqldump -u root -p [-d] kgc infol info2 > /opt/kgc_info1.sql
#使用“-d"选项,说明只保存数据库的表结构,做为一个表结构模板 #不使用“-d"选项,说明表数据也进行备份
④查看备份文件
grep -v "^--" /opt/kgc_test1.sql | grep -v "^/" | grep -v "^$"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sym4IIir-1660469283037)(F:\学习文档\临时\微信截图_20220810210510.png)]
1.3 Mysql完全恢复
使用mysqldump导出的文件、可使用导入的方法
source命令 mysql命令
使用source恢复数据库的步骤登录到MysQL数据库执行source备份sql脚本的路径
准备环境
yzf #数据库名
test1 #yzf库下的表名
①恢复表
mysqldump -uroot -p4455 yzf test1 > /opt/test.sql #备份表
mysql -uroot -p4455 #登录数据库查看
mysql -uroot -p4455 -e 'drop table school.info;' #删除数据库的表
恢复数据表
> select * from yzf; #查询所有字段
> show tables; #查看表信息
> source /opt/test.sql #加载数据
mysql -uroot -p4455 -e 'show tables from yzf;'
方式二:
mysql -uroot -p4455 yzf < /abc/yzf.test.sql #恢复test1表
mysql -uroot -p4455 -e 'show tables from yzf;' #查看test1表


mysqldump 严格来说属于温备份,会需要对表进行写入的锁定在全量备份与恢复实验中,假设现有yzf库,yzf库中有一个test1表,需要注意的一点为当备份时加–databases ,表示针对于yzf库
②恢复数据库
mysqldump -uroot -p123123 --databases yzf > /opt/yzf.sql #备份库
#恢复命令过程为:
mysql -uroot -p4455
drop database ky13;
exit
mysql -uroot -p4455 < /opt/yzf.sql
----------------------------------
#当备份时不加 --databases,表示针对yzf库下的所有表
#备份命令
mysqldump -uroot -p4455 yzf > /opt/test_all.sql
#恢复过程:
mysql -uroot -p123123 'drop database yzf;'
create database yzf;
exit
mysql -uroot -p4455 yzf < /opt/test_all.sql
#两种方式的备份(前者会从"create databases"开始,而后者则全是针对表格进行操作)
③在生产环境中,可以实现定时备份
vim /etc/crontab
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p4455 yzf test1 > ./kgc_infol_$(date +%Y%m%d).sql;/usr/local/mysql/bin/mysqladmin -u root -p4455 flush-logs
#每周六晚上一点备份一次
2、增量备份与恢复
一、增备实验
1.开启二进制曰志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为NIXED(混合输入)
server-id = 1 #可加可不加该命令
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于sQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
RSTATEMENT(基于SQL语句):每一条涉及到被修改的sql都会记录在binlog中
**缺点:**日志量过大,如sleep()函数,last_insert_id()>,以及user-definedfuctions (udf) 、主从复制等架构记录日志时会出现问题
**总结:**增删改查通过sqI语句来实现记录,如果用高并发可能会出错,可能时间差异或着延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底
ROW(基于行):只记录变动的记录,不记录sql的上下文环境
**缺点:**如果遇到update… . . …set. . . .where true 那么binlog的数据量会越来越大
**总结:**update、 delete以多行数据起作用、来用行记录下来,
只记录变动的记录,不记录=ql的上下文环境,
比数sql语句记录一行,但是Row就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低比较大所以记录都记下来
MIXED (混合模式)推荐使用:一般的语句使用statement,函数使用ROW方式存储。
systemctl restart mysqld
查看二进制日志文件的内容
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults /opt/mysql-bin.000002
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v:显示详细内容
#--no-defaults :默认字符集(不加会报UTF-8的错误)
PS:可以将解码后的文件导出为txt格式,方便查阅
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000002
二进制日志中需要关注的部分
1、at :开始的位置点
2、end log pos:结束的位置3、时间戳: 210712 11:50:304、SQL语句
2.进行完全备份(增量备份时基于完全备份的,所以我们直接完全备份数据库)
mysqldump -uroot -p school info >/opt/kgc_infol_$(date +%F).sql
mysqldump -uroot -p123123 school >/opt/school_all_$(date +%F).sql
3.可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000002)
mysqladmin -u root -p flush-logs
4.插入新数据,以模拟数据的增加或变更
PS:在第一次完全备份之后刷新二进制文件,在第二个二进制文件中记载着"增量备份的数据"
> create database ky13;
> use kyl3;create table test1 (id int (4),name varchar(4));
> insert into testl values(1,'one');
> insert into test1 values(2,'two');
5.再次生成新的二进制日志文件: mysql-bin.000003
mysqladmin -u root -p flush-logs
MySQL增量恢复
1、一般恢复
1、模拟丢失更改的数据的恢复步骤(直接使用恢复即可)
mysqldump -uroot -p123123 ky13 test1 > /opt/ky13_test13.sql #备份ky11库中test1表
drop table ky13.testl; #删除ky13库中test1表
mysql -uroot -p ky13 < info-2020-08-31.sql #恢复test1表
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 #查看日志文件
2、模拟丢失所有数据的恢复
> drop database ky13;
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
2、断点恢复quit
;
> insert into testl values (4,'f');
> insert into test1 values (5,'t');
确认位置点,刷新二进制日志并删除test1表
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000003
#刷新日志
mysqladmin -uroot -p4455 flush-logs
> drop table ky13.test1;
#仅恢复到操作ID为"623"之前的数据,即不恢复"user4"的数据
mysglbinlog --no-defaults --stop-position='1793' /opt/mysql-bin.000002 | mysql -uroot -P
960停止
1066开始nysqk
#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -P
mysqlbinlog --no-defaults --start-position='400' --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p #恢复从位置为400开始到位置为623为止
3、基于时间点恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日小时:分钟:秒'--stop-datetime='年-月-日小时:分钟:秒'二进制日志| mysql -u 用户名 -p密码
#仅恢复到16:41:24之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24'/opt/mysql-bin.000002 | mysql -uroot -p
#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-datetime='2020-11-22 16:41:24'/opt/mysql-bin.000002 | mysql -uroot -p
如果恢复某条sQL语之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条sQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start

操作要点
刷新二进制时,之前操作的文件都在上一个二进制日志文件里,
在实验前要刷新下,最好建立新的表,因为你不知道之前的表操作记录在哪个二进制文件里
创建好后表添加数据后,再次刷新,然后再做删除或修改,最后回滚后测试测试数据恢复
MySQL备份与恢复
1042

被折叠的 条评论
为什么被折叠?



