/var/lib/mysql no /var/lost+found

1. /var/lib/mysql no /var/lost+found

Access Denid
accessdenid

(usa Debian)

Enviado em 30/07/2013 - 22:15h

Boa noite a todos, estou com um problema nada animador ...
Tenho debian em um servidor e mysql rodando em raid 1.
Um dos discos torrou e o outro estava com problemas ao subir ... infelizmente o suporte usou o fsck para reparar e todo o diretorio /var/lib/mysql foi parar no /var/lost+found .
Somente um database de mais de 40 ficou certo ( arquivos MYI, frm ... ) dentro de uma pasta que o fsck criou ( 2121212121 ) o resto dos arquivos virou arquivos com nome "1212121212 ... ".

Alguem já conseguiu reverter isso? Resgatar os arquivos ... tenho o backup de 30 % do banco, e a estrutura 100% ... alguem tem uma idéia ???


  


2. Re: /var/lib/mysql no /var/lost+found

3. Re: /var/lib/mysql no /var/lost+found

Access Denid
accessdenid

(usa Debian)

Enviado em 31/07/2013 - 11:25h

Nada, ja tinha visto esse método, assim como havia dito meus arquivos foram convertidos para nomes numéricos dados pelo fsck, ou seja, meus arquivos que representam as tabelas. Se fosse só as pastas ( Databases ) trocadas pelo nome e o restante abaixo dela, todos os nomes dos arquivos tivessem ficados limpos como no link seria moleza.

Agradeço pela atenção amigão.


4. Re: /var/lib/mysql no /var/lost+found

Joca (Altemir Braz Dantas Junior)
jocajuni

(usa Debian)

Enviado em 31/07/2013 - 16:08h

accessdenid escreveu:

Boa noite a todos, estou com um problema nada animador ...
Tenho debian em um servidor e mysql rodando em raid 1.
Um dos discos torrou e o outro estava com problemas ao subir ... infelizmente o suporte usou o fsck para reparar e todo o diretorio /var/lib/mysql foi parar no /var/lost+found .
Somente um database de mais de 40 ficou certo ( arquivos MYI, frm ... ) dentro de uma pasta que o fsck criou ( 2121212121 ) o resto dos arquivos virou arquivos com nome "1212121212 ... ".

Alguem já conseguiu reverter isso? Resgatar os arquivos ... tenho o backup de 30 % do banco, e a estrutura 100% ... alguem tem uma idéia ???




Primeiramente eu faria uma copia de backup


entraria nesta pasta , primeiramente eu vou descobrir os arquivos que sao os indexes = MYI

# cp /var/lost+found/2121212121 /var/lost+found/meu_teste -Rf
# cd /var/lost+found/meu_teste

# for i in $(ls); do cp $i $i.MYI; touch $i.MYD $i.frm; done
# myisamchk *.MYI

os que responder

"Checking MyISAM file: xxxxxxxxxxxxxxxx.MYI
Data records: 0 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links"

vc ja sabe que esse é os *.MYI
copie eles e guarde em um outro lugar

os que responder myisamchk: error: '1.MYI' is not a MyISAM-table
vc sabe que esses sao os .frm ou .MYD

# rm /var/lost+found/meu_teste/*.MYD
# rm /var/lost+found/meu_teste/*.frm

copie os MYI que sao Indexes e Delete os arquivos que corresponde o mesmo
exemplo e delete os MYI que nao sao indexes

EXEMPLO

"Checking MyISAM file: 1.MYI
Data records: 0 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links"

"myisamchk: error: '2.MYD' is not a MyISAM-table"

"myisamchk: error: '3.MYD' is not a MyISAM-table"


# mkdir /var/lost+found/meu_teste_index/
# mv 1.MYI /var/lost+found/meu_teste_index/
# rm 1


Agora tendo so no diretorio os arquivos nao identificado (MYD ou frm) sem a extensao

faca o seguinte para descobrir se o arquivo e do tipo frm
crie em um diretorio do mysql um pasta que seria o db exemplo

#cp /var/lost+found/meu_teste/ /var/lib/mysql/ -Rf
# for i in $(ls); do cp $i $i.frm; touch $i.MYD $i.MYI; done
# chown mysql.mysql /var/lib/mysql/meu_teste -Rf

