重要声明:
本文档所有思路来自于誉天教育,由本人(木二)在实验环境验证通过;
您应当通过誉天邹老师或本人提供的其他授权通道下载、获取本文档,且仅能用于自身的合法合规的业务活动;
本文档的内容仅供学习交流,未经以上任何一方事先书面同意,您不得向任何第三方披露本手册内容或提供给任何第三方使用;
未经以上任何一方事事先书面许可,任何单位、公司或个人不得基于商业目的擅自摘抄、翻译、复制本文档内容的部分或全部,不得基于商业目的以任何方式或途径进行传播和宣传。
由于产品版本升级、调整或其他原因,本文档内容有可能变更。以上双方保留在没有任何通知或者提示下对本文档的内容进行修改的权利(如在CentOS7上的操作变动)。
本文档仅针对特定局点或者项目,特定环境(如以上为CentOS6.8验证),不作为通用的文档或者手册进行指导,不具备流通复制的可行性。若用户自行复用,产生的任何后果(包括经济损失,二次故障,人身安全,如挨揍被开除),誉天及本人不负有任何责任。
如若发现本文档存在任何错误,请与誉天教育或本人取得直接联系。
 

一 场景介绍

Linux环境中,由于误操作将/已删除,需要结合其他主机进行修复:
节点
IP
数据所在目录
备注
node1
172.24.8.51
/mysqldb
模拟故障机
node2
172.24.8.52
——
应用数据恢复-集群节点2
/dev/sdb1	/mysqldb	ext4	defaults	0 0
提示:本环境为模拟环境,应用数据保存在独立的分区,生产环境结合实践谨慎操作;
本操作不保证绝对恢复,仅处于思路提供进行模拟;
若node2和node1非集群主机(即/etc等目录也不一致),可参考若《004.extundelete恢复文件》将相关非一致性目录恢复;
整个全过程拆分为应用数据恢复+系统修复,必须先恢复应用数据,防止解压系统相关文件的时候覆盖掉应用数据。

二 模拟场景

2.1 建立模拟环境

 [root@master ~]# mkdir /mysqldb
[root@master ~]# mount /dev/sdb1 /mysqldb
[root@master ~]# mkdir /mysqldb/test
[root@master ~]# mkdir /mysqldb/prod
[root@master ~]# echo 'This is file01!' >>/mysqldb/file01
[root@master ~]# echo 'This is file02!' >>/mysqldb/file02
[root@master ~]# echo 'This is file03' >>/mysqldb/test/file03
[root@master ~]# echo 'This is file04' >>/mysqldb/prod/file04
[root@master ~]# md5sum /mysqldb/file01
[root@master ~]# md5sum /mysqldb/file02
[root@master ~]# md5sum /mysqldb/test/file03
[root@master ~]# md5sum /mysqldb/prod/file04

2.2 执行删除操作

 [root@node1 ~]# rm -rf /*			#模拟删根

三 应用数据恢复

3.1 卸载应用数据所在盘符

将应用数据目录/mysqldb所在磁盘采用物理形式从node1卸载挂载至node2节点。

3.2 node2安装相应恢复软件

参考《004.extundelete恢复文件》在node2节点安装extundelete软件。

3.2 查询可恢复数据

 [root@backup /]# extundelete /dev/sdb1 --inode 2
提示:建议在其他机器将需要恢复的数据所在硬盘进行挂载,或使用U盘进入系统后,将master中/data所在设备/dev/sdb1挂载为只读。

3.3 执行恢复

 [root@backup ~]# extundelete /dev/sdb1 --restore-all			#恢复所有文件
提示:--restore-file和--restore-directory后面指定的是所需恢复文件或目录为相对路径,即相对于原来文件的存储路径而言的,如上所示原来文件的存储路径是/data/file01,则参数后面直接指定file01文件即可,即相对于/data根目录下的file01文件。若如果原来文件的存储路径是/data/test/mytest.txt,那么在参数后面通过“test/mytest.txt”指定即可。若如果原来目录的存储路径是/data/oracle,则参数后面直接指定/oracle目录即可。
在文件恢复成功后,extundelete命令默认会在执行命令的当前目录下创建一个RECOVERED_FILES目录,此目录用于存放恢复出来的文件,所以执行extundelete命令的当前目录必须是可写的。
 [root@node2 ~]# ll RECOVERED_FILES/
 [root@node2 ~]# md5sum RECOVERED_FILES/file01
[root@node2 ~]# md5sum RECOVERED_FILES/file02
[root@node2 ~]# md5sum RECOVERED_FILES/test/file03
[root@node2 ~]# md5sum RECOVERED_FILES/prod/file04
 
提示:根据之前的md5值对数据完整性进行验证。

