基于LVM快照备份 MySQL数据


基于LVM快照备份 MySQL数据

这是基于linux系统虚拟卷的一种快照技术,这种技术只对LVM有效,也就是说你的系统是基于LVM虚拟卷的。

LVS快照创建特别快,无论数据量大小,机会都是瞬间完成。因为创建的时候,只是创建了一个快照空间而已,并没有数据的拷贝。
当原始卷里的数据有写入时,备份卷开始记录原始卷哪些数据发生了变化,然后在原始卷新数据覆盖旧数据时,将旧数据拷贝到快照的预留空间,
起到备份数据的作用,这就是LVM快照备份,采用写时复制技术(Copy-On-Write,COW),不用停止服务或将逻辑卷设为只读就可以进行备份,
使用LVM快照功能既可以获得一致备份,又不会影响服务器的可用性。

恢复速度非常快。应该是最快的一种备份方案。
逻辑卷是创建在卷组之上的。逻辑卷对应的设备文件保存在卷组目录下,
例如:在卷组"vg1000"上创建一个逻辑卷"lvol0",则此逻辑卷对应的设备文件为"/dev/vg1000/lvol0"。

LVM基本术语:
1)物理存储介质:这里指系统的存储设备:硬盘,如: /dev/hda、/dev/sda等等,是存储系统最低层的存储单元。
2)物理卷physical volume (PV )
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如 RAID),是 LVM的基本存储逻辑块
3)卷组Volume Group (VG )
LVM卷组由一个或多个物理卷组成,但是更确切的说,它包含由这些物理卷提供的许多PE。
4)逻辑卷logical volume (LV )
这里是我们存储信息的地方,在逻辑卷之上可以建立文件系统 (比如/home或者 /usr等)。
5)PE(physical extent )
每一个物理卷被划分为称为 PE的基本单元,具有唯一编号的 PE是可以被 LVM寻址的最小单元。 PE的大小是可配置的,默认为 4MB。


缺陷:因为COW原因,预留空间有限,也就是说变更过于频繁,变更过大,会导致预留空间被再次覆盖。因此,需要单独备份快照。Linux下不能对LVM,LVS进行错误的操作,这可能导致快照失效,无法恢复。

进行数据库数据备份就必须进行如下2个操作。否则数据会是不一致的,恢复之后可能存在问题。

为了安全 首先在数据库上施加读锁
mysql>FLUSH TABLES WITH READ LOCK;

刷新一下二进制日志,便于做时间点恢复
mysql>FLUSH LOGS;

然后创建快照卷
lvcreate –L 300M –s –n lvsnap –p –r /dev/vgtest/lvsource

-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。
–s:创建快照。        –n:快照名称。    -p -r:权限

[root@localhost lvsource]# lvs
  LV       VG     Attr       LSize   Pool Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home     rhel   -wi-ao----  18.08g
  root     rhel   -wi-ao----  30.00g
  swap     rhel   -wi-ao----   3.88g
  lvsnap   vgtest swi-a-s--- 300.00m      lvsource 0.01
  lvsource vgtest owi-aos---   1.00g

最后进入数据库释放读锁
UNLOCK TABLES;

挂载快照卷进行备份
mount –r /dev/myvg/data-snap /mnt/snap

然后对/mnt/snap下的文件进行打包备份

还原的时候,关闭mysqld,然后备份二进制日志后将原来备份的文件还原进去,
然后通过二进制日志还原到出错的时间点(通过二进制还原时间点的时候不要忘了暂时关闭二进制日志)。

备份恢复方法1(快照合并merge):

创建几个文件
[root@localhost lvsource]# touch {a,b,c}.txt
[root@localhost lvsource]# ls
a.txt  b.txt  c.txt
[root@localhost lvsource]# echo 'OK' >a.txt
[root@localhost lvsource]#
[root@localhost lvsource]# echo 'NO' >b.txt

创建一个300M的快照
[root@localhost lvsource]# lvcreate -L 300M -s -n lvsnap /dev/vgtest/lvsource
  Using default stripesize 64.00 KiB.
  Logical volume "lvsnap" created.

[root@localhost lvsource]# lvs
  LV       VG     Attr       LSize   Pool Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  home     rhel   -wi-ao----  18.08g
  root     rhel   -wi-ao----  30.00g
  swap     rhel   -wi-ao----   3.88g
  lvsnap   vgtest swi-a-s--- 300.00m      lvsource 0.01
  lvsource vgtest owi-aos---   1.00g


快照之后:
[root@localhost lvsource]# ls
a.txt  b.txt  c.txt
[root@localhost lvsource]#
[root@localhost lvsource]# touch d.txt
[root@localhost lvsource]# echo 'hello' >d.txt


恢复之前的状态:

要先卸载原始卷,再使用--merge(合并)恢复。

[root@localhost /]# umount /lvsource
[root@localhost /]#

