备份的原因:数据可能会丢失和被删除,这会造成巨大的损失,所以要对数据进行备份。
备份的目标:1、数据的一致性,2、服务的可用性。
备份技术:
1、物理备份/冷备份
直接复制数据库文件,适用于大型就业环境,不受存储引擎的限制,但不能恢复到不同的MYSQL版本。
tar cp scp
拷贝数据,优点快,缺点服务停止
2、逻辑备份/热备份
备份的是建表、建库、插入等操作所执行的SQL语句(DDL、DML、DCL)适用于中小型数据库。
mysqldump、mysqldumper
效率相对较低
备份种类:
1、完全备份
将所有数据一次全部备份下来。
2、增量备份
数据进行了一次完整备份后,在备份的时候只备份完整备份之后增加的部分。
连续恢复
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
3、差异备份
位于完整备份和增量备份之间的。
跳跃恢复
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。
一、使用percona-xtrabackup软件进行备份
1、简介
它是开源免费的支持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 -y install yum-utils
查看mysql可用的版本
yum repolist all | grep mysql
禁用80版本
yum-config-manager --disable mysql80-community
启动57版本
yum-config-manager --enable mysql57-community
yum -y install mysql-community-libs-compat
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
② YUM安装percona-xtrabackup
yum -y install percona-xtrabackup-24.x86_64
安装percona
本地RPM:
将percona-xtrabackup24.rpm.zip下载到本地,然后上传到系统中进行安装。
③ 查询安装结果
rpm -ql percona-xtrabackup-24
4、完全备份流程
innobackupex --user=root --password='weinihao@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/2020-09-01_00-02-37/
查看二进制日志位置
ls /xtrabackup/full/2020-09-01_00-02-37/xtrabackup_binlog_iofo
5、完全恢复流程
因为我们实验的时候数据库是好的,我们想要进行完全恢复数据,就要模拟数据被损坏。
systemctl stop mysqld //停止数据库
rm -rf /var/lib/mysql/*
rm -rf /var/log/mysql.log
//清理环境(模拟数据库被损坏)
innobackupex --apply-log /xtrabackup/full/2020-09-01_00-02-37/
//指定备份点 //生成回滚日志
innobackupex --copy-back //xtrabackup/full/2020-09-01_00-02-37/
//恢复文件
验证登录
ls /var/lib/mysaql
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p'QianFeng@123'
6、增量备份流程
准备工作:
create database testdb;
use testdb;
create table test(id int);
insert into test values (1);
select * from test;
mysql> select * from test;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
完整备份,周一
rm -rf /xtrabackup/*
date 090100000 //时间建议靠后设计
innobackupex --user=root --password='weinihao@123' /xtarbackup
ll /xtarbackup/mysql>2020-09-01_00-02-37
增量备份,周二
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='weinihao@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2020-09-01_00-02-37
//basedir基于周一的备份,会生成一个今天的
增量备份,周三
date 09030000
ls /xtarbackup/
mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test values (3)'
innobackupex --user=root --password='weinihao@123' --incremental /xtrabackup/ --incremental-basedir=/xtarbackup/2020-09-02_00-07-40 //basedir会基于周二的备份生成一个今天的
ls /xtrabackup/
7、增量恢复流程
停止数据库
systemctl stop mysqld
清理环境
rm -rf /var/lib/mysql/*
周一
innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-02-37 //回滚合并
周二
innobackupex --apply-log --redo-only /xtrabackup/2020-09-01_00-02-37 --incremental-dir=/xtrabackup/2020-09-02_00-07-40
恢复
innobackuex --copy-back /xtrabackup/2020-09-01_00-02-37 //将2中的数据合并到1中,一起恢复回来。所以现在1中有1和2的数据。
chown -R mysql.mysql /var/lib/mysql //授权
systemctl start mysqld
二、使用mysqldump+binlog备份数据
优势
1 自动记录日志position位置。
(show master status\G;)
2 可用性,一致性
锁表机制。
语法
mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
ps:参数说明
库的范围
-A, --all-databases 所有库
school 数据库名
school stu_info t1 是指school数据库的表stu_info、t1
-B, --databases bbs test mysql 多个数据库
--single-transaction #InnoDB 一致性 服务可用性
--master-data=1|2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释
高级选项
--opt #同时启动各种高级选项
-R, --routines #备份存储过程和存储函数
-F, --flush-logs #备份之前刷新日志,截断日志。备份之后新binlog。
--triggers #备份触发器
帮助
mysqldump --help
1、mysqldump进行备份
准备两套密码:密码1:weinihao123,密码2:weinihao1234(备用)
① 准备库
ps:做实验之前清理掉之前test库,防止混淆。
mysql -p'QianFeng@123'
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);
select * from testdb1.t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
② 执行备份
mkdir /backup
[root@localhost ~]#mysqldump -p'weinihao@123' \
--all-databases --single-transaction \
--master-data=2 \
--flush-logs \
> /backup/`date+%F-%H`-mysql-all.sql
vim /backup/2020-09-03-12-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库
切断二进制日志(重启数据库)
mysql> select * from testdb2.t2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
在testdb2.t2 中插入数据4;
删testdb3库
在testdb2.t2 中插入数据5;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| testdb1 |
| testdb2 |
+--------------------+
12 rows in set (0.00 sec)
mysql>
2、恢复备份
cp /var/lib/mysql/*bin* ~ //备份二进制文件
模拟损坏环境:
systemctl stop mysqld
rm -rf /var/lib/mysql/* //清理环境
systemctl strat mysqld //启动数据库 (相当于一个新的数据库)
grep 'password' /var/log/mysql.log //查找密码 ,
mysqladmin -uroot -p'%?i=Yx)xa5p1' password 'weinihao@1234' //使用备份密码
mysql -p'weinihao@1234' < /backup//backup/2020-09-03-12-mysql-all.sql //mysql恢复数据
mysql -p'QianFeng@1234' -e 'flush privileges'
//请使用备份时密码
vim /backup/2016-11-25-14-mysql-all.sql //观察二进制的截取记录
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000002', MASTER_LOG_POS=154;
mysqlbinlog localhost-bin.0000002 localhost-bin.0000003 --start-position=154 |mysql -p'weinihao@123' //二进制日志恢复
//后续有多少个日志要跟多少个日志名字。