3.4 还原数据

 [root@node2 ~]# md5sum RECOVERED_FILES/file01
[root@node2 ~]# md5sum RECOVERED_FILES/file02
[root@node2 ~]# md5sum RECOVERED_FILES/test/file03
[root@node2 ~]# md5sum RECOVERED_FILES/prod/file04
提示:还原之后可将sdb磁盘物理卸载,避免node2写入数据至该目录;
建议物理卸载后在node1系统没有修复之前不要插回node1节点。

四 系统修复

4.1 进入救援模式

关闭node1,通过挂载系统相应的ISO镜像,进入救援模式。

4.2 将相应目录进行备份

 [root@node2 tmp]# tar -zcvf /tmp/etc.tar.gz /etc/
[root@node2 tmp]# tar -zcvf /tmp/bin.tar.gz /bin/
[root@node2 tmp]# tar -zcvf /tmp/lib64.tar.gz /lib64/
[root@node2 tmp]# tar -zcvf /tmp/lib.tar.gz /lib/
提示:将node2中/etc、/bin/、/lib64/、/lib/使用tar进行打包,以上为系统修复必须进行备份的目录;
若有其他目录需要恢复参考此操作即可,也可先修复系统,将系统重新拉起之后进入系统再使用其他方式(如extundelete或scp)将非一致性文件修复。

4.3 node1进入支持网络的救援模式

选择语言
选择键盘
配置网络,yes。
选择能和node2通信的网卡并配置能和node1通信的IP。
Manual configuration:手动静态配置
IPV4 Address:172.24.5.51/24
关闭IPV6
救援模式会将node1本身根目录在救援环境下挂载至/mnt/sysimage。
提示无任何Linux分区,可进入救援模式的shell环境。
进入救援模式的shell环境。
验证网络情况
验证救援模式下的node1和正常的node2网络是否正常。

4.4 查看并激活磁盘分区

查看根目录所在磁盘分区信息,如图所示分区为LVM分区。
确认node1磁盘根分区所在lvm分区,如图所示为/dev/VolGroup/LogVo101
激活根分区所在的该LVM逻辑卷,并挂载至相应目录
 # lvchange -a y /dev/VolGroup/LogVol01			#激活lvm分区
# mkdir /delroot #创建用于挂载node1根分区的目录
# mount /dev/VolGroup/LogVol01 /delroot
提示:挂载之后,在救援模式中的/delroot目录,即为原node1的根目录。

4.5 恢复相应数据

 # scp root@172.24.8.52:/tmp/*.gz /delroot/tmp
通过scp命令,将node2相应的备份文件复制至node1原根新挂载的目录/delroot/tmp目录。
 # tar -zxvf bin.tar.gz -C /delroot/
# tar -zxvf etc.tar.gz -C /delroot/
# tar -zxvf lib64.tar.gz -C /delroot/
# tar -zxvf lib.tar.gz -C /delroot/
将所有node2备份的gz包,在node1救援模式下全部解压至node1原根新挂载的根目录/delroot。

4.6 改变根目录位置

重启系统,参考5.3步骤再次进入带网络(即配置IP)的救援模式。
 # exit
当再次进入救援模式的时候,已提示可以使用chroot切换跟目录。
切换根目录。

4.7 修复引导程序

 # grub-install /dev/sda

4.8 修复内核

 # mkdir /media
# mount /dev/cdrom /media/
# cd /media/Packages/
# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm --force
提示:若出现以上错误,可将所需要包全部进行安装,如下所示:
若需要修复的node1内核版本和所挂载的光盘中的内核版本不一致,可从node2下载匹配node1相应的内核版本所有相关rpm包scp至node1,再进行安装。

4.9 重启并验证

若出现以下界面,无法正常进入系统,可手动尝试加载grub.conf并启动。
手动执行以下加载grub命令
 root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/VolGroup/LogVol01 selinux=0
initrd /initramfs-2.6.32-642.el6.x86_64.img
进入系统

4.10 修复网络

 # rm -rf /etc/udev/rules.d/70-persistent-*	#删除网卡rule
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 #修复node1IP
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.24.8.51 #将IP配置为node1正确地址
NETMASK=255.255.255.0
GATEWAY=172.24.8.2
DNS1=223.5.5.5
# vi /etc/sysconfig/network
HOSTNAME=node1 #将主机名修改为node正确主机名
提示:由于node1中的所有配置是由node2恢复,因此对于特定配置需要逐步手动修改,以上为网卡配置修复示例;
实际生产环境所有非一致性配置请根据实际情况进行修改。

4.11 修复引导grub配置文件

 [root@node2 ~]# scp -p /boot/grub/grub.conf root@172.24.8.51:/boot/grub/
提示:若node2和node1不一致(如内核相关不一致),可参考node2,手动写node1的grub.conf;
若node2和node1一致(通常指集群环境),可直接从node2的grub.conf复制至node1即可。
 

五 应用数据恢复至node1

5.1 加载磁盘

将步骤三所恢复的磁盘物理加载至已恢复系统的node1节点。

5.2 挂载分区

 [root@node1 ~]# fdisk -l /dev/sdb		#确认加载是否正常
[root@node1 ~]# mount /dev/sdb1 /mysqldb/ #挂载目录
[root@node1 ~]# ll /mysqldb/ #查看数据

5.3 确认验证

 [root@node1 ~]# md5sum /mysqldb/file01
[root@node1 ~]# md5sum /mysqldb/file02
[root@node1 ~]# md5sum /mysqldb/test/file03
[root@node1 ~]# md5sum /mysqldb/prod/file04

015.Linux系统删根数据恢复的更多相关文章

  1. Linux 系统其他重要文件

    其他重要目录 /usr /usr/local 通过源码安装,没有特别指定,就在这个文件下用户自编译软件存放地方 /usr/src 源代码程序 + 内核源代码程序存放目录 /var /var/log/m ...

  2. Linux 系统的目录结构_【all】

    Linux系统的目录结构 /:最大根目录,存放系统程序 /etc: 加载配置文件好服务启动命令,系统配置文件 /etc/exports /etc/hosts /bin:binaries 存放命令 /s ...

  3. 《手把手教你构建自己的 Linux 系统》学习笔记(10)

    目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...

  4. Linux系统使用lvm扩展根分区

    Linux系统使用lvm扩展根分区 背景:买的云主机虚拟机封装镜像是40G的系统盘,后期适用不规范或者其他需求需要扩展系统盘,而非挂载在一个盘至新建目录. 1.原本目录磁盘等信息: 2.使用vgdis ...

  5. Linux 系统常用管理命令(精简笔记)

    Linux是一套免费使用和自由传播的类Unix操作系统,下面的笔记是我从鸟菜中摘抄出来的重要命令,并进行了一定的排版,摒弃了一些用不到的乱七八糟的命令,目的是在生产环境中能够快速的定位并查询需要命令的 ...

  6. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  7. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  8. 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解

    本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...

  9. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

随机推荐

  1. js获取当前日期时间“yyyy-MM-dd HH:MM:SS”

    获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function getNowFormatDat ...

  2. javascript随笔和常见的知识点

    1.js中循环中用 return只能停止循环,不能停止到函数的定义部分.所以下面的返回值为1 return 100没有意义,只起到终止循环的目的 function bb() { var sum = 0 ...

  3. 【CTF REVERSE】ctf02-查找字符串

    1.前言 公司大拿给写的一个CTF逆向程序,提升我们组内人员的水平. 基于对话框MFC框架开发,使用EDIT控制特性隐藏Flag,可借助spy4win之类窗体工具找出Flag. 程序加UPX壳,已对壳 ...

  4. centos7使用haproxy1.7.5实现反向代理负载均衡实战

    使用haproxy实现反向代理负载均衡实战环境准备:两台虚拟机 # yum install -y gcc glibc gcc-c++ make screen tree lrzsz node1源码编译安 ...

  5. 利用navcat为mysql数据库单独的表赋权限及表结构同步

    为mysql数据库单独的表赋权限 场景:考勤系统需要拿OA数据库td_oa中的flow_run和flow_run_data表中的数据做考勤计算 考勤系统只需要读取这两张表的数据,所以只需要开通一个单独 ...

  6. Ex 3_25 图中每个顶点有一个相关价格..._十一次作业

    (a)首先对有向无环图进行拓扑排序,再按拓扑排序的逆序依次计算每个顶点的cost值,每个顶点的cost值为自身的price值与相邻顶点间的cost值得最小值 (b)求出图中的每一个强连通分量,并把所有 ...

  7. K最近邻kNN-学习笔记

    # -*- coding: utf-8 -*- """ Created on Thu Jan 24 09:34:32 2019 1. 翼尾花数据 2. 用 KNeighb ...

  8. Python-浮动 清浮动

    # 浮动布局 ## 一.display总结 ```css/* inline *//*1.同行显示, 就相当于纯文本, 当一行显示不下, 如就是一个字显示不下,那么显示不下的那一个字就会自动换行,和纯文 ...

  9. 20个实用的webApp前端开发技巧

    自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备). 开发者们都知道在高端智能手机 ...

  10. VIM 报错

    syntax error: unexpected end of file if 没配对 在最后加 fi 试试 环境变量用不了 export PATH=/usr/bin:/usr/sbin:/bin:/ ...