聊聊LVM如何备份MySQL数据
MySQL常用的备份方案中,常用的是通过mysqldump命令进行逻辑备份,或者通过Xtrabackup进行物理备份,这两种方式比较常见。本篇文章介绍另外一种通用的数据备份方式,这种备份方式也可以用来快速备份MySQL数据,即:通过LVM来完成的数据备份。这种备份方式是在运维过程中比较通用的数据备份方式,不仅可以用来备份MySQL数据,还可以用来定期备份网站或者日志等数据。
1、LVM简单介绍
1.1、定义
LVM,全称为:Logical Volume Manager。意思是逻辑卷管理,是Linux环境下对磁盘分区进行管理的一种机制。早期的磁盘分区在分完区之后无法改变分区的大小,但是通常使用磁盘之前又不能对需要的磁盘容量进行准确评估,可能会造成磁盘不够用或者磁盘浪费等问题,而LVM可以动态创建和修改磁盘大小,可以有效地解决这个问题。
1.2、重要概念
(1)PV(Physical Volume):表示物理卷,在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区;
(2)VG(Volume Group):表示卷组,建立在物理卷上,一个卷组中至少要包括一个物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组;
(3)LV(Logical Volume):逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间;
(4)PE(Physical Extent):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的PV加入到VG后,PE的大小自动更改为VG中定义的PE大小;
(5)LE(Logical Extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小;
更多内容可以参考工具书《鸟哥的Linux私房菜》,里面有详细介绍。
1.3、各部分组成结构
2、创建逻辑卷并备份
2.1、备份前提
(1)待备份的MySQL数据必须在在逻辑卷上
(2)如果是InnoDB存储引擎表,为了保证备份之后的数据一致性,需要事务日志和数据都在同一个卷上,因为同一时刻只能对一个逻辑卷做快照
2.2、备份过程
(1)首先需要准备一块磁盘或者一个分区,此处演示使用VMware新加磁盘的办法,首先关闭Vmware,具体操作过程如下:
到此,磁盘添加完毕,启动Vmware虚拟机。
(2)使用如下命令查看新添加的磁盘
[root@WB-BLOG ~]# fdisk -l
(3)使用刚才添加的磁盘来创建物理卷
[root@WB-BLOG ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
#查看创建的物理卷
[root@WB-BLOG ~]# pvdisplay
"/dev/sdb" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
...
(4)根据物理卷来创建卷组
[root@WB-BLOG ~]# vgcreate mygroup /dev/sdb
Volume group "mygroup" successfully created
参数解释:
mygroup:表示卷组的名称
/dev/sdb:表示使用哪个物理卷来创建卷组
#查看创建的卷组
[root@WB-BLOG ~]# vgdisplay
--- Volume group ---
VG Name mygroup
...
(5)根据上一步创建的卷组来创建逻辑卷
[root@WB-BLOG ~]# lvcreate -n mysqldata --size 3G mygroup
Logical volume "mysqldata" created.
参数解释:
-n:表示要创建的逻辑卷的名称
--size:表示要创建的逻辑卷的大小
mygroup:表示使用哪个卷组来创建逻辑卷
#查看创建的逻辑卷
[root@WB-BLOG ~]# lvdisplay
--- Logical volume ---
LV Path /dev/mygroup/mysqldata
LV Name mysqldata
VG Name mygroup
LV UUID qHJyK4-eMUF-gQku-ojkC-j7Tr-hayA-UFsq5J
(6)格式化刚才创建的逻辑卷,创建完逻辑卷之后,逻辑卷的默认磁盘路径为/dev/卷组名称/逻辑卷名称,通过lvdisplay命令输出结果中的"LV Path"也可以看到
[root@WB-BLOG ~]# mkfs.ext4 /dev/mygroup/mysqldata
(7)挂载逻辑卷到一个目录上
#使用blkid查看设备的UUID编号
[root@WB-BLOG ~]# blkid /dev/mygroup/mysqldata
/dev/mygroup/mysqldata: UUID="46483472-1c46-4af5-8844-d39fd653d57d" TYPE="ext4"
#上述输出的UUID为设备的UUID号,可以使用该ID编号将这个逻辑卷挂载到某个目录上
[root@WB-BLOG ~]# mkdir -pv /mnt/
[root@WB-BLOG ~]# vim /etc/fstab
#在末尾加入如下一行,表示将UUID为4648...的逻辑卷设备挂载到/mnt目录,然后保存退出
UUID="46483472-1c46-4af5-8844-d39fd653d57d" /mnt ext4 defaults 0 0
#让操作系统读取fstab文件内容,并从新执行挂载
[root@WB-BLOG ~]# mount -a
#查看逻辑卷是否挂载成功,看到如下一行表示挂载成功
[root@WB-BLOG ~]# df -h
/dev/mapper/mygroup-mysqldata 2.9G 4.5M 2.8G 1% /mnt
(8)在/mnt目录下创建MySQL的数据目录data
[root@WB-BLOG ~]# mkdir -pv /mnt/mydata/data/
(9)修改MySQL配置文件和启动脚本中的datadir目录和binlog日志路径到data目录下
[root@WB-BLOG ~]# vim /etc/my.cnf
#修改如下内容
datadir = /mnt/mydata/data
log_bin = /mnt/mydata/data/mysql-bin
binlog_format = mixed
log_bin_index = /mnt/mydata/data/mysql-bin-index
...
[root@WB-BLOG ~]# vim /etc/init.d/mysqld
#修改如下内容
datadir=/mnt/mydata/data
...
(10)授权,并重新初始化MySQL数据库到/mnt/mydata/data目录下
[root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/
[root@WB-BLOG ~]# cd /usr/local/mysql-5.6.39/scripts/
[root@WB-BLOG scripts]# ./mysql_install_db --user=mysql --group=mysql --datadir=/mnt/mydata/data/ --basedir=/usr/local/mysql-5.6.39
(11)启动数据库,查看是否正常
[root@WB-BLOG scripts]# service mysqld start
至此,MySQL的数据目录已经在LVM逻辑卷上。
(12)假如实例已经使用了一段时间,新的数据已经在LVM逻辑卷中了,现在需要备份。则可以通过创建逻辑卷快照完成MySQL的数据备份
[root@WB-BLOG scripts]# lvcreate --snapshot /dev/mygroup/mysqldata -n data-snap --size 1G --permission r
Logical volume "data-snap" created.
#以上命令表示使用/dev/mygroup/mysqldata逻辑卷创建了一个名称为data-snap大小为1G的只读快照
参数解释:
--snapshot:表示创建逻辑卷快照
-n:指定快照名称
--size:指定快照的大小
--permission:指定快照对使用者的操作权限,上述权限为只读
#查看是否备份成功,需要将这个快照卷挂载到某个目录上查看
[root@WB-BLOG scripts]# mount /dev/mygroup/mysqldata /tmp/
[root@WB-BLOG scripts]# ls /tmp/mydata/data/
(13)备份完成之后,可以将备份的数据打包压缩,然后移除逻辑卷快照
#打包数据
[root@WB-BLOG scripts]# tar zcvf mysql_data_`date +%F`.tar.gz /tmp/mydata/data/
#移除逻辑卷快照,可以使用lvdisplay命令查看到刚才创建的逻辑卷快照的名称
[root@WB-BLOG scripts]# lvremove /dev/mygroup/data-snap
Do you really want to remove active logical volume data-snap? [y/n]: y
Logical volume "data-snap" successfully removed
(14)数据恢复,使用刚才打包的备份文件完成数据的恢复
#模拟数据丢失(删库!注意千万不要正式环境尝试...)
[root@WB-BLOG scripts]# rm -rf /mnt/mydata/data/*
#停止mysqld进程
[root@WB-BLOG scripts]# killall mysqld
[root@WB-BLOG scripts]# tar xf mysql_data_2018-05-30.tar.gz
#移动数据并授权
[root@WB-BLOG scripts]# mv tmp/mydata/data/* /mnt/mydata/data/
[root@WB-BLOG scripts]# chown -R mysql:mysql /mnt/mydata/data/
#启动数据库
[root@WB-BLOG scripts]# service mysqld start
(15)登录MySQL实例之后检查数据是否还原。
近期精彩回顾:
常驻内容:
源码搭建:
关注菜鸟封神记,定期分享技术干货!
点赞和在看是最大的支持,感谢↓↓↓