暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

新来的网管把数据库服务器LVM卷组里的PV盘删除了怎么办??

原创 徐sir 2023-10-24
666

1、情况简述

最近某个客户,把虚拟服务器LVM里的PV磁盘给删除掉了(在虚拟化管理平台把磁盘文件直接移除了),导致系统里面几十个T的数据全部丢失。

针对删除/损坏PV导致整个LVM失效这种事很麻烦,要是虚拟机文件都删除基本是回天乏术了,要是物理存储硬件还可以找专业的数据恢复人士来尝试恢复下部分数据(这个恢复也会非常耗时+繁琐)。

接下来我做了3个场景,模拟PV丢失恢复数据的情况。

郑重声明,数据无价,搞砸了我们打工人赔不起

如果想用我下面的方法恢复,我的人生经验奉劝你:做好风险评估,应急措施,打好申请,最后甲方爸爸要同意!!不一定都能100%恢复。你要拿不准还是去找专业数据恢复的人来搞,不要轻易做背锅侠。

2、环境准备

假设datavg由3个PV组成:

/dev/sdb、/dev/sdc、/dev/sdd,每个磁盘1G

进行磁盘分区,创建VG、LV,并格式化LV为ext4文件系统,

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JiaEbZKZfiaPC2GGKaibfiaBN9J1ME1JTFiaAickngn1ZA725hLRoUdTDicdkQ/640?wx_fmt=png

创建1个/oradata文件夹,挂载lv到该目录,赋予相应的权限

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JtUvliaqM4AUbjg6evPRq6mzZF1ZvBHMRTmzqVDwfR5GMjhgopryEXIQ/640?wx_fmt=png

创建1个ORACLE数据库实例oratest,把数据文件存放到该目录下

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JiaxpqqDa0hfwcOuTUWa4elUJ5VqTTfy74R9hmM3FGVVVfrAmCShZePA/640?wx_fmt=png

至此准备环境完毕!查看相关的LVM信息

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6J5ooW4yMXjMS21sYfLLqX1wYoOJatP5Cibic0Yqh4vdSticv7ebET8mz4A/640?wx_fmt=png

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6Jhodm2ibCYoSHaCyDNX7skcG3y2icIzqgDTE68FHyf8cKhTp0ve9hBzEQ/640?wx_fmt=png

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JnYRSNMf52hI3LPeFyerZFT50YwnrMl6U3WrHsNAUtXhSgRDPgk26VA/640?wx_fmt=png

数据库实例状态正常。

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JR0Z4HiaHuxCbc8r6evzUXJN9YjwXbaEygibJmETSszuic9qnbAg3wRIIQ/640?wx_fmt=png

存储空间占用1.5G,正好占用了sdb/sdc两块磁盘的空间(默认LVM不加参数是写满1个PV,再写另1个PV)

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JIDCARn2dBbERcKr0wsyFCcXZiaCQYTIZx8H4UHbGxRMxyia1NiaDJflyg/640?wx_fmt=png

3、情景1

情况1:我们要模拟最后1块磁盘数据损坏,看看LVM能否恢复,数据是否丢失

接下来的操作有风险,不要在生产里随意尝试!!!

下面来执行下破坏操作,然后Reboot重启主机

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JXUkvflB91uCcw9gAPXdcTmiaTusFb2ejIn7yiaawibqAMiaNkBkn0arnXA/640?wx_fmt=png

重启后文件系统无法挂载,提示lv不存在

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JlLwQGm0ZqBRGc1C1gmNfBIc59UnhaMP5N1sMabd2uewHPEoiaAK5r0A/640?wx_fmt=png

检查VG、LV情况发现丢失Device

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JicvEoK5Udww0tqgHMxqWgMxZYvKbpcEbvA4HvPFsevzMhEMPy5dmTDw/640?wx_fmt=png

/dev/sdd已经处理unknow device状态

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JAzkrODlR9QibFQicNfqfe8WJVDviawk9CXQS7uicX4IZKndLJic9xjFfyTA/640?wx_fmt=png

hex查看sdd,已经非常干净了,全是0

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JSYyialiafXwDUurMfpzYImicdbdFx1ZhD24qXadYIZMggsRQptiaTEKvgw/640?wx_fmt=png

下面我们要准备恢复了!

首先需要查看系统备份的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

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JEgbu6h6SodhnQuWdIAJd8kQsXsVDDrE3WHC2hTrPiazbGPhNzglS1Vw/640?wx_fmt=png

标记完再hex查看/dev/sdd

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JK65gJ32icvQPOMz71Hg4IkibnR53GedBeHGv0742ziaSmHvHKEicHYpn6g/640?wx_fmt=png

先执行如下命令进行测试恢复

pvcreate --restorefile /etc/lvm/backup/datavg --uuid mcjt3O-g2Mq-RInj-apwm-a33g-F65t-yXTQ8r /dev/sdd1 --test

显示测试成功

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6J2sQM3ErALVOMMd2ha6K6tp0Hgj4xib5gYcsKxKqTJjC5toyW3zLkEDw/640?wx_fmt=png

接下来直接恢复PV成功。

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6J1v1DbicoiaOvLoz4HStMKbIeEOBibibrHJZX58Rao5vOHEq9tFegFRh4fQ/640?wx_fmt=png

下一步是要恢复VG的信息,把VG的信息写入到PV里,照例先测试恢复一下

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JEz4vXEax2aZhbYGdq3rnd5ZiaXkG0v95HgCJFBy7KglRCoj8yzDqoGQ/640?wx_fmt=png

正式恢复执行,也没有问题

vgcfgrestore --file /etc/lvm/backup/datavg datavg

恢复 成功后默认lvscan查看lv处理非激活状态,这里需要手动激活一下
执行如下命令

vgchange -ay datavg

激活后如下图所示

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JCv3UIDsHiayw1T7XhFDQBib6iadoAxJOVo5d8NMlLG7TDLD6W9pL7Hic5g/640?wx_fmt=png

然后我们挂载文件系统

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JZAiblTLOicHqicYwGbt5RvuVHfJtWdR13GRLx00dmHVia7Fq1zAUsUmXaQ/640?wx_fmt=png

启动数据库

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6Jey2WRZ4ScMoDyxBZwhcl2oBdzMZ8HVo68IMudgwquqiaejwJlmHmhDA/640?wx_fmt=png

查看日志,没有问题,一切正常哈。
使用hex查看/dev/sdd

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JAFHeY2mwbqVH6W20mq17gwnYPgqicXsB9bm0zPo584oibCP9drH0pNNg/640?wx_fmt=png

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JOjgEIwic5j0npc5JkHdtNRKaaU1VayicMn6mjJ9xRMC3bGpqic4Dgwu2w/640?wx_fmt=png

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JHeicFzNVmOvbEgYuMDVJKubVmic9NoyMePMxBQxNquCB1R2V2GIcNxqg/640?wx_fmt=png

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的分区表。来尝试恢复

清空前我们查看一下分区信息

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JXD7VTVIpVmTCa88sIaicef7Yu7uOxjUaCT94DNx9XDK178uW6UdNmLQ/640?wx_fmt=png

接下来的操作有风险,不要在生产里随意尝试!!!

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6Jd2XFaJ4sRBXmiaxU9K24Bp1tYa6LEQDmNwJhXoNshDdhnlV2ZYNkictA/640?wx_fmt=png

再次查看分区信息,己经清空了

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6Jv8lllvQLOx5pXBR3XajD6XZsqYLSk4QYiaS0Gt1xz8SjWceEzgMib6rQ/640?wx_fmt=png

此时我们查看一下数据库,还能创建表,日志还没有啥异常。

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6Jly5Ngxm1SUtTUEnsqn88V3ibhf4KZMaXhFFZCve9WLfibAS9D5Cf2o6Q/640?wx_fmt=png

然后我们直接reboot服务器,再连接查看,文件系统己经无法挂载,vg和lv设备己经无法在系统里找到了也提示丢失pv

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JiaI5DxrKmQlD4CT1ww5EVMkbhlP1wYW1AxI6PbyV2dFv6gVOe0XDDaQ/640?wx_fmt=png