e execute se o root tiver senha
# mysqlcheck --databases meu_teste -uroot -p --auto-repair
se nao tiver
# mysqlcheck --databases meu_teste -uroot --auto-repair

os que responder

Incorrect information in file './meuteste/xxxxxxxxxxxx.frm'
serao os seu MYD

e os que responder so "Incorrect file format" serao os seus frm

portanto vc consegui determinar que sao os MYI,MYD e frm.

agora e so criar um script que pega um de cada -> coloque o mesmo nome para os tres e testa com o comando sql se responder a sql - bingo vc achou a tabela ( select * from meuteste.novo_nome )

[]s
Jocajuni


5. Re: /var/lib/mysql no /var/lost+found

Access Denid
accessdenid

(usa Debian)

Enviado em 31/07/2013 - 22:07h

Em primeiro lugar digo que fiquei lisongeado com a atenção.
Estava tentando de uma forma um pouco diferente.
Dentro do lost+found tenho mais de 15 mil arquivos ... pois é ... nem me fale.
Com um simples ls -la já caiu para 3 mil arquivos do usuário e grupo mysql, já fiquei mais animado ...
Peguei o comando "ls -la" e joguei em planilha csv ...
Usei também o comando "file *" onde me retornou as características do arquivo e joguei na mesma planilha csv, colunas subsequentes. Joguei em um banco local e fiz vários filtros.
Com base nessa informação deduzi que os arquivos MYD, MYI e frm são criados quase no mesmo instante. O que me ajuda bastante pois o fsck move os arquivos mas não altera as propriedades.
Como não tenho o shell tão apurado quanto o nobre conhecedor estou fazendo um script em php para renomear os arquivos ( mesmo nome para MYD, MYI e frm ) com base na data de criação e com base no número que o próprio fsck deu como nome para as pastas, afinal ele é incremental e deve fazer varredura conforme vai progredindo no disco, fazendo com que arquivos dentro de mesmas pastas ( Database ) tenham nomes próximos.

Bom, pelo volume de tabelas e DataBases fica inviável fazer na mão ...
Fiz duas tabelas na mão e uma funcionou, pude ver os dados e ficou redonda, a outra já deu erro ...

@Debug:/var/lib/mysql/test# mysqlcheck --databases test -u root -p --auto-repair
Enter password:
test.tabela OK
test.tabela1
Error : Incorrect key file for table 'tabela1'; try to repair it
error : Corrupt

Repairing tables
test.tabela1
Error : Incorrect key file for table 'tabela1'; try to repair it
error : Corrupt

Mas uma vez muito obrigado pela atenção amigão.




6. Re: /var/lib/mysql no /var/lost+found

Access Denid
accessdenid

(usa Debian)

Enviado em 31/07/2013 - 22:08h

Assim que tiver novidades vou postar ...


7. Re: /var/lib/mysql no /var/lost+found

Joca (Altemir Braz Dantas Junior)
jocajuni

(usa Debian)

Enviado em 01/08/2013 - 10:42h

Se os arquivos tem a mesma data fica mais facil
cria um shell script chamado renomeia.sh
# vi renomeia.sh

contento o conteudo abaixo


#!/bin/bash

N=0;
DIR="/var/lib/mysql/teste"
DIRNEW="/var/lib/mysql/teste_new"
TABELA=1;


# entra no diretorio
cd $DIR
#Pega os arquivos ordenando pela data mais novas
for ARQ in $(ls -t)
do
N=$(($N+1))
cp $ARQ ${DIRNEW}/tabela_$comunidadePost.${N}
if [ $N -eq 3 ] then
N=0
TABELA=$(($TABELA+1))
fi
done
###### FIM DO SCRIPT

explicando o script acima
ele vai listar os arquivos ordenado pela data mais nova e vai coloca-lo na variavae ARQ
vou renomear ele para num loop e acada 3 ele incrementa 1 no nome
exemplo de um loop de 6 arquivos

tabela_1.1
tabela_1.2
tabela_1.3
tabela_2.1
tabela_2.2
tabela_2.3

agora vc tem as possiveis tabelas agora eh so descobrir quem é o frm,MYD e MYI da tabela_1 e assim por diante


deixar ele como executavel
# chmod 700 renomeia.sh
executar ele
# ./renomeia.sh



[]s
Jocajuni







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts