YangSunshine 2019-06-27
上篇文章介绍了一下MySQL的数据备份与恢复第二部分内容,即使用Xtrabackup完成MySQL数据库的物理备份与恢复,但是Xtrabackup主要是针对于InnoDB表引擎格式的备份,其他存储引擎并不适用。本篇文章将介绍使用LVM完成MySQL的数据备份和恢复!
一、LVM简单介绍
1、定义
LVM,全称为:Logical Volume Manager。意思是逻辑卷管理,是Linux环境下对磁盘分区进行管理的一种机制。早期的磁盘分区在分完区之后无法改变分区的大小,但是通常使用磁盘之前又不能对需要的磁盘容量进行准确评估,可能会造成磁盘不够用或者磁盘浪费等问题,而LVM可以动态创建和修改磁盘大小,可以有效地解决这个问题。
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私房菜》,里面有详细介绍。
3、各部分组成结构
二、创建逻辑卷并备份
1、备份前提
(1)待备份的MySQL数据必须在在逻辑卷上
(2)如果是InnoDB存储引擎表,为了保证备份之后的数据一致性,需要事务日志和数据都在同一个卷上,因为同一时刻只能对一个逻辑卷做快照
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)登录之后检查数据是否还原
至此,基于LVM的MySQL数据备份与恢复介绍完毕,下片文章开始将结合MySQL的二进制日志介绍数据的全量和增量恢复,欢迎评论转发!