lvm-snapshot(工具备份)

优点:

  • 几乎是热备(穿件快照前把表上锁,创建完成后立即释放)
  • 支持所有引擎
  • 备份速度快
  • 无需使用昂贵的商业软件(它是操作系统级别的)

缺点:

  • 可能需要跨部门协作(使用操作系统级别的命令,DBA一般没有权限)
  • 无法预计服务停止时间
  • 数据如果分布在多个卷上比较麻烦(针对存储级别而言)

逻辑卷快照的原理

为什么选择lvm快照备份?

原因:因为锁表的时间不一致,在锁表的瞬间是不能写入的,对其进行快照备份,备份完成后立即解锁,然后服务可以正常使用(写入等操作)比如数据量大的时候,做快照一下子就拍了,然后立即解锁,就不影响写入等操作。如果用mysqldump备份,那么数据量大的时候,锁表时间长,就会影响效率

创建LVM

​​

图片来源:Linux下的磁盘管理之LVM详解及lvm的常用磁盘操作命令_yg@hunter的博客-CSDN博客_lvm命令

操作流程

1.flush table with read local;//全局加锁
2.create snapshot;//快照
3.show master status; show slave status;[可选]
4.unlock tables;//释放锁
5.Copy files from the snapshot//从快照卷中复制数据cp tar[40 m]
6.Unmount the snapshot//挂载快照卷
7.Remove snapshot//卸载并删除快照卷

正常安装MySQL

1.安装系统
2.准备LVM
3.安装mysql,默认datadir=/var/lib/mysql

MySQL运行一段时间,数据并没有存储LVM:将现在的数据迁移到LVM


1.准备lvm及文件系统//先添加一块磁盘
[root@localhost centos]# vgcreate datavg /dev/sdb


[root@localhost centos]# lvcreate -L 2G -n mysql datavg //创建2G的VG

[root@localhost centos]# mkfs.xfs /dev/datavg/mysql //格式化磁盘分区

2.将数据迁移到LVM
[root@localhost centos]# systemctl stop mysqld //停止MySQL服务
[root@localhost centos]# mount /dev/datavg/mysql /mnt/ //将快照挂载到临时目录
[root@localhost centos]# cp -a /var/lib/mysql/* /mnt/ //拷贝MySQL数据到挂载的临时目录

[root@localhost centos]# umount /mnt/ //卸载快照
[root@localhost centos]# vim /etc/fstab //更改配置文件设置自动挂载
/dev/datavg/mysql /var/lib/mysql xfs defaults 0 0

[root@localhost centos]# mount -a //自动挂载/etc/fstab文件没有挂载的设备,不管已挂载过的设备
[root@localhost centos]# chown -R mysql.mysql /var/lib/mysql /递归更改/var/lib/mysql主组和属组
[root@localhost centos]# systemctl restart mysqld //重启MySQL

LVM快照备份流程

1.加全局锁
mysql>flush table with read local;

2.创建快照
lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;
mysql -p'20011004*LmL' -e ‘show master status’> /backup/`data +%F`_position.txt

1-3必须同一会话中完成

3.释放锁
create snapshot;

[root@localhost centos]# echo "FLUSH TABLES WITH READ LOCK;SYSTEM lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;"
| mysql -p'数据库密码'

[root@localhost centos]# echo "FLUSH TABLES WITH READ LOCK;SYSTEM lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;
UNLOCK TABLES;" | mysql -p'数据库密码'

从快照中恢复


[root@localhost centos]# mount -o ro,nouuid /dev/datavg/mysql-snap /mnt/ //xfs -o ro,nouuid
[root@localhost centos]# mkdir -p /backup
[root@localhost centos]# tar -czf /backup/mysql_`date +%F`.tar.gz /var/lib/mysql/*

移除快照


[root@localhost centos]# umount /dev/datavg/mysql-snap
[root@localhost centos]# lvremove /dev/datavg/mysql-snap -f

脚本制作快照

#!/bin/bash
#LVM backmysql.....
back_dir=/backup/mysql_`date +%F`

[ -d $back_dir ] | mkdir -p $back_dir

echo "FLUSH TABLES WITH READ LOCK;SYSTEM lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;" | mysql -p'20011004*LmL'

mount -o ro,nouuid /dev/datavg/mysql-snap /mnt/

rsync -a /mnt/ $back_dir

if [ $? -eq 0 ];then
umount /mnt/
lvremove -f /dev/datavg/mysql-snap
fi

Cron

crontab -e

0 2 * * * /opt/mysql_back.sh