LVM快照(snapshot)备份

转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv5ZmYL_ERp3Wprd1jVxG-333s6tCJn2LGqCAvFmJ6dXC

Logical VolumeManager (LVM)提供了对任意一个LogicalVolume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份。

在某一个状态下做备份的时候,可能有应用正在访问某一个文件或者数据库,这就是使得备份的时候文件处于一个状态,而备份完后,文件却处于另外一个状态,从而造成备份的非一致性,这种状态恢复数据库数据几乎不会成功。

状态的解决办法是将其分区挂载为只读,然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份,又不会影响服务器的可用性。

要提醒一点是,snapshot这种方法仅对LVM有效,对于非LVM文件系统无效。

snapshot的实现有多种方式(参考文章最后的连接),这里说说LVM中snapshot的“写时复制”(copy on write) 的实现方法。

当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta- data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on- write)。

在写操作写入块之前,CoW将原始数据移动到snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。

这样,通常的文件I/0流程有一个改变,那就是在文件系统和设备驱动之间增加了一个cow层,变成了下面这个样子:

file I/0 —>filesystem — >CoW –> block I /O

下面的图也许可以比较容易了解CoW的原理:

????

采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。当然,如果你的snapshot大小和原始卷一样大,甚至还要大,那它的寿命就是“与天齐寿”了。

snapshot其实除了备份以外,还有很多其他用途:

1)虚拟化

在使用 LVM2 时,快照可以不是只读的。这意味着,在创建快照之后,可以像常规块设备一样挂载和读写快照。

因为流行的虚拟化系统(比如 Xen、VMWare、Qemu 和 KVM)可以将块设备用作guest 映像,所以可以创建这些映像的完整拷贝,并根据需要使用它们,它们就像是内存占用量很低的虚拟机。这样做的好处是部署迅速(创建快照的时间常常不超过几秒)和节省空间(guest 共享原映像的大多数数据)。

设置的步骤如下:

1. 为原映像创建一个逻辑卷。

2. 使用这个 LV 作为磁盘映像安装 guest 虚拟机。

3. 暂停这个虚拟机。内存映像可以是一个常规文件,所有其他快照都放在里面。

4. 为原 LV 创建一个可读写的快照。

5. 使用快照卷作为磁盘映像生成一个新的虚拟机。如果需要的话,要修改网络/控制台设置。

6. 登录已经创建的虚拟机,修改网络设置/主机名。

完成这些步骤之后, 就可以让用户访问刚创建的虚拟机了。如果需要另一个虚拟机,那么只需重复步骤 4 到 6(所以不需要重新安装虚拟机)。还可以用一个脚本自动执行这些步骤。

在使用完虚拟机之后, 可以停止虚拟机并销毁快照。

2)数据回溯

在一个生产系统上要执行一些操作,需要慎之又慎,即便在模拟环境中做过很多次测试都没有问题,但是并不能保证在生产环境就一定成功,于是这个时候,我们把系统做一个snapshot,这样一旦新操作出现问题,立刻回溯到创建 snapshot的时间点,当然你也可以认为这是一个备份的扩展使用。

最后,我们举一些例子,加深对snapshot的理解。

a) 创建一个20M的snapshot,执行一些操作看看CoW的动作。

我们举一个例子来说明如何创建和使用snapshot。我们假定创建一个20M的snapshot,这就意味着在snapshot生命周期里,你仅能有20M的数据量改变。

下面的命令,为/dev/vg/lvdata创建/dev/vg/lvdata-sp

# lvcreate -L20M -s -n lvdata-sp /dev/vg/lvdata

Logical volume “lvdata-sp” created

其中lvdata大小为20MB。

# lvdisplay /dev/vg/lvdata-sp

— Logical volume —

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status active destination for/dev/vg/lvdata

LV Status available

# open 1

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Allocated to snapshot 0.27%

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0

Block device 253:0

上面的 Allocated to snapshot 0.27%是我们关心的,表示目前还有99.73%的空间没有使用。

我们尝试在lvdata创建一个10M的文件,再看看这个参数值。

# mount /dev/vg/lvdata /media/lvdata/

