LVM简介
逻辑卷管理器,是Linux 系统中用于管理磁盘储存的关键技术。
LVM 则打破了磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化这种限制,它允许用户将多个物理分区组合卷组。例如,系统中的多个物理磁盘/dev/sda,/dev/sdb可以把它们的部分空间整合起来,形成一个统一管理的卷组。
从卷组中,用户可以进一步划分逻辑卷。逻辑卷类似于虚拟磁盘分区,具有极高的灵活性。用户可以根据实际需求,动态地调整逻辑卷的大小,进行格式化等操作。如构建数据库的时候,可在卷组上创建逻辑卷来专门存储MYSQL数据库的数据文件,为数据库的高效运行提供高效运行提供有力的支持。
二、LVM 快照概念
LVM 快照是对现有逻辑卷(源逻辑卷)在某一特定时刻的 “瞬间影像”。它本质上是一个特殊的逻辑卷,初始时几乎不占用额外存储空间(仅记录少量元数据),并且与源逻辑卷共享数据块。
当源逻辑卷中的数据发生变化时,LVM 会将原始数据块的内容复制到快照区域(前提是这些数据块此前未被复制过)。通过这种机制,快照始终能够反映出创建它时源逻辑卷的数据状态。例如,对于一个持续运行的文件系统,在创建快照后,即便文件系统中的数据不断更新、删除或新增,快照中的数据依然保持创建时刻的状态,为数据备份和恢复提供了稳定的副本。
三、LVM 快照备份过程
(一)拍摄快照
使用 lvcreate
命令来创建快照。假设我们有一个名为 vg_mysql
的卷组,其中包含用于存储 MySQL 数据的逻辑卷 lv_mysql
,现在要创建一个名为 lv_mysql_snapshot
、大小为 1GB 的快照,执行以下命令:
lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql
参数解释:
-
-n
:用于指定快照的名称,这里为lv_mysql_snapshot
。 -
-L
:指定快照的大小,设置为 1GB。需注意,快照大小应根据源逻辑卷的数据变化频率和数据量合理估算,以确保备份过程中快照空间充足。 -
-s
:表示创建的是快照,其后紧跟源逻辑卷的路径/dev/vg_mysql/lv_mysql
。
(二)挂载快照
-
创建挂载点 首先,使用
mkdir
命令创建一个挂载点,例如/mnt/mysql_snapshot
:
mkdir -p /mnt/mysql_snapshot
-p
选项的作用是确保如果指定的目录不存在,会递归创建该目录及其上级目录;若目录已存在,则不报错。
-
挂载快照 然后,使用
mount
命令将快照挂载到创建的挂载点上:
mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot
此时,通过访问 /mnt/mysql_snapshot
目录,就可以读取到快照中的数据,为后续的备份操作做好准备。
(三)进行备份
挂载点 /mnt/mysql_snapshot
进行备份操作,可选用多种备份工具:
-
Rsync 备份
rsync
是一款强大的文件同步工具,具有高效、灵活的特点。例如,将快照中的数据备份到/backup/mysql_snapshot_$(date +%Y%m%d)
目录(其中$(date +%Y%m%d)
会根据当前日期生成目录名,方便区分不同日期的备份),执行以下命令:
rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/
参数解释:
-
-a
:以归档模式同步,保留文件的权限、所有者、组等属性,确保备份数据的完整性和一致性。 -
-v
:输出详细信息,在备份过程中可以实时查看同步进度和文件传输情况。 -
-z
:在传输过程中进行压缩,可有效减少数据传输量,提高传输效率,尤其适用于网络备份场景。
-
Tar 备份
tar
是常用的归档工具,用于将文件和目录打包成一个归档文件。例如,将挂载点的内容打包成一个压缩归档文件,执行以下命令:
tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot
参数解释:
-
c
:创建新的归档文件。 -
z
:使用gzip
进行压缩,以减小归档文件的大小,节省存储空间。 -
f
:指定归档文件的名称,这里为/backup/mysql_snapshot_$(date +%Y%m%d).tar.gz
。
(四)清理快照
备份完成后,为释放存储空间,需要及时清理快照:
-
卸载快照 使用
umount
命令卸载已挂载的快照:
umount /mnt/mysql_snapshot
-
删除快照 使用
lvremove
命令删除快照:
lvremove -f /dev/vg_mysql/lv_mysql_snapshot
-f
选项表示强制删除,即使逻辑卷正在使用也会删除。但需谨慎使用,以免误删重要数据。
四、LVM 快照备份的优点
(一)实现热备份
对于正在运行的服务,如 MySQL 数据库、Web 服务器等,LVM 快照备份允许在不停止服务的情况下进行备份操作。
(二)高效利用存储空间
快照初始占用的空间相对较小,它仅记录创建快照后数据的变化部分。
(三)数据一致性较好
由于快照能够精确记录创建瞬间的数据状态,只要在备份过程中快照空间足够,就可以保证备份数据的一致性。
LVM快照备份实验
实验环境
操作系统:CentOS 8 或其他使用 systemd
和 LVM
的 Linux 发行版。
MySQL 版本:MySQL 8.0
实验步骤
-
准备 LVM 卷
-
首先,确保你已经有一个存储 MySQL 数据的逻辑卷。如果没有,可以按照以下步骤创建一个:
# 检查磁盘信息 fdisk -l # 假设使用 /dev/sda 磁盘,创建物理卷 pvcreate /dev/sda # 创建卷组 vgcreate vg_mysql /dev/sda # 创建逻辑卷 lvcreate -n lv_mysql -L 4G vg_mysql # 格式化逻辑卷为 ext4 文件系统 mkfs.ext4 /dev/vg_mysql/lv_mysql # 创建挂载点 mkdir /var/lib/mysql # 挂载逻辑卷 mount /dev/vg_mysql/lv_mysql /var/lib/mysql # 确保开机自动挂载,添加到 /etc/fstab 文件 echo "/dev/vg_mysql/lv_mysql /var/lib/mysql ext4 defaults 0 0" >> /etc/fstab
-
安装和配置 MySQL (安装在了lvm卷中 )
-
安装 MySQL 并将数据存储在
/var/lib/mysql
中:
dnf install mysql-server -y systemctl start mysqld systemctl enable mysqld
-
创建测试数据
-
登录 MySQL 并创建一些测试数据:
mysql -u root -p
-
输入密码,然后在 MySQL 中执行以下 SQL 语句:
CREATE DATABASE testdb; USE testdb; CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100) ); INSERT INTO test_table (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com');
-
创建 LVM 快照
-
创建一个 LVM 快照,用于备份:
# 刷新表锁,创建快照,解锁表 mysql -u root -p -e "flush tables with read lock; system lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql; unlock tables;" # 创建挂载点 mkdir /mnt/mysql_snapshot # 挂载快照 mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot
-
备份数据
-
使用
rsync
或tar
备份数据:
# 使用 rsync 备份 rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/ # 或者使用 tar 备份 tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot
-
清理快照
-
完成备份后,清理快照:
# 卸载快照 umount /mnt/mysql_snapshot # 删除快照 lvremove -f /dev/vg_mysql/lv_mysql_snapshot
-
恢复数据(可选)
-
假设你需要恢复数据,你可以使用之前的备份文件:
# 假设使用 tar 备份,先解压 tar xzf /backup/mysql_snapshot_20250117.tar.gz -C /tmp/restore # 停止 MySQL 服务 systemctl stop mysqld # 清空当前数据目录 rm -rf /var/lib/mysql/* # 复制备份数据到数据目录 cp -r /tmp/restore/mnt/mysql_snapshot/* /var/lib/mysql/ # 更改权限 chown mysql:mysql -R /var/lib/mysql # 启动 MySQL 服务 systemctl start mysqld
show databases;
实验总结
-
步骤 1:创建 LVM 逻辑卷,将其格式化为 ext4 并挂载到
/var/lib/mysql
,用于存储 MySQL 数据。 -
步骤 2:安装和启动 MySQL 服务。
-
步骤 3:创建测试数据,验证 MySQL 数据库的正常使用。
-
步骤 4:使用
flush tables with read lock
锁定表,创建 LVM 快照,解锁表,然后挂载快照。 -
步骤 5:使用
rsync
或tar
备份快照中的数据。 -
步骤 6:卸载和删除快照,完成备份操作。
-
步骤 7:可选的恢复数据步骤,展示如何使用备份文件恢复数据。
注意事项
-
在创建快照时,确保快照的大小足够存储在创建快照期间发生变化的数据。
-
操作过程中,确保有足够的权限,通常需要使用
root
权限或sudo
。 -
备份的频率和时间应该根据实际情况确定,以确保数据的安全性和可恢复性。
通过上述实验,你可以实现一个简单的 LVM 快照备份 MySQL 数据库的过程,以保护数据免受意外数据丢失或损坏的影响。
以下是上述实验的脚本形式,你可以将其保存为 lvm_snapshot_backup.sh
并运行:
#!/bin/bash # 刷新表锁,创建快照,解锁表 mysql -u root -p -e "flush tables with read lock; system lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql; unlock tables;" # 创建挂载点 mkdir -p /mnt/mysql_snapshot # 挂载快照 mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot # 使用 rsync 备份 rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/ # 或者使用 tar 备份 # tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot # 卸载快照 umount /mnt/mysql_snapshot # 删除快照 lvremove -f /dev/vg_mysql/lv_mysql_snapshot
你可以使用以下方式运行该脚本:
chmod +x lvm_snapshot_backup.sh ./lvm_snapshot_backup.sh
这个实验可以帮助你了解如何使用 LVM 快照备份 MySQL 数据库,并且在需要时可以使用备份文件恢复数据,确保数据的安全和完整性。请根据实际情况调整用户名、密码、设备名称、备份目录等信息。