合并,这里--merge后面跟,快照名称。
[root@localhost /]# lvconvert --merge /dev/vgtest/lvsnap
  Merging of volume vgtest/lvsnap started.
  lvsource: Merged: 100.00%

[root@localhost /]# mount /dev/vgtest/lvsource /mnt
[root@localhost /]#
[root@localhost /]# ls /mnt
a.txt  b.txt  c.txt
[root@localhost /]# cat /mnt/a.txt
OK
[root@localhost /]# cat /mnt/b.txt
NO
[root@localhost /]# cat /mnt/c.txt

恢复到了,创建快照之前。

其实快照可以一直创建下去。恢复的时候,可以选择恢复的位置。相互不会影响。


(1)lvsource原数据  a.txt b.txt c.txt
(2)snap20170803113421
(3)加入新的数据:d.txt
(4)snap201708040913402

如果lvconvert --merge 是20170804号的快照,那么将会是a-d文件。
如果lvconvert --merge 是20170803号的快照,那么将会是a-c文件。

可以任意合并2次快照,先合并谁都无所谓。
合并之后,还可以继续合并的。

只不过反顺序合并,可能导致下面的错误。
[root@localhost /]# lvcreate -L 100M -s -n snap10 /dev/vgtest/lvsource
  Using default stripesize 64.00 KiB.
  Snapshots of an origin that has a merging snapshot is not supported
原生逻辑卷快照(COW快照) 回滚后 就不能再打快照


1.删除了原文件,可以恢复到快照之前。
2.删除了快照。自然无法恢复。
3.删除了LV卷。lvremove /dev/vgtest/lvsource 会先删除快照,再删除lv卷。删除之后无法恢复。
4.格式化了lv卷。mkfs.xfs -f /dev/vgtest/lvsource格式化了卷之后,快照依然在,可以恢复。

不过这种在原卷上恢复的方法,一旦恢复错误,将无法挽回。不够安全。


备份恢复方法2(备份快照):

1.挂载快照,tar压缩备份。[root@localhost /]# mount -o -ro /dev/vgtest/snap1 /mnt
    Centos 7.3无法执行。

2.dump备份快照,无法支持。

3.dd打包备份。

备份LV卷。
[root@localhost /]# dd if=/dev/vgtest/lvsource of=/tmp/lvsource.dd
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 14.452 s, 74.3 MB/s
[root@localhost /]#
[root@localhost /]# ls /tmp/
ks-script-3SZd3a  lvsource.dd  yum.log

删除该LV卷。等于清空数据。

[root@localhost /]# umount /lvsource/
[root@localhost /]#
[root@localhost /]# lvremove /dev/vgtest/lvsource
Do you really want to remove active logical volume vgtest/lvsource? [y/n]: y
  Logical volume "lvsource" successfully removed
[root@localhost /]#
[root@localhost /]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home rhel -wi-ao---- 18.08g
  root rhel -wi-ao---- 30.00g
  swap rhel -wi-ao----  3.88g

恢复。没有该LV卷,先创建一个名字相同的卷。
[root@localhost /]# dd if=/tmp/lvsource.dd if=/dev/vgtest/lvsource
dd: failed to open ‘/dev/vgtest/lvsource’: No such file or directory
[root@localhost /]#
[root@localhost /]# lvcreate -L 1G -n lvsource vgtest
WARNING: xfs signature detected on /dev/vgtest/lvsource at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/vgtest/lvsource.
  Logical volume "lvsource" created.

[root@localhost /]# lvs
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home     rhel   -wi-ao---- 18.08g
  root     rhel   -wi-ao---- 30.00g
  swap     rhel   -wi-ao----  3.88g
  lvsource vgtest -wi-a-----  1.00g

恢复。
[root@localhost /]#
[root@localhost /]# dd if=/tmp/lvsource.dd of=/dev/vgtest/lvsource
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 21.205 s, 50.6 MB/s
[root@localhost /]#
[root@localhost /]# mount /dev/vgtest/lvsource /lvsource/
[root@localhost /]# ls /lvsource/
a.txt  b.txt  c.txt  d.txt  f.txt

恢复成功。原理上,可以备份恢复任意数据。

[root@localhost /]# ll -h /tmp/
total 1.1G
-rwx------. 1 root root  836 Aug 30 11:38 ks-script-3SZd3a
-rw-r--r--. 1 root root 1.0G Aug 31 15:05 lvsource.dd
-rw-------. 1 root root    0 Aug 30 11:28 yum.log

相当于把整个LV卷的空间元数据cp,占用磁盘空间太大,效率太低,IO太高。
与cp的区别是,cp只会cp有数据的文件,dd是cp整卷。

总之,该方法是备份速度最快,恢复最快的方法之一。但是也有其风险性,如果对磁盘,Linux,lvm不大懂的,请不要使用。

可能一不小心备份就没了。或者被复写了。不推荐作为普通运维或是DBA进行MySQL的数据备份。阿里云,百度云都是采用的该技术对服务器数据备份。

你可能感兴趣的:(备份恢复)