LVM 快照备份流程(差异):
首先进行一次物理完全备份
[root@mysql-21 /test]# ./full-backup.sh
对/data/mysql的完全备份开始…
锁定表…
解锁表…
备份完成时1秒
LVM快照: 锁表时间接近热备
- 加全局读锁
mysql> flush tables with read lock;
2.创建快照,刷新二进制日志
3. 释放锁
4. 挂载 快照设备 ,并从快照设备中,对数据库文件进行打包与 压缩
5、卸载快照设备
6、 移除快照设备
当前数据为2074
产生了一份新的 二进制日志。
此时,手动插入 几条数据,修改几条数据 ======》 体现最新的 二进制日志中。!
插入20条数据
模拟崩溃:
停止服务,删除 数据库所有文件
[root@mysql-21 /test]# /usr/local/mysql57/support-files/mysql.server stop
[root@mysql-21 /test]# rm -rf /data/mysql
( 提醒:想清楚自己的二进制日志在哪?? )
要求,恢复所有数据,包括 刚才 新增 和 修改了的 数据。
我的二进制文件放在
[root@mysql-21 /test]# cd /bin-log/mysql-bin. 二进制文件
mysql-bin.000001 mysql-bin.000004 mysql-bin.000007 mysql-bin.index
mysql-bin.000002 mysql-bin.000005 mysql-bin.000008
mysql-bin.000003 mysql-bin.000006 mysql-bin.000009
查看最后一次备份后二进制
[root@mysql-21 ~]# vim /root/mysql-bak.log
===[完全备份]2019年 04月 16日 星期二 21:15:09 CST==========
/bin-log/mysql-bin.000008
[root@mysql-21 /backup]# ls
mysql2019-04-16-21-42-18-full.tar.gz #完全备份文件
mysql-2019-04-16-21-44-09.tar.gz #l执行脚本后的lvm差异备份文件
恢复流程:
1、恢复最近的一次 完全备份, mysql2019-04-16-21-42-18-full.tar.gz
在/data 下解压。
[root@mysql-21 /data]# tar -xf mysql2019-04-16-21-42-18-full.tar.gz
2、将最近的一份二进制日志 进行导出
mysqlbinlog /data/mysql-binlog/mysql.000025 > /tmp/a.sql
3、启动mysql服务(产生一份新的二进制日志 ),登录mysql
[root@mysql-21 /test]# /usr/local/mysql57/support-files/mysql.server start
[root@mysql-21 ~]# mysql
### 此时数据库没有完全恢复完成,此时应该还是禁止 数据 写入到数据库
### 临时 阻断 3306 的连接。
iptables -t filter -A INPUT -p tcp --dport 3306 ! -s 192.168.217.21 -j REJECT
4、设置 临时 停止记录 二进制 日志。
mysql> set session sql_log_bin=0;
5、将二进制文件导入数据库中
mysql> source /tmp/a.sql;
6、 重新开启二进制日志功能
mysql> set session sql_log_bin=1;
至此,恢复完成! 用 select 语句 进行 查询验证,看数据是否恢复 。
mysql> select * from class.students;
数据全部找回,恭喜你,你又上了一层楼。
========================================
LVM + 二进制日志 实现 差异备份 + Cron: =========================
二进制日志 与 数据库 分开存放。 数据库 /mysql 二进制日志 /data/mysql-binlog/
完全备份脚本(每周日 ) :=========================
[root@mysql-21 /test]# cat mysql-lvm.sh
#!/bin/bash
#需求:lvm完全备份
a_log="/root/mysql-bak.log"
a_dir=/backup
data_dir=/data/mysql
data_name=echo echo $data_dir | awk -F "/" '{print $NF}'
tmp_dir="/tmp-mysql"
echo “=[完全备份]date
===================”>> $a_log
tail -1 /bin-log/mysql-bin.index >> $a_log
echo “对$data_dir的完全备份开始…”
time1=date +%s
cp /etc/my.cnf $a_dir/my-date +%F-%H-%M-%S
.cnf
mkdir -p
t
m
p
d
i
r
m
y
s
q
l
−
u
r
o
o
t
<
<
E
O
F
s
y
s
t
e
m
e
c
h
o
"
锁
定
表
.
.
.
"
f
l
u
s
h
t
a
b
l
e
w
i
t
h
r
e
a
d
l
o
c
k
;
s
y
s
t
e
m
l
v
c
r
e
a
t
e
−
L
500
M
−
s
−
n
l
v
−
m
y
s
q
l
−
s
n
a
p
/
d
e
v
/
m
y
v
g
/
m
y
l
v
>
/
d
e
v
/
n
u
l
l
2
>
>
tmp_dir mysql -uroot << EOF system echo "锁定表..." flush table with read lock; system lvcreate -L 500M -s -n lv-mysql-snap /dev/myvg/mylv > /dev/null 2>>
tmpdirmysql−uroot<<EOFsystemecho"锁定表..."flushtablewithreadlock;systemlvcreate−L500M−s−nlv−mysql−snap/dev/myvg/mylv>/dev/null2>>a_log
unlock table;
system echo “解锁表…”
EOF
time2=date +%s
mount -o ro /dev/myvg/lv-mysql-snap $tmp_dir
cd / && tar -zcf
a
d
i
r
/
a_dir/
adir/data_name-date +%F-%H-%M-%S
.tar.gz tmp-mysql 2>> $a_log
cd /
umount $tmp_dir && lvremove -f /dev/myvg/lv-mysql-snap > /dev/null 2>> $a_log && echo “快照已经成功移除”
time3=date +%s
echo “备份完成用时expr $time3 - $time1
秒,锁表时间expr $time2 - $time1
秒”
###########实现备份的回滚功能#################
num=5
count=ls -lt $a_dir | grep "mysql" | wc -l
if [ $count -gt $num ]
then
rm -rf ls -lt $a_dir | grep "mysql" |tail -1| awk '{print $NF}'
fi
count1=ls -lt $a_dir| grep "\<my\>".*cnf| wc -l
if [ $count1 -gt $num ]
then
rm -rf ls -lt $a_dir| grep "\<my\>".*cnf| tail -1|awk '{print $NF}'
fi
差异备份脚本(每一天 ) :=============================
[root@mysql-21 /test]# cat mysql-diff.sh
#!/bin/bash
mkdir -p /log-bak
log_name=tail -1 /bin-log/mysql-bin.index
mysql -uroot <<EOF
flush table with read lock;
system cp
l
o
g
n
a
m
e
/
l
o
g
−
b
a
k
/
log_name /log-bak/
logname/log−bak/log_name-date +%F-%H-%M-%S
.bak
unlock table;
EOF
注意:必须保证lvm挂载到/data 目录下才能执行完全备份脚本,此时才能成功备份,否侧备份失败。