mysql备份与恢复(二)——lvm2快照技术

mysql备份与恢复(二)——lvm2快照技术

一、lvm及lvm快照介绍

1、LVM介绍

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。

LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。 基本的逻辑卷管理概念:

PV(Physical Volume)- 物理卷
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid备。

VG(Volumne Group)- 卷组
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

LV(Logical Volume)- 逻辑卷
逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。


2、LVM快照原理

   LVM对LV提供的快照功能,只对LVM有效。当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
    在写操作写入块之前,将原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。

   创建snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。

二、创建逻辑卷

192.168.50.135主机有一块闲置的分区/dev/sdb1,将其创建为pv

[root@Eric ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

在pv上创建vg取名为myvg

[root@Eric ~]# vgcreate myvg /dev/sdb1
  Volume group "myvg" successfully created

在vg上创建lv取名mylv,大小2G

[root@Eric ~]# lvcreate -L 2G -n mylv /dev/myvg
WARNING: ext4 signature detected on /dev/myvg/mylv at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/myvg/mylv.
  Logical volume "mylv" created

格式化mylv,并挂载到/mydata

[root@Eric ~]# mkfs.ext4 /dev/myvg/mylv
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@Eric ~]# mount /dev/myvg/mylv /mydata

将数据库文件存储在/mydata中,编辑/etc/my.cnf,修改默认数据存储路径为datadir=/mydata/mysqldata

[root@Eric ~]# cd /mydata/mysqldata/
[root@Eric mysqldata]# ll
总用量 29760
-rw-rw---- 1 mysql mysql    16384 6月  23 15:02 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 6月  23 15:02 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 6月  23 15:02 ibdata1
-rw-rw---- 1 mysql mysql  5242880 6月  23 15:02 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 6月  23 15:02 ib_logfile1
drwx------ 2 mysql mysql     4096 6月  23 15:02 mysql
-rw-rw---- 1 mysql mysql    30328 6月  23 15:02 mysql-bin.000001
-rw-rw---- 1 mysql mysql  1038814 6月  23 15:02 mysql-bin.000002
-rw-rw---- 1 mysql mysql      245 6月  23 15:02 mysql-bin.000003
-rw-rw---- 1 mysql mysql       57 6月  23 15:02 mysql-bin.index
drwx------ 2 mysql mysql     4096 6月  23 15:02 performance_schema
drwx------ 2 mysql mysql     4096 6月  23 15:02 test

现在已经将mysql的存储位置换到了我们的逻辑卷当中,为了和初始化的mysql有一定的区别,现在我们在mysql中创基一个数据库hellodb

MariaDB [(none)]> create database hellodb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

三、创建快照卷

首先为了保证数据一致性,首先请求一个全局读锁

MariaDB [(none)]> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

现在我们来创建一个mylv的快照卷

[root@Eric mysqldata]# lvcreate -L 1G -s -n mylv-snap /dev/myvg/mylv 
  Using default stripesize 64.00 KiB.
  Logical volume "mylv-snap" created

快照卷不需要再格式化,直接挂载即可,因此我们将快照卷挂载到/mydata-snap目录下

[root@Eric ~]# mount /dev/myvg/mylv-snap /mydata-snap

创建完快照卷后即可解开全局读锁

MariaDB [(none)]> unlock tables;
Query OK, 0 rows affected (0.00 sec)

现在我们去快照区里瞅一瞅,看看是什么样

[root@Eric ~]# cd /mydata-snap
[root@Eric mydata-snap]# ll
总用量 20
drwx------ 2 root  root  16384 6月  23 14:55 lost+found
drwxr-xr-x 6 mysql mysql  4096 6月  23 15:05 mysqldata
[root@Eric mydata-snap]# cd mysqldata/
[root@Eric mysqldata]# ll
总用量 29764
-rw-rw---- 1 mysql mysql    16384 6月  23 15:02 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 6月  23 15:02 aria_log_control
drwx------ 2 mysql mysql     4096 6月  23 15:05 hellodb
-rw-rw---- 1 mysql mysql 18874368 6月  23 15:02 ibdata1
-rw-rw---- 1 mysql mysql  5242880 6月  23 15:02 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 6月  23 15:02 ib_logfile1
drwx------ 2 mysql mysql     4096 6月  23 15:02 mysql
-rw-rw---- 1 mysql mysql    30328 6月  23 15:02 mysql-bin.000001
-rw-rw---- 1 mysql mysql  1038814 6月  23 15:02 mysql-bin.000002
-rw-rw---- 1 mysql mysql      334 6月  23 15:05 mysql-bin.000003
-rw-rw---- 1 mysql mysql       57 6月  23 15:02 mysql-bin.index
drwx------ 2 mysql mysql     4096 6月  23 15:02 performance_schema
drwx------ 2 mysql mysql     4096 6月  23 15:02 test

可以看出来我们的快照卷和原始逻辑卷里是一模一样的

现在我们对数据库进行一下修改我们加入一个数据库yayadb

MariaDB [(none)]> create database yayadb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
| yayadb             |
+--------------------+
6 rows in set (0.00 sec)

四、备份数据库

现在我们对快照卷里的数据库数据进行备份,我们scp快照卷里的所有数据库内容到另一台主机192.168.50.138的/tmp目录下

[root@Eric mydata-snap]# scp -rp /mydata-snap/mysqldata 192.168.50.138:/tmp

现在修改138主机上的数据库数据存储的默认目录为/tmp/mysqldata,还有一点要记住修改/tmp/mysqldata的属主和属组为mysql

在138主机上开启mysql,查看

[root@node1 mysql]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.19 sec)

MariaDB [(none)]> 

可以看到我们回到了最开始做快照时的样子(这个时候是没有yayadb的)

成功!!!







猜你喜欢

转载自blog.csdn.net/acfun_j/article/details/80783275