On LVM: How to extend Volume Groups and Logical Volumes

In the previous part of this article, we had a look at how to configure LVM, and we had successfully setup a Volume Group and two Logical Volumes. Now we are going to have a look at extending the group and volumes.

So let’s start the story from the previous part of this article!

Because, the mysql volume was filling up quickly so I decided to add a new disk of size 10 GB, and I really want to extend the mysql volume quickly, before the MySQL server stalls. With LVM, thats no longer an issue.

Partitioning the new disk

First let’s have a look at the partition table,

$ fdisk -l

The new disk is /dev/sdb, but its not partitioned, so lets create a single partition spanning the whole disk.

We will do so using the fdisk utility,

$ fdisk /dev/sdb

which will provide you with an interactive console, that you will use to create the partition.
Enter the commands in the following sequence:

Command (m for help): n

Command action
   e   extended
   p   primary partition (1-4)

Partition number (1-4): 1

First cylinder (1-1305, default 1): 1

Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): 1305

Command (m for help): w

Note that, in the above example, I have entered n, p, 1, 1, 1305 and w on the prompts.

Now executing the following will show you that our changes have been made to the disk:

$ fdisk -l /dev/sdb

The output will be something like the following,

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: 0xa5081455

Device      Boot      Start      End      Blocks    Id    System
/dev/sdb1               1        1305    10482381   83    Linux

Initializing the new partition for use with LVM

Now that we have a new partition, lets initialize it for use with LVM:

$ pvcreate /dev/sdb1

The output will be similar to the following:

Physical volume "/dev/sdb1" successfully created

Extending the Volume Group

Extending the volume group is as simple as executing the following command (remember that the volume group name in our case is “system” and the partition that we want to add to the volume group is “/dev/sdb1”:

$ vgextend system /dev/sdb1

The output will be similar to the following:

Volume group "system" successfully extended

Now lets see the details of the volume group:

$ vgs

The output will be something like the following,

  VG     #PV #LV #SN Attr   VSize  VFree
  system   2   2   0 wz--n- 15.31g 11.31g

See the volume group size is now extended to 15.31 GB.

Extending the Logical Volume

Now we can safely extend the logical volume mysql, so we can store more data on it now.

Before resizing the logical volume, because we will be making changes to its filesystem, we have to unmount the volume,

$ umount /var/lib/mysql/

Extending the logical volume is as simple as executing the following:

$ lvextend -L 6g /dev/system/mysql

The output will be something similar to the following

  Extending logical volume mysql to 6.00 GiB
  Logical volume mysql successfully resized

Now lets see the details about the logical volumes:

$ lvs

The output will be something similar to the following,

  LV    VG     Attr   LSize Origin Snap%  Move Log Copy%  Convert
  logs  system -wi-ao 2.00g
  mysql system -wi-a- 6.00g

As you can see the logical volume mysql has been extended to the required size of 6 GB

Notifying the file system about change in size of the volume

But simply extending the logical volume to a new size is not enough, we have to resize the filesystem as well,

$ e2fsck -f /dev/system/mysql
$ resize2fs /dev/system/mysql

Now that the filesystem is resized we are ready to mount the volume again,

$ mount /dev/system/mysql /var/lib/mysql/

Lets see the filesystem details now again,

$ df -h

The output is going to be something similar to the following,

Filesystem                Size  Used Avail Use% Mounted on
/dev/sda3                 3.7G  696M  2.9G  20% /
none                      116M  224K  116M   1% /dev
none                      122M     0  122M   0% /dev/shm
none                      122M   36K  122M   1% /var/run
none                      122M     0  122M   0% /var/lock
none                      3.7G  696M  2.9G  20% /var/lib/ureadahead/debugfs
/dev/sda2                 473M   30M  419M   7% /boot
/dev/mapper/system-logs   2.0G   67M  1.9G   4% /var/logs
/dev/mapper/system-mysql  6.0G   68M  5.6G   2% /var/lib/mysql

See that mysql volume has been mounted to the correct size.

See how easy it is to extend volumes and groups.
Now in the next part of this article we will have a look at backing up MySQL using LVM.

Ovais is a storage architect with keen focus on reliability, efficiency and performance of OLTP databases, more specifically MySQL. He currently works at Uber on ensuring storage reliability and scalability. Previously, he helped different web properties scale their MySQL infrastructure. He also worked at Percona as a Senior MySQL consultant and at a few other startups in various capacities.