lsblk查看,sdc己经没有分区了。

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JJ1mNU3gt6yxf3fiaNDrx8CTvQicAB3n2PGAvSR4h1EoEIePORuY8fibdw/640?wx_fmt=png

下面尝试开始恢复,首先还是通过vg备份信息/etc/lvm/backup/datavg查看丢失PV的UUID。然后重建/dev/sdc分区。恢复和上一个常见一样,我就直接上图了

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JGjGNQfAmTYkruWZRLQUuxdQal994xHO3wf0ghFk6NhDx1mwAib7XFzw/640?wx_fmt=png

这里要多加个-ff参数,否则不成功。

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JVNqDpob0I9Z3YjKibH7XxOibEAhMW8cftArnpme3j3yZ7pc0YZn328UQ/640?wx_fmt=png

恢复vg

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JqsicNnfjo6rnQ6oiceLS59vF9yWFiaDDCSeTlicbttIetsDLEoyspiaH69Q/640?wx_fmt=png

启动数据库,查询表

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JdDD4J4opdV48icf7ibrsSLX1a5YROVibH8axbasRnwhY7psbBGrfjWL0w/640?wx_fmt=png

查看数据库启动,正常无异常报错抛出

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JI8icibwPMicNlnzhkPEP0reiaMHGqbnZXoyiaLpN9XwWnMYzGOPqBQHRh8Q/640?wx_fmt=png

至此,丢失分区表恢复VG成功!!,也就是说只是丢失分区表,还可以成功恢复。

4、情景3

情景3:把第2个pv进行破坏操作,看看能不能恢复

接下来的操作有风险,不要在生产里随意尝试!!!

dd if=/dev/zero of=/dev/sdc bs=1024k count=200

然后去数据库里建个表,再查看下日志有没有啥异常

https://mmbiz.qpic.cn/sz_mmbiz_jpg/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JqYRpTNdOAZdLjOpltziajAOYQdwhXbFGVP03KM9hwxEhp0eDV6gLyVg/640?wx_fmt=jpeg

尝试创建表、切换日志,出发检查点

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JNWQ0VDNra8snXH8EWSZbNP0DkCnlnacuffib8CrsYIXKU9esLfQhCQg/640?wx_fmt=png

再查看日志,没啥报错么。https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JN5pvtMrhWWtJBqxrnrvQepFc4Xr6ib8FIGm9y8iax1o4CluD0nKbn68g/640?wx_fmt=pnghttps://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JN5pvtMrhWWtJBqxrnrvQepFc4Xr6ib8FIGm9y8iax1o4CluD0nKbn68g/640?wx_fmt=pnghttps://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JN5pvtMrhWWtJBqxrnrvQepFc4Xr6ib8FIGm9y8iax1o4CluD0nKbn68g/640?wx_fmt=png(这里是因为linux的读写机制,还没有报错)

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JJnUuaibC2mTQiaNCicLLQ9l9qGJTy4KEDeibqpvzibV11aK9m7eoZsqfUicQ/640?wx_fmt=png

重启下机器再来。不用说也知道lv又丢了,vg设备也没有了
对Sdc进行一下分区

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JiaqdmqianmnPIB4R0oLCSIteStoCajeGxO6ibHhicsQvibJZcuHDIPpicyVw/640?wx_fmt=png

恢复pv/vg

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JC9qKTfpvxibSL7WmFhEtKCIBYguibCEHzR6xrQMSveamiaRwDFyjccUCA/640?wx_fmt=png

挂载文件系统,打开数据库。玩完了,数据库文件损坏

https://mmbiz.qpic.cn/sz_mmbiz_png/HwVZ7TuXb4ibPZ1eXicTIPN9pWpurhqW6JaeGNSg7QT1I41IicGjgdx3Krfq0aAHiaQUMuibXGSIY1ofic4OAdWBbsQg/640?wx_fmt=png

这种情况就无法恢复了!!

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
————————————————————————————


最后修改时间:2023-12-10 15:28:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论