什么是LVM?
什么是LVM?LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 分区加入其中,这样可以事项一种磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性,使用普通的磁盘分区,当一个磁盘的分区空间不够使用的时候,可 能就会带来很大的麻烦。使用LVM在一定程度上就可以解决普通磁盘分区带来的问题。
为什么使用LVM?
LVM通常用于装备大量磁盘的系统,但它同样适于仅有一、两块硬盘的小系统。
使用LVM的益处?
在使用很多硬盘的大系统中,使用LVM主要是方便管理、增加了系统的扩展性。 在一个有很多不同容量硬盘的大型系统中,对不同的用户的空间分配是一个技巧性的工作,要在用户需求与实际可用空间中寻求平衡。用户/用户组的空间建立在LVM上,可以随时按要求增大,或根据使用情况对各逻辑卷进行调整。当系统空间不足而加入新的硬盘时,不必把用户的数据从原硬盘迁 移到新硬盘,而只须把新的分区加入卷组并扩充逻辑卷即可。同样,使用LVM可以在不停服务的情况下。把用户数据从旧硬盘转移到新硬盘空间中去。
名词解释
1. PV(Physical Volume):物理卷,处于LVM最底层,可以是物理硬盘或者分区。
2.PP(Physical Extend):物理区域,PV中可以用于分配的最小存储单元,可以在创建PV的时候制定,如1M, 2M, 4M, 8M, 32M, 64M…组成同一VG中所有PV的PE大小应该相同。
3.VG(Volume Group):卷组,建立在PV之上,可以含有一个到多个PV。
4. LV(Logical Volume):逻辑卷,建立在VG之上,相当于原来分区的概念。不过大小可以动态改变。
创建LVM
系统中增加一块硬盘,fdisk -l 可以看到是/dev/sdb ,10G大小;
[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000d7372
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2611 20458496 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe0bc4c21
然后创建磁盘分区,类型为LVM
[root@localhost ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +1G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
2
Invalid partition number for type `2'
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (133-1305, default 133):
Using default value 133
Last cylinder, +cylinders or +size{K,M,G} (133-1305, default 1305): +1G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (265-1305, default 265):
Using default value 265
Last cylinder, +cylinders or +size{K,M,G} (265-1305, default 1305): +1G
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe0bc4c21
Device Boot Start End Blocks Id System
/dev/sdb1 1 132 1060258+ 83 Linux
/dev/sdb2 133 264 1060290 83 Linux
/dev/sdb3 265 396 1060290 83 Linux
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe0bc4c21
Device Boot Start End Blocks Id System
/dev/sdb1 1 132 1060258+ 8e Linux LVM
/dev/sdb2 133 264 1060290 8e Linux LVM
/dev/sdb3 265 396 1060290 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
在这块硬盘上创建3个分区,类型为Linux LVM; 可以fdisk -l /dev/sdb查看确认
[root@localhost ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe0bc4c21
Device Boot Start End Blocks Id System
/dev/sdb1 1 132 1060258+ 8e Linux LVM
/dev/sdb2 133 264 1060290 8e Linux LVM
/dev/sdb3 265 396 1060290 8e Linux LVM
[root@localhost ~]#
创建物理卷PV: pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
pvs或者pvscan可以查看物理卷;
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup lvm2 a--u 19.51g 0
/dev/sdb1 lvm2 ---- 1.01g 1.01g
/dev/sdb2 lvm2 ---- 1.01g 1.01g
/dev/sdb3 lvm2 ---- 1.01g 1.01g
[root@localhost ~]# pvscan
PV /dev/sda2 VG VolGroup lvm2 [19.51 GiB / 0 free]
PV /dev/sdb1 lvm2 [1.01 GiB]
PV /dev/sdb2 lvm2 [1.01 GiB]
PV /dev/sdb3 lvm2 [1.01 GiB]
Total: 4 [22.54 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [3.03 GiB]
创建物理卷组VG: vgcreate vgname /dev/sdb1 /dev/sdb2 /dev/sdb3
查看卷组使用vgs 或vgscan
[root@localhost ~]# vgcreate vgmysql /dev/sdb1 /dev/sdb2 /dev/sdb3
Volume group "vgmysql" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup 1 2 0 wz--n- 19.51g 0
vgmysql 3 0 0 wz--n- 3.02g 3.02g
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vgmysql" using metadata type lvm2
Found volume group "VolGroup" using metadata type lvm2
[root@localhost ~]#
创建逻辑卷: lvcreate -L size -n lv_name vg_name 指定在那个卷组上创建逻辑卷;
lvs或lvscan查看逻辑卷;
[root@localhost ~]# lvcreate -L 3G -n lv_mysql vgmysql
Logical volume "lv_mysql" created.
[root@localhost ~]# lv
lvchange lvcreate lvextend lvmchange lvmconfig lvmdump lvmsadc lvreduce lvrename lvs
lvconvert lvdisplay lvm lvmconf lvmdiskscan lvmetad lvmsar lvremove lvresize lvscan
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_root VolGroup -wi-ao---- 15.65g
lv_swap VolGroup -wi-ao---- 3.86g
lv_mysql vgmysql -wi-a----- 3.00g
[root@localhost ~]# lvscan
ACTIVE '/dev/vgmysql/lv_mysql' [3.00 GiB] inherit
ACTIVE '/dev/VolGroup/lv_root' [15.65 GiB] inherit
ACTIVE '/dev/VolGroup/lv_swap' [3.86 GiB] inherit
[root@localhost ~]#
创建文件系统: 逻辑卷创建完毕后就可以在此基础上创建文件系统: mke2fs -j 创建ext3文件系统
[root@localhost ~]# mke2fs -j /dev/vgmysql/lv_mysql
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 786432 blocks
39321 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# blkid /dev/vgmysql/lv_mysql
/dev/vgmysql/lv_mysql: UUID="11580ead-9f15-4b2a-8676-b0462b9457aa" SEC_TYPE="ext2" TYPE="ext3"
[root@localhost ~]#
挂在文件目录: mount /dev/vgmysql/lv_mysql /mnt,并把信息加到/etc/fstab中,这样以后开机就会自动挂在;
[root@localhost ~]# mount /dev/vgmysql/lv_mysql /mnt/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
16G 12G 3.4G 78% /
tmpfs 932M 0 932M 0% /dev/shm
/dev/sda1 485M 32M 429M 7% /boot
/dev/mapper/vgmysql-lv_mysql
3.0G 69M 2.8G 3% /mnt
[root@localhost ~]# vim /etc/fstab
[root@localhost ~]# cat /etc/fstab
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=e48ae1c4-8466-42b8-9d27-c5c6793e4da2 /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/vgmysql/lv_mysql /mnt ext3 defaults 0 0
[root@localhost ~]#
逻辑卷备份Mysql
LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里。
原文:https://blog.youkuaiyun.com/yanggd1987/article/details/50124997
前提条件:
- 快照的vg和备份源必须是同一个;
- 此逻辑卷需要有足够空间进行快照;
- 数据文件和事物日志放在同一个逻辑卷上;
逻辑卷上放mysql data文件:
[root@localhost mysql]# cat /etc/my.cnf | grep datadir
datadir =/mnt/mysql
[root@localhost mysql]# ls /mnt/mysql
apple jianghu localhost-relay-bin.index mysql mysql_slow_20180203.log performance_schema relay-log.info
auto.cnf localhost-relay-bin.000007 master.info mysql_run.err mysql_slow.log pid_mysql.pid sys
[root@localhost mysql]#
创建快照,lvcreate -L 500M -s -n lv_bak -p r /dev/vgmysql/lv_mysql
[root@localhost vgmysql]# lvcreate -L 500M -s -n lv_bak -p r /dev/vgmysql/lv_mysql
Volume group "vgmysql" has insufficient free space (6 extents): 125 required.
[root@localhost vgmysql]#
提示卷组空间不足,vgdisplay 只空闲24M了; 增加卷组
[root@localhost vgmysql]# vgdisplay vgmysql
--- Volume group ---
VG Name vgmysql
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 8
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size 3.02 GiB
PE Size 4.00 MiB
Total PE 774
Alloc PE / Size 768 / 3.00 GiB
Free PE / Size 6 / 24.00 MiB
VG UUID 5y373c-0gl8-p9hi-Jd9L-VBeu-G9t7-Cp3fpv
[root@localhost vgmysql]#
vgextend vgmysql /dev/sdb5
[root@localhost vgmysql]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup lvm2 a--u 19.51g 0
/dev/sdb1 vgmysql lvm2 a--u 1.01g 0
/dev/sdb2 vgmysql lvm2 a--u 1.01g 0
/dev/sdb3 vgmysql lvm2 a--u 1.01g 24.00m
/dev/sdb5 lvm2 ---- 3.01g 3.01g
[root@localhost vgmysql]# vgextend vgmysql /dev/sdb5
Volume group "vgmysql" successfully extended
[root@localhost vgmysql]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup lvm2 a--u 19.51g 0
/dev/sdb1 vgmysql lvm2 a--u 1.01g 0
/dev/sdb2 vgmysql lvm2 a--u 1.01g 0
/dev/sdb3 vgmysql lvm2 a--u 1.01g 24.00m
/dev/sdb5 vgmysql lvm2 a--u 3.01g 3.01g
[root@localhost vgmysql]# vgdisplay vgmysql
--- Volume group ---
VG Name vgmysql
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 9
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 4
Act PV 4
VG Size 6.03 GiB
PE Size 4.00 MiB
Total PE 1544
Alloc PE / Size 768 / 3.00 GiB
Free PE / Size 776 / 3.03 GiB
VG UUID 5y373c-0gl8-p9hi-Jd9L-VBeu-G9t7-Cp3fpv
现在可以看到Free 空闲了3G空间;
创建快照 lvcreate -L 500M -s -n lv_bak -p r /dev/vgmysql/lv_mysql
[root@localhost vgmysql]# lvcreate -L 500M -s -n lv_bak -p r /dev/vgmysql/lv_mysql
Logical volume "lv_bak" created.
然后就可以释放锁了;mysql > unlock tables;
mount /dev/vgmysql/lv_bak /media/ 将其挂在到/media目录
可以看到所有的文件信息;然后可以进行异地备份,cp复制到其他地方;此时的所有操作都不会影响到mysql;
因为快照是瞬间完成的,所以可以说几乎热备;
[root@localhost mnt]# mount /dev/vgmysql/lv_bak /mnt/bak/
mount: block device /dev/mapper/vgmysql-lv_bak is write-protected, mounting read-only
[root@localhost mnt]# ls /mnt/bak/mysql/
apple jianghu localhost-relay-bin.000008 master.info mysql_run.err mysql_slow.log pid_mysql.pid sys
auto.cnf localhost-relay-bin.000007 localhost-relay-bin.index mysql mysql_slow_20180203.log performance_schema relay-log.info
[root@localhost mnt]#