关于备份
备份原因
丢
删
备份目标
1. 数据的一致性
2. 服务的可用性
备份方式
备份
能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。
冗余
数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备模式、数据库集群。无法解决人为删除操作。
备份对象
databases
Binlog
my.cnf
备份经验
所有备份数据都应放在非数据库本地,而且建议有多份副本。
测试环境中做日常恢复演练,恢复较备份更为重要。
备份技术
物理备份
直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
tar,cp,scp
拷贝数据, 优点快,缺点服务停止。
逻辑备份
备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
mysqldump,mydumper
效率相对较低
备份种类
完全备份
增量备份
连续回复
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
差异备份
跳跃恢复
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。
实战案例
percona-xtrabackup 物理备份 + binlog
简介
logo
简介
它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本–percona Server。并围绕
percona Server还发布了一系列的mysql工具。
获得软件包
官方站点
https://www.percona.com/
选择版本
安装
wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
下载YUM源
yum -y install percona-release-0.1-3.noarch.rpm
安装yum源
yum -y install percona-xtrabackup-24.x86_64
安装percona
rpm -ql percona-xtrabackup-24
查询安装结果,安装文件
1-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
二进制日志位置
1-2 完全恢复流程
停止数据库
systemctl stop mysqld
清理环境(模拟损坏)
rm -rf /var/lib/mysql/*
rm -rf /var/log/mysqld.log
rm -rf /var/log/mysql-slow/slow.log
生成回滚日志
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
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p'QianFeng@123'
2-1 增量备份流程
准备工作
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 09010000
时间建议靠后设置。
innobackupex --user=root --password='QianFeng@123' /xtrabackup
ll /xtrabackup/
2017-09-01_00-00-04
请问数据库中的记录是多少?
1
增量备份:周二
date 09020000
更新时间
mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test values (2)'
innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup/
--incremental-basedir=/xtrabackup/2017-09-01_00-00-04
basedir基于周一的备份。
会生成一个今天的。
ls /xtrabackup/
2017-09-01_00-00-04
2017-09-02_00-00-58
增量备份:周三
date 09030000
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/
2017-09-01_00-00-04
2017-09-02_00-00-58
2017-09-03_00-00-36
周四。。周五。。周六
2-2 增量恢复流程
停止数据库
systemctl stop mysqld
清理环境
rm -rf /var/lib/mysql/*
周一
看一看备份目录
116M /xtrabackup/
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
再看看备份目录
124M /xtrabackup/
周二
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
--incremental-dir=/xtrabackup/2017-09-02_00-00-26
恢复
innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
登陆查询记录。请思考记录是第几天的。
想回复3,怎么办
systemctl stop mysqld
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
--incremental-dir=/xtrabackup/2017-09-03_00-00-27
# rm -rf /var/lib/mysql/*
innobackupex --copy-back /xtrabackup/2017-09-01_00-00-04
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'
请思考,如何直接从周一恢复到周三呢?
3-1 差异备份流程
rm -rf /xtrabackup/*
1.完整备份
周一
date 10010000
create database testdb;
use testdb;
create table test2(id int);
insert into test2 values(1);
select * from test2;
innobackupex --user=root --password='QianFeng@123' /xtrabackup
ll /xtrabackup/
du -sh /xtrabackup/
2017-10-01_00-00-54
2.差异备份
周二
date 10020000
mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(2)'
innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
完全备份目录(周一)
ll /xtrabackup/
du -sh /xtrabackup/
周三
date 10030000
mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(3)'
innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
完全备份目录(周一)
ll /xtrabackup/
du -sh /xtrabackup/
周四
date 10040000
mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(4)'
innobackupex --user=root --password='QianFeng@123'
--incremental /xtrabackup
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
完全备份目录(周一)
ll /xtrabackup/
du -sh /xtrabackup/
3-2 差异恢复流程
停止数据库
systemctl stop mysqld
清理环境
rm -rf /var/lib/mysql/*
重演回滚redo log(周一,某次差异)--> 恢复数据
innobackupex --apply-log --redo-only /xtrabackup/2017-10-01_00-01-12
innobackupex --apply-log --redo-only
/xtrabackup/2017-10-01_00-01-12
--incremental-dir=/xtrabackup/2017-10-04_00-00-29
innobackupex --copy-back /xtrabackup/2017-10-01_00-01-12
修改权限
chown -R mysql.mysql /var/lib/mysql/
启动mysqld
systemctl start mysqld
通过binlog增量恢复(略)
请思考能否直接还原到周三?
扩展
案例1
tar备份数据库(物理备份)
注
备份期间,服务不可用
备份的过程
1. 停止数据库
systemctl stop mysqld
mkdir /backup
准备目录,放置备份数据。
2. tar备份数据
tar -cf /backup/`date +%F`-mysql-all.tar /var/lib/mysql
注:备份文件应该复制其它服务器或存储上
3. 启动数据库
systemctl start mysqld
还原的过程
1. 停止数据库
systemctl stop mysqld
2. 清理环境(模拟损坏)
rm -rf /var/lib/mysql/*
3. 导入备份数据
tar -xf /backup/2016-12-07-mysql-all.tar -C /
注意权限chown -R mysql.mysql
4. 启动数据库
systemctl start mysqld
5. binlog恢复(略)
注意,从备份点,到崩溃点 之间的数据无法回复,通过bin回复。
案例2
Lvm快照实现物理备份 + binlog(物理备份))
lvm快照部分复习
1.创建新的逻辑卷lv1
pvcreate /dev/sdb
vgcreate vg1 /dev/sdb
lvcreate -L 500M -n lv1 /dev/vg1
mkdir /lv1
mkfs.ext4 /dev/vg1/lv1
mount /dev/vg1/lv1 /lv1/
df -hT
2.为lv1分区,创建测试文件。
dd if=/dev/zero of=/lv1/1.txt bs=1M count=400
df -hT
3.创建快照卷lv1-snap。
lvcreate -L 200M -s -n lv1-snap /dev/vg1/lv1
4。挂载快照卷。
mount /dev/vg1/lv1-snap /lv1-snap/
df -hT
ls /lv1-snap/ /lv1 -l
5.拷贝快照卷数据,并卸载快照卷。(略)
Lvm快照实现mysql物理备份 + binlog(物理备份))
注
数据一致,服务可用
MySQL数据lv 和 将要创建的snapshot 必须在同一VG,因此VG必须要有一定的剩于空间
特点
优点
几乎是热备 (创建快照前把表上锁,创建完后立即释放)
支持所有存储引擎
备份速度快
无需使用昂贵的商业软件(它是操作系统级别的)
缺点
可能需要跨部门协调(使用操作系统级别的命令,DBA一般没权限)
无法预计服务停止时间
数据如果分布在多个卷上比较麻烦(针对存储级别而言)
LVM备份MYSQL的前提(2选1)
全新安装mysql在LVM卷
1. 安装系统
2. 准备LVM,例如 /dev/vg_tianyun/lv-mysql,mount /var/lib/mysql
3. 安装MySQL,默认datadir=/var/lib/mysql
将已运行mysql迁移到LVM卷
请思考:将现在的数据迁移到LVM
1. 准备lvm及文件系统
lvcreate -n lv-mysql -L 2G vg1
创建新的LVM分区
mkfs.xfs /dev/vg1/lv-mysql
文件系统
2. 将数据迁移到LVM
systemctl stop mysqld
mount /dev/vg1/lv-mysql /mnt/
//临时挂载点
cp -a /var/lib/mysql/* /mnt
//将MySQL原数据镜像到临时挂载点
umount /mnt/
vim /etc/fstab
//加入fstab开机挂载
/dev/datavg/lv-mysql /var/lib/mysql xfs defaults 0 0
mount -a
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
创建库,表,记录用作恢复
LVM快照备份流程
1. 加全局读锁
mysql> flush tables with read lock;
1-3必须同一会话中完成
2. 创建快照
# lvcreate -L 500M -s -n lv-mysql-snap /dev/vg1/lv-mysql
mysql -p'QianFeng@123' -e 'show master status' > /backup/`date +%F`_position.txt
查询二进制日志的位置,下次使用binlog 作为还原数据(最近一次备份点到崩溃点之间的数据)的依据。
3. 释放锁
mysql> unlock tables;
4. 从快照中拷贝
mount -o nouuid /dev/vg1/lv-mysql-snap /mnt/
如果是xfs文件系统:请使用额外选项-o ro,nouuid
cd /mnt/
tar -cf /backup/`date +%F`-mysql-all.tar ./*
快照的使命结束。删除快照。
5. 移除快照
cd; umount /mnt/
lvremove -f /dev/vg1/lv-mysql-snap
shell脚本解决示例(略)
[root@localhost ~]# echo "FLUSH TABLES WITH READ LOCK;
SYSTEM lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql;
UNLOCK TABLES;" | mysql -p'QianFeng@123'
UNLOCK TABLES;可以不用输入
LVM快照恢复流程
1. 停止数据库,也可以找个新库。
systemctl stop mysqld
2. 清理环境
rm -rf /var/lib/mysql/*
3. 导入数据
tar -xf /backup/2016-12-07-mysql-all.tar -C /var/lib/mysql/
4. 修改权限
chown -R mysqlmysql /var/lib/mysql/
5. 启动数据库
systemctl start mysqld
6. binlog恢复(略)