mysql备份与恢复(二)——lvm2快照技术
一、lvm及lvm快照介绍
1、LVM介绍
LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。
LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。 基本的逻辑卷管理概念:创建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的)
成功!!!