目录
一 关于备份
1.备份原因
丢失、删除等原因
2.备份目标
数据的一致性
服务的可用性
3备份技术
==物理备份 /冷备份==
直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
tar, cp, scp(跨设备拷贝文件)
拷贝数据, 优点快,缺点服务停止。
==逻辑备份 /热备份==
备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
mysqldump , mydumper
缺点:效率相对较低
4备份种类
==完全备份==
每次备份都是从第一次备份起点开始的
==增量备份==
连续回复 每次备份是从上次备份结束时,到这次备份之间有变化的文件进行备份
备份体积小,备份速度快。恢复的时候需按备份时间顺序,逐个备份版本进行恢复,时间长。
==差异备份==
第二次及以后的备份,在第一次备份结束后开始
跳跃恢复 ,恢复时仅需恢复第一个完整版本和最后一次的差异版本(包含所有的差异)
占用空间介于前两种之间,恢复速度介于两种之间
二 实战案例1:(增量备份)
percona-xtrabackup
1.简介
logo:(percona)
它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本--percona Server。并围绕
percona Server还发布了一系列的mysql工具。
2.获得软件包
==官方网站==
==选择版本==
3.安装
==安装YUM仓库==
安装percona需要的mysql包
mysql 官方源:
yum install -y https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
yum工具:
yum install -y yum-utils
查看MySQL可用版本:
yum repolist all | grep mysql
禁用80
yum-config-manager --disable mysql80-community
启用57
yum-config-manager --enable mysql57-community
下载相关服务软件
yum install mysql-community-libs-compat -y
下载yum源
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
==YUM安装percona-xtrabackup==
yum -y install percona-xtrabackup-24.x86_64
由于是国外网络,速度特别慢,本次试验用本地安装
本地RPM安装percona-xtrabackup
percona-xtrabackup24.rpm.zip
步骤 mkdir bf.sql //创建文件夹存放项目压缩包)
cd bf.sql 进入到文件夹
rz //项目压缩包上传到文件夹
unzip percona-xtrabackup24.rpm.zip //解压此项目文件
yum -y instasll bf.sql/percona-xtrabackup24.rpm/* //把解压的软件都安装一下
==查询安装结果==
rpm -ql percona-xtrabackup-24 //查询软件安装版本eg:rpm -qa |grep mysql
4-1.完全备份流程
innobackupex --user=root --password='QianFeng@123' /xtrabackup/full
准备:数据库应青类型 选择要备份的用户 密码 和备份存放的路径目录
连接数据库,开始备份。
请注意备份结果是否完成
提示:xtrabackup: Transaction log of lsn (74182721) to (74182730) was copied.
171127 15:04:12 completed OK!
查看备份目录。数据库,配置文件,日志文件
ls /xtrabackup/full/
ls /xtrabackup/full/2017-08-01_00-00-02/
观看二进制日志位置
cat /xtrabackup/full/2017-08-01_00-00-18/xtrabackup_binlog_info //二进制日志
4-2完全恢复流程
停止数据库
systemctl stop mysqld
清理环境(模拟损坏。在公司不可尝试停止、删除)
rm -rf /var/lib/mysql/* //删除MySQL的文件
rm -rf /var/log/mysqld.log //删除MySQL的日志
生成回滚日志
指定(找到)备份点
innobackupex --apply-log /xtrabackup/full/2017-08-01_00-00-18/
提示:
恢复文件
从备份点复制回
innobackupex --copy-back /xtrabackup/full/2017-08-01_00-00-18/
提示:
==登录验证==
ls /var/lib/mysql //查看文件是否恢复
chowm -R mysql.mysql /var/lib/mysql //给mysql 文件授权
systemctl start mysqld //重启MySQL服务
mysql -uroot -p'QianFeng@123' //登录MySQL查看
5-1 增量备份流程
==准备工作==
使用指定的数据库
mysql> great database testdb; //创建库
mysql> use testsb;
mysql>create table test(id int);
mysql> insert into test values(1);
ymsql> select * from test;
==完整备份:周一==
# rm -fr /xtrabackup/* //清空之前备份
# date 09010000 //设置时间
# innobackupex --user=root --password='QianFeng@123' /xtrabackup //备份
# ll /xtrabackup/ //查看备份
2020-09-01_00-00-04
==增量备份:周二==
更新时间:# date 09020000
系统内为 数据库添加数据并查看
# mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test values (2)'
# mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'
增量备份
# innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup/
--incremental-basedir=/xtrabackup/2020-09-01_00-00-04备份--->备份 增量--->(参照物) basedir基于周一的备份,会生成一个今天的
# ls /xtrabackup/ //查看
==增量备份,周三 ==
date 090300 //更改时间
系统内 添加数据库 数据
#mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test values (3)'
# innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup/
--incremental-basedir=/xtrabackup/2017-09-02_00-00-26
备份 --> 增量备份---> basedir基于周2的备份,会生成一个今天的。
# ls /xtrabackup/ //查看
同步...
5-2增量恢复流程
==停止数据库==
# systemctl stop mysqld
== 清理环境== 模拟MySQL数据丢失
rm -rf /var/lib/mysql/*
==周一 == 准备 / 锁定周一备份
回滚合并:备份 应用日志 只读 周一备份
# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38
==周二 == 准备 文件
查看 or 增量
# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38
--incremental-dir=/xtrabackup/2020-09-02_00-23-24
==恢复到周二备份==
# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38
# chown -R mysql.mysql /var/lib/mysql
# systemctl start mysqld
数据恢复到第二次备份
==想恢复周三,怎么办==
# systemctl stop mysqld
# innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-04-38
--incremental-dir=/xtrabackup/2020-09-03_00-08-44 //读取(准备)周三备份恢复过到周二的数据了,恢复周三数据时会恢复周一、二、三的备份,与之前有重复
# rm -rf /var/lib/mysql/*读取了要恢复的备份(周一、二、三)。恢复语句只用周一备份
# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38
# chown -R mysql.mysql /var/lib/mysql 恢复的数据属于root授权给MySQL
# systemctl start mysqld 重启服务
# mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'
==请思考,如何一次性把数据,周一,周二,周三恢复出来?==
systemctl stop mysqld
rm -rf /var/lib/mysql/*
#innobackupex --apply-log --redo-only/xtrabackup/2020-09-01_00-04-38
#innobackupex --apply-log --redo-only/xtrabackup/2020-09-01_00-04-38
--incremental-dir=/xtrabackup/2020-09-02_00-23-24
# innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
--incremental-dir=/xtrabackup/2020-09-03_00-08-44# innobackupex --copy-back /xtrabackup/2020-09-01_00-04-38
#chown start mysqld
# mysql -uroot -p'QianFeng@1234560' -e 'select *from testdb.test'
==周四、周五、周六...==
三 实战案例2: (差异、跳跃)
mysqldump + binlog
1.优势
==自动记录日志position位置==
(show master status\G;)
==可用性,一致性==
锁表机制
2.语法
mysqdump -h 服务器 -u用户名 -p密码 数据库 > 备份 文件 . sql
参数说明:
==库的范围==
-A -all-databases 所有库
shool 数据库
shool stu_info t1 是指shool数据库的 表stu-info、t1
-B batabases bbs test mysql多个数据库
==.==
--single-transaction (单一处理)
# innoDB 一致性 服务可用性
--master-data=1 | 2
--master-data=1|2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释
==高级选项==
--opt #同时启动各级高级选项
-R --routines #备份储存过程和存储函数
-F --flush-logs #备份之前的刷新日志,截断日志。备份之后的新binlog
--triggers #备份触发器
帮助:mysqldump --help
3.实战备份
先准备两份密码:QianFeng@123456配置到当前数据库 QianFeng@123备用
==准备库1 testdb1.t1== 后续需要test库,清除之前同名库,备用
testdb1.t1
create database testdb1;
create table testdb1.t1(id int);
insert into testdb1.t1 values (1);
insert into testdb1.t1 values(2);
insert into testdb1.t1 values(3);
==执行备份==
mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
# mkdir /backup
# mysqldump -p'QianFeng@123' \
--all-databases --single-transaction \ #所有库一致
--master-data=2 \ #记录二进制日志位置和文件名追加文件中
--flush-logs \ #备份之前刷新日志(截断)备份之后新的
> /backup/`date +%F-%H-%M-%S`-mysql-all.sql //莫忘记重定向符号
==观察备份细节==
vim /backup/2016-11-25-14-mysql-all.sql
LOCK TABLES `user` WRITE;
观察各种锁机制,用来保证数据一致性
22 CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000004', MASTER_LOG_POS=154;
二进制日志截断位置。第22行
业务正常推进...
==备份后数据变更==
在testdb2.t2 中插入数据1,2,3;
创testdb3库
切断二进制日志(重启数据库)
在testdb2.t2 中插入数据4;
删testdb3库
在testdb2.t2 中插入数据5;
4恢复实战
==备份二进制日志文件== //可用日志恢复
# cp /var/lib/mysql/*bin* ~
==停止数据库==
# systemctl stop mysqld
==清理环境(模拟损坏)==
# rm -rf /var/lib/mysql/*
==启动数据库==
# systemctl start mysqld
# grep 'password' /var/log/mysqld.log
找密码,再改一下密码。请使用备用密码
Kyzw;u2dq<mh //查找到的旧密码
mysqladmin -uroot -p'Kyzw;u2dq<mh' password 'QianFeng@123' //更改密码
注意语法要求password后面有空格。
==mysql恢复数据 //到之前备份==
#mysql -p'QianFeng@1234' < /backup/2016-12-08-04-mysql-all.sql
# mysql -p'QianFeng@1234' -e 'flush privileges' //刷新数据库
请使用备份时密码 登陆并验证数据恢复结果。请思考恢复的数据库有几个?
1个
==二进制日志恢复==
观察二进制截取记录
# vim /backup/2020-09-03-01-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000010', MASTER_LOG_POS=154;
#mysqlbinlog localhost-bin.000002 localhost-bin.000003
--start-position=154 | mysql -p'QianFeng@123'
注意后续有多少日志,要跟多少日志名字。
==观察数据==
请思考数据是否恢复完整。
是完整的。恢复到损坏前的操作
==请思考误删除的问题==
如何保留testdb3库
[root@localhost ~]#mysqlbinlog localhost-bin.00004 ......005.....006...... > 1.txt
删除1.txt中不需要的at(比如test3库是误操作)
cat 1.txt | mysql -p'QianFeng@123' //再让数据库读一遍
课后题:是否可以通过mysqlbinlog start 和stop 命令解决。
==关于数据恢复时的多余日志==
方法一
原因:
每次还原数据库都会增加日志的体积。但这些都是还原操作。恢复数据库的日志占用了存储空间。
mysql> set sql_log_bin =0 //关闭二进制日志
mysql> source /backup/*.sql
观察
二进制日志并没有发生变化。
方法2
在备份文件中,加入关闭二进制日志。