vlambda博客
学习文章列表

聊聊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、各部分组成结构

聊聊LVM如何备份MySQL数据

2、创建逻辑卷并备份

2.1、备份前提

(1)待备份的MySQL数据必须在在逻辑卷上

(2)如果是InnoDB存储引擎表,为了保证备份之后的数据一致性,需要事务日志和数据都在同一个卷上,因为同一时刻只能对一个逻辑卷做快照

2.2、备份过程

(1)首先需要准备一块磁盘或者一个分区,此处演示使用VMware新加磁盘的办法,首先关闭Vmware,具体操作过程如下:聊聊LVM如何备份MySQL数据

聊聊LVM如何备份MySQL数据
添加硬件向导

聊聊LVM如何备份MySQL数据

选择磁盘

聊聊LVM如何备份MySQL数据

指定磁盘容量大小
聊聊LVM如何备份MySQL数据
虚拟机设置

    到此,磁盘添加完毕,启动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实例之后检查数据是否还原。

近期精彩回顾:

   


    

常驻内容:

源码搭建:

关注菜鸟封神记,定期分享技术干货!

点赞在看是最大的支持,感谢↓↓↓