1、情况简述
最近某个客户,把虚拟服务器LVM里的PV磁盘给删除掉了(在虚拟化管理平台把磁盘文件直接移除了),导致系统里面几十个T的数据全部丢失。
针对删除/损坏PV导致整个LVM失效这种事很麻烦,要是虚拟机文件都删除基本是回天乏术了,要是物理存储硬件还可以找专业的数据恢复人士来尝试恢复下部分数据(这个恢复也会非常耗时+繁琐)。
接下来我做了3个场景,模拟PV丢失恢复数据的情况。
郑重声明,数据无价,搞砸了我们打工人赔不起
如果想用我下面的方法恢复,我的人生经验奉劝你:做好风险评估,应急措施,打好申请,最后甲方爸爸要同意!!不一定都能100%恢复。你要拿不准还是去找专业数据恢复的人来搞,不要轻易做背锅侠。
2、环境准备
假设datavg由3个PV组成:
/dev/sdb、/dev/sdc、/dev/sdd,每个磁盘1G
进行磁盘分区,创建VG、LV,并格式化LV为ext4文件系统,
创建1个/oradata文件夹,挂载lv到该目录,赋予相应的权限
创建1个ORACLE数据库实例oratest,把数据文件存放到该目录下
至此准备环境完毕!查看相关的LVM信息
数据库实例状态正常。
存储空间占用1.5G,正好占用了sdb/sdc两块磁盘的空间(默认LVM不加参数是写满1个PV,再写另1个PV)
3、情景1
情况1:我们要模拟最后1块磁盘数据损坏,看看LVM能否恢复,数据是否丢失
接下来的操作有风险,不要在生产里随意尝试!!!
下面来执行下破坏操作,然后Reboot重启主机
重启后文件系统无法挂载,提示lv不存在
检查VG、LV情况发现丢失Device
/dev/sdd已经处理unknow device状态
hex查看sdd,已经非常干净了,全是0
下面我们要准备恢复了!
首先需要查看系统备份的vg信息如下
[root@oracle lvm]# cat /etc/lvm/backup/datavg
# Generated by LVM2 version 2.02.143(2)-RHEL6 (2016-12-13): Mon Oct 16 19:25:53 2023
contents = "Text Format Volume Group"
version = 1
description = "Created *after* executing 'lvcreate -L 2.9G -n datalv datavg'"
creation_host = "oracle" # Linux oracle 4.1.12-61.1.28.el6uek.x86_64 #2 SMP Thu Feb 23 20:03:53 PST 2017 x86_64
creation_time = 1697455553 # Mon Oct 16 19:25:53 2023
datavg {
id = "NwHnAr-jjYN-2dEc-I3TC-AcfO-ReBw-wfIqRB"
seqno = 2
format = "lvm2" # informational
status = ["RESIZEABLE", "READ", "WRITE"]
flags = []
extent_size = 8192 # 4 Megabytes
max_lv = 0
max_pv = 0
metadata_copies = 0
physical_volumes {
pv0 {
id = "8Axws7-76Ny-RaFT-NimK-PGfZ-ZiUD-LWnxZU"
device = "/dev/sdb1" # Hint only
status = ["ALLOCATABLE"]
flags = []
dev_size = 2088387 # 1019.72 Megabytes
pe_start = 2048
pe_count = 254 # 1016 Megabytes
}
pv1 {
id = "kgOnhG-69Eq-twhE-MqoJ-6G9c-SCXD-I48aQc"
device = "/dev/sdc1" # Hint only
status = ["ALLOCATABLE"]
flags = []
dev_size = 2088387 # 1019.72 Megabytes
pe_start = 2048
pe_count = 254 # 1016 Megabytes
}
pv2 {
id = "mcjt3O-g2Mq-RInj-apwm-a33g-F65t-yXTQ8r"
device = "/dev/sdd1" # Hint only
status = ["ALLOCATABLE"]
flags = []
dev_size = 2088387 # 1019.72 Megabytes
pe_start = 2048
pe_count = 254 # 1016 Megabytes
}
}
logical_volumes {
datalv {
id = "4enoBh-QiZc-peCc-vDHS-mMuS-NIe0-hjgVWI"
status = ["READ", "WRITE", "VISIBLE"]
flags = []
creation_host = "oracle"
creation_time = 1697455553 # 2023-10-16 19:25:53 +0800
segment_count = 3
segment1 {
start_extent = 0
extent_count = 254 # 1016 Megabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv0", 0
]
}
segment2 {
start_extent = 254
extent_count = 254 # 1016 Megabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv1", 0
]
}
segment3 {
start_extent = 508
extent_count = 235 # 940 Megabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv2", 0
]
}
}
}
}确认丢失的磁盘/dev/sdd对应的PV UUID
pv2 { id = "mcjt3O-g2Mq-RInj-apwm-a33g-F65t-yXTQ8r" device = "/dev/sdd1" # Hint only
接下来恢复操作,对/dev/sdd重新分区,并标记成lvm
标记完再hex查看/dev/sdd
先执行如下命令进行测试恢复
pvcreate --restorefile /etc/lvm/backup/datavg --uuid mcjt3O-g2Mq-RInj-apwm-a33g-F65t-yXTQ8r /dev/sdd1 --test
显示测试成功
接下来直接恢复PV成功。
下一步是要恢复VG的信息,把VG的信息写入到PV里,照例先测试恢复一下
正式恢复执行,也没有问题
vgcfgrestore --file /etc/lvm/backup/datavg datavg
恢复 成功后默认lvscan查看lv处理非激活状态,这里需要手动激活一下
执行如下命令
vgchange -ay datavg
激活后如下图所示
然后我们挂载文件系统
启动数据库
查看日志,没有问题,一切正常哈。
使用hex查看/dev/sdd
sdd里只记录了LVM的相关信息,再往下没有数据了。
也就是说,如果数据没有写到最后1个pv里,最后1个pv因故障下线,数据还是可以正常读取的!
这里说明一下,如果是sdd彻底损坏了不能再用,可以再划分一个和sdd大小一样的LUN过来,比如叫sde,进行分区,然后pvcreate 恢复的时候把UUID恢复到sde1的分区里,也可以恢复成功
pvcreate --restorefile /etc/lvm/backup/datavg --uuid mcjt3O-g2Mq-RInj-apwm-a33g-F65t-yXTQ8r /dev/sde1 --test
3、情景2
情况2:我们尝试清空一下lvm里第2个pv的分区表。来尝试恢复
清空前我们查看一下分区信息
接下来的操作有风险,不要在生产里随意尝试!!!
再次查看分区信息,己经清空了
此时我们查看一下数据库,还能创建表,日志还没有啥异常。
然后我们直接reboot服务器,再连接查看,文件系统己经无法挂载,vg和lv设备己经无法在系统里找到了也提示丢失pv
lsblk查看,sdc己经没有分区了。
下面尝试开始恢复,首先还是通过vg备份信息/etc/lvm/backup/datavg查看丢失PV的UUID。然后重建/dev/sdc分区。恢复和上一个常见一样,我就直接上图了
这里要多加个-ff参数,否则不成功。
恢复vg
启动数据库,查询表
查看数据库启动,正常无异常报错抛出
至此,丢失分区表恢复VG成功!!,也就是说只是丢失分区表,还可以成功恢复。
4、情景3
情景3:把第2个pv进行破坏操作,看看能不能恢复
接下来的操作有风险,不要在生产里随意尝试!!!
dd if=/dev/zero of=/dev/sdc bs=1024k count=200
然后去数据库里建个表,再查看下日志有没有啥异常
尝试创建表、切换日志,出发检查点
再查看日志,没啥报错么。(这里是因为linux的读写机制,还没有报错)
重启下机器再来。不用说也知道lv又丢了,vg设备也没有了
对Sdc进行一下分区
恢复pv/vg
挂载文件系统,打开数据库。玩完了,数据库文件损坏
这种情况就无法恢复了!!
5、总结
1、LVM里的LV是用默认参数创建的(非条带),最后1个pv里还没有写入数据,这种情况下最后1个PV如果数据损坏可以直接重建;如果是丢失或彻底故障了,可以用一个同样大小的盘来代替恢复。
2、如果只是某PV的磁盘分区表损坏了,后面的数据没有遭到破坏,可以重建pv,恢复vg备份还原。
3、如果损坏的PV是有数据的磁盘,那我奉劝你不要搞了, 重要数据让客户找数据恢复的来搞,能找回多少全看命。
也欢迎关注我的公众号【徐sir的IT之路】,一起学习!
————————————————————————————
公众号:徐sir的IT之路
CSDN :https://blog.csdn.net/xxddxhyz?type=blog
墨天轮:https://www.modb.pro/u/3605
PGFANS:https://www.pgfans.cn/user/home?userId=5568
————————————————————————————