# dd if=/dev/hda of=/media/lvdata/10M bs=1M count=10

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.272393 seconds, 38.5MB/s

# lvdisplay /dev/vg/lvdata-sp

— Logical volume —

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status active destination for/dev/vg/lvdata

LV Status available

# open 0

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Allocated to snapshot 51.02%

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0

Block device 253:0

”Allocated to snapshot 51.02%“,符合我们的预期。此时snapshot还剩下大概10M不到的空间了,如果我么再在lvdata上创建一个12M的文件,会发生什么呢?

#dd if=/dev/hda of=/media/lvdata/12M bs=1M count=12

12+0 records in

12+0 records out

12582912 bytes (13 MB) copied, 0.288311 seconds, 43.6MB/s

device-mapper: snapshots: Invalidating snapshot:Unable to allocate exception.

创建文件的过程中,一个报错出现了,snapshot已经无效。我们看看snapshot卷的详细信息。

# lvdisplay /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误

— Logical volume —

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status INACTIVE destination for/dev/vg/lvdata

LV Status available

# open 0

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0

整个snapshot卷已经出现I/0错误了,而且snapshot的状态也是“INACTIVE”。

是否能挂载上来呢?

# mount /dev/vg/lvdata-sp /media/snapshot/

mount: you must specify the filesystem type

#dmesg

Buffer I/O error on device dm-0, logical block 0

Buffer I/O error on device dm-0, logical block 1

Buffer I/O error on device dm-0, logical block 2

Buffer I/O error on device dm-0, logical block 3

Buffer I/O error on device dm-0, logical block 4

Buffer I/O error on device dm-0, logical block 5

Buffer I/O error on device dm-0, logical block 6

Buffer I/O error on device dm-0, logical block 7

Buffer I/O error on device dm-0, logical block 8

Buffer I/O error on device dm-0, logical block 9

hfs: unable to find HFS+ superblock

从dmesg的错误信息来看,超级块的信息也丢失了

尝试激活一下lvdata-sp

# lvchange -ay /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误

恩,这个snapshot已经被释放了,所以剩下要做得事情就是删除它。

# lvremove /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误

Do you really want to remove active logical volume“lvdata-sp”? [y/n]: y

Logical volume “lvdata-sp” successfully removed

b)利用snapshot在线备份MySQL数据库(或者其他数据库)

流程是先做一个flush操作,并锁定表,然后创建snapshot,然后解锁,然后备份数据,最后释放snapshot。这样,MySQL几乎不会中断其运行。

FLUSH TABLES WITH READ LOCK;

! lvcreate –size 100m –snapshot –name snap/dev/VolGroup01/LogVol00

UNLOCK TABLES;

接着做一些备份的工作

mkdir /snap

mount /dev/VolGroup01/snap /snap

# This is where you back up whatever you need from/snap, e.g. rsync(1)

umount /snap

lvremove /dev/VolGroup01/snap

rmdir /snap

时间: 2024-10-16 12:16:18

LVM快照(snapshot)备份的相关文章

Linux-6.5下 MariaDB-10基于LVM快照的备份数据 详解

理解部分: LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.LVM可以对分区在线扩容,快照,镜像和条带化,功能非常强大.这篇文章的主题就是其中一个功能--快照. 快照(Snapshot)就是关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像.快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品: 其实

lvm-snapshot:基于LVM快照的备份之准备工作

选择lvm逻辑卷存储数据库数据目录的2大理由 (1) 一般来说,我们会将数据库的数据目录放在lvm逻辑卷上,因为数据库的数据增长速度可能会超出我们的预期 ,这样在将来即便是数据增长很快,我们也不必担心,因为lvm可以实现在线扩容 (2) 我们可以对数据目录做基于lvm快照的备份 1.创建用于存储数据目录lvm设备 1.1 创建一个新分区,并修改分区类型 # echo -e 'n\np\n1\n\n+10G\nw\n'|fdisk /dev/sdb # echo -e 't\n8e\np\nw\n

lvm-snapshot:基于LVM快照的备份

