Table of Contents
Introduction
In this guide, we will be covering two types of scenario. To backup an XFS filesystem and restoring. And another one will be, How to reclaim the space from an XFS filesystem which added more than the requirement.
While the initial server setup the /u01 filesystem created with a logical volume of 100GB in size. Upon growth of the filesystem and as per the requirement it supposes to be extended with an additional 100 GB and needs to show as a total of 200 GB. But by mistake, we have added an additional 200 GB of disk So the current total size of filesystem is grown to 300 GB.
There is no use of adding 300 GB for /u01 filesystem which holds the Oracle binary Installation files. So, it’s time to reclaim an additional 100 GB space and make it round of 200 GB as per the business requirement. Hence, the XFS filesystem won’t support XFS reduce we need to plan for a backup and restore. We may have a backup team to restore the content in short span of time. However, this can be done using default xfsdump as well.
Let’s install the required package and start with our demonstration.
Installing XFS backup package
Let’s install the xfsdump and start with backup and restore.
# yum -y install xfsdump
Use Yum or DNF to install the package.
Creating Temporary Backup location
To start with backup and restore, we don’t have enough space in any mount points. The size of /u01 filesystem is around 76 GB. So, let’s add 100 GB of a new disk for the new backup mount point.
The name of the newly added 100 GB disk will be /dev/sdr.
Now let’s create a Physical volume, volume group and logical volume for the backup mount point.
$ pvcreate /dev/sdr
$ vgcreate vg_backup /dev/sdr
$ lvcreate -l 100%FREE -n lv_backup vg_backup
Output for reference
root:prod-srv-1 ~ $ pvcreate /dev/sdr
Physical volume "/dev/sdr" successfully created.
root:prod-srv-1 ~ $ vgcreate vg_backup /dev/sdr
Volume group "vg_backup" successfully created
root:prod-srv-1 ~ $ lvcreate -l 100%FREE -n lv_backup vg_backup
Logical volume "lv_backup" created.
root:prod-srv-1 ~ $
Create the filesystem on newly created logical volume. By following create a directory and mount the filesystem.
$ mkfs.xfs /dev/mapper/vg_backup-lv_bacup
$ mkdir /backup
$ mount /dev/mapper/vg_backup-lv_bacup /backup/
Output for reference
root:prod-srv-1 $ mkfs.xfs /dev/mapper/vg_backup-lv_backup
meta-data=/dev/mapper/vg_backup-lv_bacup isize=512 agcount=4, agsize=6553344 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26213376, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root:prod-srv-1 $ mkdir /backup
root:prod-srv-1 $ mount /dev/mapper/vg_backup-lv_backup /backup/
List the mounted filesystem to confirm.
root:prod-srv-1 $ df -hP
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-root 6.0G 3.1G 3.0G 51% /
/dev/sda1 1014M 356M 659M 36% /boot
/dev/mapper/vg01-home 6.0G 36M 6.0G 1% /home
/dev/mapper/vg01-tmp 6.0G 83M 6.0G 2% /tmp
tmpfs 786M 0 786M 0% /run/user/0
/dev/mapper/vg_u01-lv_u01 300G 76G 225G 26% /u01
/dev/mapper/vg_backup-lv_bacup 100G 33M 100G 1% /backup
root:prod-srv-1 $
It’s time to start the backup.
Starting with XFS filesystem BackUp
Take the backup of /u01 filesystem under newly created filesystem /backup in the name u01_backup.img. The dump of 76 GB has been completed in 3 minutes.
$ xfsdump -f /backup/u01_backup.img /u01
To proceed with dump press enter twice while prompting for label and media label, Refer below output.
root:prod-srv-1 $ xfsdump -f /backup/u01_backup.img /u01
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control
============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
->
session label entered: ""
--------------------------------- end dialog ---------------------------------
xfsdump: WARNING: no session label specified
xfsdump: WARNING: most recent level 0 dump was interrupted, but not resuming that dump since resume (-R) option not specified
xfsdump: level 0 dump of prod-srv-1:/u01
xfsdump: dump date: Sun Jan 26 09:46:25 2020
xfsdump: session id: ce19b9e3-611b-471d-a226-c7955069326c
xfsdump: session label: ""
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 80434353856 bytes
============================= media label dialog =============================
please enter label for media in drive 0 (timeout in 300 sec)
->
media label entered: ""
--------------------------------- end dialog ---------------------------------
xfsdump: WARNING: no media label specified
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 80466740032 bytes
xfsdump: dump size (non-dir files) : 80242784808 bytes
xfsdump: dump complete: 578 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /backup/u01_backup.img OK (success)
xfsdump: Dump Status: SUCCESS
root:prod-srv-1 $
Once completed with successful dump navigate to the backup location to confirm the backup file size with .img extension.
root:prod-srv-1 backup $ ls -lthr
total 75G
-rw-r-----. 1 root root 75G Jan 26 09:56 u01_backup.img
root:prod-srv-1 backup $
Once we confirm with the backup, unmount the filesystem which you required to restore.
root:prod-srv-1 ~ $ umount /u01/
We are about to follow with our second scenario. If you only need to backup and restore skip the reducing logical volume and continue with Restoring from Backup.
Reducing the Logical Volume
As we discussed in the introduction let’s start with reclaim the space from an XFS filesystem which added more than the requirement.
Reduce the logical volume from 300 GB to 200 GB. By following create the XFS filesystem on reduced logical volume with force option.
$ lvreduce -L -100G /dev/vg_u01/lv_u01
$ mkfs.xfs -f /dev/mapper/vg_u01-lv_u01
root:prod-srv-1 ~ $ lvreduce -L -100G /dev/vg_u01/lv_u01
WARNING: Reducing active logical volume to 199.99 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_u01/lv_u01? [y/n]: y
Size of logical volume vg_u01/lv_u01 changed from 299.99 GiB (76798 extents) to 199.99 GiB (51198 extents).
Logical volume vg_u01/lv_u01 successfully resized.
root:prod-srv-1 ~ $ mkfs.xfs -f /dev/mapper/vg_u01-lv_u01
meta-data=/dev/mapper/vg_u01-lv_u01 isize=512 agcount=4, agsize=13106688 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=52426752, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=25599, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root:prod-srv-1 ~ $
Mount the filesystem and restore the SELinux label for the newly created mount point. If you need to have proper ownership make sure to change the same before starting with restoring the backup.
$ mount /dev/mapper/vg_u01-lv_u01 /u01/
$ restorecon -Rv /u01/
$ chown oracle:oinstall /u01/
Restoring from the Backup
Start to restore from the dump backup file /backup/u01_backup.img.
$ xfsrestore -f /backup/u01_backup.img /u01/
root:prod-srv-1 ~ $ xfsrestore -f /backup/u01_backup.img /u01/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description:
xfsrestore: hostname: prod-srv-1
xfsrestore: mount point: /u01
xfsrestore: volume: /dev/mapper/vg_u01-lv_u01
xfsrestore: session time: Sun Jan 26 09:46:25 2020
xfsrestore: level: 0
xfsrestore: session label: ""
xfsrestore: media label: ""
xfsrestore: file system id: 41c17873-663a-4aa3-b2ea-c0b1c14e29002
xfsrestore: session id: ce13b9e3-611b-471d-a226-c7955069326c
xfsrestore: media id: 0a68d132-7bc6-4f66-995e-9834c20e3314
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 11088 directories and 330080 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 201 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /backup/u01_backup.img OK (success)
xfsrestore: Restore Status: SUCCESS
root:prod-srv-1 ~ $
Verify the restored mount point.
root:prod-srv-1 ~ $ df -hP /u01/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_u01-lv_u01 200G 76G 125G 38% /u01
root:prod-srv-1 ~ $
we have successfully taken an XFS dump and restored. However, we are not done with reclaiming the newly added disk and old disk used for /u01.
Reclaiming the unused Disks
Finding the currently used Disk
Let us first confirm currently which disk is used under /dev/vg_u01/lv_u01 logical volume.
$ lvs -o +devices /dev/vg_u01/lv_u01
root:prod-srv-1 ~ $ lvs -o +devices /dev/vg_u01/lv_u01
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv_u01 vg_u01 -wi-ao---- 199.99g /dev/sdc1(0)
root:prod-srv-1 ~ $
From the above output, it’s clear /dev/sdc1 is used for new XFS filesystem. So let us list and remove the old disk /dev/sdb1.
Verify the Unused Disk
While reclaiming the disk we need to be very clear which disk we are about to remove. So, let’s list all the disk and confirm before starting with the reclaim process.
$ pvs
$ vgs
$ lvs
root:prod-srv-1 ~ $ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg01 lvm2 a-- 61.00g 4.00m
/dev/sda3 vg01 lvm2 a-- <37.99g <37.99g
/dev/sdb1 vg_u01 lvm2 a-- <100.00g <100.00g
/dev/sdc1 vg_u01 lvm2 a-- <200.00g 4.00m
/dev/sdr vg_backup lvm2 a-- <100.00g 0
root:prod-srv-1 ~ $ vgs
VG #PV #LV #SN Attr VSize VFree
vg01 2 11 0 wz--n- 98.99g 37.99g
vg_backup 1 1 0 wz--n- <100.00g 0
vg_u01 2 1 0 wz--n- 299.99g 100.00g
root:prod-srv-1 ~ $ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home vg01 -wi-ao---- 6.00g
root vg01 -wi-ao---- 6.00g
swap vg01 -wi-ao---- 16.00g
tmp vg01 -wi-ao---- 6.00g
var vg01 -wi-ao---- 6.00g
lv_bacup vg_backup -wi-ao---- <100.00g
lv_u01 vg_u01 -wi-ao---- 199.99g
root:prod-srv-1 ~ $
The output of pvs shows /dev/sdb1 is not used.
Reducing the Volume Group
Once confirmed, we can start to reduce the VG size by removing the old disk /dev/sdb1 from the VG vg_u01. Once again run pvs, vgs, lvs to confirm.
$ vgreduce vg_u01 /dev/sdb1
$ pvs
$ lvs
root:prod-srv-1 ~ $ vgreduce vg_u01 /dev/sdb1
Removed "/dev/sdb1" from volume group "vg_u01"
root:prod-srv-1 ~ $ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg01 lvm2 a-- 61.00g 4.00m
/dev/sda3 vg01 lvm2 a-- <37.99g <37.99g
/dev/sdb1 lvm2 --- <100.00g <100.00g
/dev/sdc1 vg_u01 lvm2 a-- <200.00g 4.00m
/dev/sdr vg_backup lvm2 a-- <100.00g 0
root:prod-srv-1 ~ $ vgs
VG #PV #LV #SN Attr VSize VFree
vg01 2 11 0 wz--n- 98.99g 37.99g
vg_backup 1 1 0 wz--n- <100.00g 0
vg_u01 1 1 0 wz--n- <200.00g 4.00m
root:prod-srv-1 ~ $ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home vg01 -wi-ao---- 6.00g
root vg01 -wi-ao---- 6.00g
swap vg01 -wi-ao---- 16.00g
tmp vg01 -wi-ao---- 6.00g
var vg01 -wi-ao---- 6.00g
lv_backup vg_backup -wi-ao---- <100.00g
lv_u01 vg_u01 -wi-ao---- 199.99g
root:prod-srv-1 ~ $
Then remove the /dev/sdb1 from the physical volume and delete the partition sdb1 using fdisk. Make sure to delete all the partitions and remain only with /dev/sdb.
$ pvremove /dev/sdb1
root:prod-srv-1 ~ $ pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped.
root:prod-srv-1 ~ $
Remove the Temporary Backup Mount
By following remove the logical volume created for the backup mount point.
$ lvremove /dev/vg_backup/lv_backup
$ vgremove vg_backup
$ pvremove /dev/sdr
Output for reference
root:prod-srv-1 ~ $ lvremove /dev/vg_backup/lv_backup
Do you really want to remove active logical volume vg_backup/lv_bacup? [y/n]: y
Logical volume "lv_bacup" successfully removed
root:prod-srv-1 ~ $ vgremove vg_backup
Volume group "vg_backup" successfully removed
root:prod-srv-1 ~ $ pvremove /dev/sdr
Labels on physical volume "/dev/sdr" successfully wiped.
root:prod-srv-1 ~ $
Null the device name using echo command so that disk will be completely unattached from the server and free from I/O error. Else, If you have downtime, then go for a shutdown, then remove the disk and PowerON the server.
After the disk clean up or after taking a clean reboot. we should get all the mount points as shown below.
root:prod-srv-1 ~ $ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg01 lvm2 a-- 61.00g 4.00m
/dev/sda3 vg01 lvm2 a-- <37.99g <37.99g
/dev/sdb1 vg_u01 lvm2 a-- <200.00g 4.00m
root:prod-srv-1 ~ $ vgs
VG #PV #LV #SN Attr VSize VFree
vg01 2 11 0 wz--n- 98.99g 37.99g
vg_u01 1 1 0 wz--n- <200.00g 4.00m
root:prod-srv-1 ~ $ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home vg01 -wi-ao---- 6.00g
root vg01 -wi-ao---- 6.00g
swap vg01 -wi-ao---- 16.00g
tmp vg01 -wi-ao---- 6.00g
var vg01 -wi-ao---- 6.00g
lv_u01 vg_u01 -wi-ao---- 199.99g
root:prod-srv-1 ~ $
Troubleshooting Error’s
If you try to reduce the XFS filesystem-based logical volume you may come across below error. To resolve this error we need to revert back the change by making the XFS filesystem size to the previous stage.
Jan 26 09:23:39 prod-srv-1 kernel: attempt to access beyond end of device
Jan 26 09:23:39 prod-srv-1 kernel: dm-11: rw=32, want=629129216, limit=209715200
Jan 26 09:23:39 prod-srv-1 kernel: XFS (dm-11): last sector read failed
That’s it we have successfully completed with two scenarios to reduce the XFS filesystem with examples. To read more about xfsdump, manual page available with more useful options and arguments.
Conclusion
To take a backup and restore XFS filesystem it’s only possible to backup and restores using xfsdump utility. Subscribe to the newsletter to keep updated with more filesystem related articles.