我使用的是 CentOS 5.2,在启动我的两个数据库服务器时遇到了问题。我们的 IT 部门在周末进行了 SAN 升级,现在我无法启动 - 他们说升级进行得很顺利,但显然出了什么问题。我收到的启动时错误是这样的;
fsck.ext3: No such file or directory while trying to open /dev/VolGroup01/db
我有一位外部顾问正在研究这个问题,并说这是一个无法修复的超级块问题,但认为这些问题是可以恢复的(至少根据这一点);http://www.cyberciti.biz/faq/recover-bad-superblock-from-corrupted-partition/)
有人有什么建议或指点吗?另外,为了将来参考,除了我的数据之外,我还应该备份什么?
此时此刻,极度绝望,愿意为恢复付出代价。
答案1
我敢打赌,您知道 SAN 已将物理磁盘的开头移位了几个字节。我以前见过这种情况。从发生这种情况的磁盘中取出文件非常困难,但这是可能的。
如果您运行“fdisk -l”,您是否会收到有关设备上的起始磁柱未匹配的消息?它通常在每个分区声明周围的括号中。
您是否设法找到了 LVM 组但找不到磁盘本身?LVM 设备是否由多个 SAN 磁盘组成,但只有一个受到影响?
以下脚本将尝试在 /dev/sdb 上搜索您的 lvm 分区的起始位置的正确偏移量。不保证它会找到任何东西。如果找到了,您可能可以很好地恢复数据。
#!/usr/bin/python
import sys
def BoyerMooreHorspool(pattern, text):
m = len(pattern)
n = len(text)
if m > n: return -1
skip = []
for k in range(256): skip.append(m)
for k in range(m - 1): skip[ord(pattern[k])] = m - k - 1
skip = tuple(skip)
k = m - 1
while k < n:
j = m - 1; i = k
while j >= 0 and text[i] == pattern[j]:
j -= 1; i -= 1
if j == -1: return i + 1
k += skip[ord(text[k])]
return -1
if __name__ == '__main__':
giveup = 1024*1024*1024*2
lba_offset = 0
text = ""
disk = open('/dev/sdb', 'r')
while disk.tell() < giveup:
#print "Checking: %f" % (lba_offset/(1024*1024))
text = disk.read(1048576)
s = BoyerMooreHorspool("\x00\x00\x00LVM2", text)
if s > -1:
print "Try offset: %d" % ((lba_offset+int(s))-533)
sys.exit(0)
else:
lba_offset += 1048576
print "Unable to find LVM position!"
你能返回你得到的输出吗?
答案2
一切都恢复正常并修复了。原来有人错误地将 LUN 安装到 Windows 机器上,然后移除它们并将其放到 CentOS VM 上,却没有想到这会引起问题。每个分区都标记为“微软保留分区” - 使用缓存的 LVM 设置将其恢复。
答案3
启动到单用户模式并注释掉 /etc/fstab 中挂载该文件系统的行。这样您就可以启动并查看该文件系统无法挂载的原因。