续 lvm-snapshot:基于LVM快照的备份之准备工作 Attention,Please! 重头戏开始啦 3.基于LVM快照的备份 (1)事务日志跟数据文件必须在同一个卷上: (2)创建快照卷之前,要请求MySQL的全局锁:在快照创建完成之后释放锁: (3)请求全局锁完成之后,做一次日志滚动:做二进制日志文件及位置标记(手动进行): 备份步骤: 3.1 请求全局锁,并滚动日志 MariaDB [hellodb]> FLUSH TABLES WITH READ LOCK; MariaDB [

MySQL基于LVM快照的备份恢复

目录 1.数据库全备份 2.准备LVM卷 3.数据恢复到LVM卷 4.基于LVM快照备份数据 5.数据灾难恢复 6.总结 写在前面: 测试环境中已安装有mysql 5.5.36数据库,但数据目录没有存放在LVM卷,此次要演示基于LVM的数据备份和恢复,所以就把mysql的数据先迁移到LVM上再做快照卷的备份. 如果innodb表基于LVM来做备份,那事务日志文件和数据文件要在同一个LVM的逻辑卷上,因为在同一时刻我们只能对一个逻辑卷做快照,如果事务日志与数据文件不在同一卷上,那做快照后会导致事务

mysql之lvm快照方式备份恢复

好像一般大家都不用这个吧,这里也仅是当做记录吧. 其实lvm快照不管是什么存储引擎都可以做到接近热备,看起来也还不错的样子.不过却也需要一些所必须的条件. 如:LVM卷,而且也有足够的空闲空间来做快照,并且事务日志也要与数据文件在一起. 好啦,废话不多说,我们先看看怎么用吧. 大体步骤: 1.全局锁. 2.滚动二进制日志,并做好记录 3.创建lvm快照. 4.释放锁. 5.从快照盘手动复制数据. 6.卸载并移除快照盘. 来吧. 先来看看lvm的情况: [[email protected] bac

使用LVM快照进行数据库备份

使用mysqldump备份时,如果存储引擎为MyISAM,则只能实现温备份,并需使用选项--lock-all-tables锁定所有表.如果存储引擎为InnoDB,则加上--single-transaction选项,可以实现热备.使用mysqldump进行逻辑备份,还存在如下问题:浮点数据丢失精度: 备份出的数据更占用空间:不过可压缩后以大大节省空间 不适合对大数据库(如一个库超过10G)做完全备份 另外对InnoDB而言,需要使用mysql> FLUSH TABLES WITH READ LOC

mysqldump 和 基于快照的备份

mysqldump 和 基于快照的备份 Table of Contents mysqldump: 仅适用于数据集较小 lvm-snapshot: 基于 LVM 快照的备份 相关阅读 mysqldump: 仅适用于数据集较小 mysqldump DB_NAME [tbname1] [tbname2] # mysqldump -uroot -pYOUR_PASSWORD DB_NAME > test.sql mysql> create database test2; mysqldump -uroo

lvm快照备份mysql

快照备份原理(从其他博客看的): 原理:通过lvm快照给lvm真身拍个照片,当lvm真身发送改变时,lvm快照把lvm真身改变之前的内容存放在快照上,这样在lvm快照有效的这段时间内,我们看到的lvm快照上的内容始终是lvm真身在创建lvm快照时内容,通过备份lvm快照即可达到在线备份lvm真身的目的.需要注意的是,当lvm快照比lvm真身小时,若lvm真身发生的改变大于lvm快照,则lvm快照将变得无法读取而失效; 若lvm快照大于等于lvm真身,则不会发生前面的情况.当一个snapshot创

MySQL备份与恢复常用方法总结(mysqldump/xtrabackup/lvm快照备份/二进制日志及时点恢复)

MySQL备份与恢复常用方法总结 (mysqldump/xtrabackup/lvm快照备份/逻辑备份与恢复/二进制日志及时点恢复) 自言:学习在于总结,把所了解的类似东西放到一起更能加深记忆 一.了解备份相关知识 1)按服务器备份时状态可分为:     热备份:读.写不受影响:     温备份:仅可以执行读操作:     冷备份:离线备份:读.写操作均中止:2)按服务器备份数据集可分为:     物理备份:复制数据文件:     逻辑备份:将数据导出至文本文件中:3)按服务器备份数据量可分为: