Editar: uma pergunta de acompanhamento: Restaurar mongoDB por --repair e WiredTiger .
Meu desenvolvedor cometeu um grande erro e não conseguimos encontrar nosso banco de dados Mongo em nenhum lugar do servidor.
Ele entrou no servidor e salvou o seguinte shell em ~/crontab/mongod_back.sh
:
#!/bin/sh
DUMP=mongodump
OUT_DIR=/data/backup/mongod/tmp // 备份文件临时目录
TAR_DIR=/data/backup/mongod // 备份文件正式目录
DATE=`date +%Y_%m_%d_%H_%M_%S` // 备份文件将以备份对间保存
DB_USER=Guitang // 数库操作员
DB_PASS=qq■■■■■■■■■■■■■■■■■■■■■ // 数掘库操作员密码
DAYS=14 // 保留最新14天的份
TARBAK="mongod_bak_$DATE.tar.gz" // 备份文件命名格式
cd $OUT_DIR // 创建文件夹
rm -rf $OUT_DIR/* // 清空临时目录
mkdir -p $OUT_DIR/$DATE // 创建本次备份文件夹
$DUMP -d wecard -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE // 执行备份命令
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE // 将份文件打包放入正式
find $TAR_DIR/ -mtime +$DAYS -delete // 除14天前的旧备
E então ele o executou e produziu permission denied
mensagens, então ele pressionou Ctrl+C
. O servidor foi desligado automaticamente. Ele tentou reiniciá-lo, mas recebeu um erro do grub:
Ele entrou em contato com o AliCloud, o engenheiro conectou o disco a outro servidor em funcionamento para que pudesse verificar o disco. Parece que algumas pastas sumiram, inclusive /data/
onde está o mongodb!
- Não entendemos como o script pode destruir o disco incluindo
/data/
; - E, claro, é possível obter as
/data/
costas?
PS: Ele não tirou instantâneo do disco antes.
PS2: Como as pessoas mencionam muito "backups", temos muitos usuários e dados importantes chegando nesses 2 dias, o objetivo dessa ação era fazer backup deles (pela primeira vez), depois eles foram totalmente excluídos.
Bastante fácil. A
//
sequência não é um comentário no bash (#
é).A declaração
OUT_DIR=x // text
não teve nenhum efeito* exceto uma mensagem de erro enigmática.Assim, sendo o OUT_DIR uma string vazia, um dos comandos eventualmente executados foi
rm -rf /*
. Alguns diretórios colocados diretamente abaixo/
não foram removidos devido ao usuário não ter permissões, mas parece que alguns diretórios vitais foram removidos. Você precisa restaurar do backup.* A forma peculiar da instrução bash
A=b c d e f
é aproximadamente semelhante a:Um exemplo comum:
E a linha problemática do script era assim:
1) Ele erroneamente assumiu que
//
era um comentário bash. Não é, apenas#
é.O shell interpretou
// text
como um comando normal e não encontrou um binário chamado//
, e não fez nada.No bash, quando você tem uma atribuição de variável (
OUT_DIR=/data/backup/mongod/tmp
) precedendo diretamente um comando (// text
), ele apenas define a variável durante a execução do comando. Portanto, ele é desabilitadoOUT_DIR
imediatamente e, quando a linha rm é alcançada,OUT_DIR
agora é desabilitada erm -rf /
agora é chamada, excluindo tudo o que você tem permissão para excluir.2) A solução é a mesma para todos os
rm -rf /
casos: restaurar a partir do backup. Não há outra solução porque você não tem acesso físico ao disco rígido.1) Comentários Bash começam com #. Meus pêsames. 2) A restauração do backup é a única maneira de prosseguir aqui, infelizmente.