Eu tenho um backup mysqldump do meu banco de dados mysql que consiste em todas as nossas tabelas, que são cerca de 440 megas. Eu quero restaurar o conteúdo de apenas uma das tabelas do mysqldump. Isso é possível? Teoricamente, eu poderia apenas recortar a seção que reconstrói a tabela que eu quero, mas nem sei como editar efetivamente um documento de texto desse tamanho.
194
Respostas:
Você pode tentar usar o sed para extrair apenas a tabela que deseja.
Digamos que o nome da sua tabela seja
mytable
e o arquivo mysql.dump seja o arquivo que contém seu enorme dump:Isso copiará no arquivo o
mytable.dump
que está localizado entreCREATE TABLE mytable
e o próximoCREATE TABLE
correspondente à próxima tabela.Você pode ajustar o arquivo
mytable.dump
que contém a estrutura da tabelamytable
e os dados (uma lista deINSERT
).fonte
Table structure for table
comentário, em vez de corresponder por CREATE TABLE. Isso garantirá que a próxima tabela não seja eliminada se alguém esquecer de remover sua instrução DROP TABLE e permitirá o encaminhamento para a restauração da tabela de comando único (gzip | sed | mysql). No entanto, esta solução depende da sintaxe do comentário do mysqldump (não sei como é padrão).Eu usei uma versão modificada do comando sed do uloBasEI. Ele inclui o comando DROP anterior e lê até o mysql terminar de descarregar dados para sua tabela (UNLOCK). Trabalhou para mim (re) importar wp_users para um monte de sites do Wordpress.
fonte
`mytable`
para evitar tabelas correspondentesmytable2
e assim por diante, como foi no meu caso.sed
não deve interferir com a codificação ...DROP TABLE
(meu dump do MySQL não tinha isso), pode querer usar:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Isso faz uso dos comentários da tabela fornecidos antes de cada tabela em um dump do MySQl e garante que linhas como/*!40101 SET @saved_cs_client = @@character_set_client */;
sejam incluídas.Isso pode ser feito mais facilmente? Foi assim que eu fiz:
Crie um banco de dados temporário (por exemplo, restauração):
Restaure o despejo completo no banco de dados temporário:
Despejar a tabela que você deseja recuperar:
Importe a tabela em outro banco de dados:
fonte
Uma solução simples seria simplesmente criar um despejo da tabela que você deseja restaurar separadamente. Você pode usar o comando mysqldump para fazer isso com a seguinte sintaxe:
Em seguida, importe-o normalmente e ele importará apenas a tabela despejada.
fonte
De uma forma ou de outra, qualquer processo que faça isso terá que percorrer todo o texto do despejo e analisá-lo de alguma forma. Eu apenas saudaria por
e canalize a saída no mysql. Dê uma olhada na primeira tabela do despejo antes, para garantir que você esteja recebendo o INSERT da maneira certa.
Edit: OK, conseguiu a formatação correta neste momento.
fonte
Você deve tentar o comando @bryn, mas com o delimitador, caso contrário você também extrairá as tabelas com prefixo ou sufixo, é o que eu costumo fazer:
Também para fins de teste, convém alterar o nome da tabela antes de importar:
Para importar, você pode usar o comando mysql:
fonte
Cópia de segurança
Restaurar tabela única
fonte
Uma maneira possível de lidar com isso é restaurar para um banco de dados temporário e despejar apenas essa tabela do banco de dados temporário. Em seguida, use o novo script.
fonte
Essa ferramenta pode ser o que você deseja: tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
Por exemplo, restaure uma tabela do arquivo de despejo de banco de dados:
fonte
Esta é uma solução melhor do que algumas das outras acima, porque nem todos os dumps SQL contêm uma
DROP TABLE
instrução. Este vai funcionar todos os tipos de lixões.fonte
Isso também pode ajudar.
fonte
A tabela deve apresentar a mesma estrutura no dump e no banco de dados.
ou
fonte
A maioria dos editores de texto modernos deve poder manipular um arquivo de texto desse tamanho, se o seu sistema estiver em conformidade.
Enfim, eu tive que fazer isso uma vez muito rapidamente e não tive tempo para encontrar nenhuma ferramenta. Configurei uma nova instância do MySQL, importei todo o backup e cuspi apenas a tabela que eu queria.
Então eu importei essa tabela para o banco de dados principal.
Foi tedioso, mas bastante fácil. Boa sorte.
fonte
Você pode usar o editor vi. Tipo:
para abrir o dump inteiro
mysql.dump
e um novo arquivomytable.dump
. Encontre a inserção apropriada na linha pressionando/
e digite uma frase, por exemplo: "insira na` mytable` "e copie essa linha usandoyy
. Alterne para o próximo arquivoctrl+w
edown arrow key
cole a linha copiada compp
. Por fim, salve o novo arquivo digitando:wq
e vi o editor por:q
.Note que se você jogou os dados usando várias inserções você pode copiar (puxão), todos eles de uma vez usando
Nyy
em queN
é o número de linhas a serem copiados.Eu fiz isso com um arquivo de tamanho de 920 MB.
fonte
Obtenha um editor de texto decente como o Notepad ++ ou o Vim (se você já é proficiente). Pesquise o nome da tabela e você poderá destacar apenas os comandos CREATE, ALTER e INSERT dessa tabela. Pode ser mais fácil navegar com o teclado do que com o mouse. E gostaria de garantir que você esteja em uma máquina com bastante RAM ou RAM, para que não haja problemas ao carregar o arquivo inteiro de uma só vez. Depois de destacar e copiar as linhas necessárias, seria uma boa idéia fazer backup apenas da parte copiada em seu próprio arquivo de backup e importá-lo para o MySQL.
fonte
Os blocos do SQL são bloqueados com "Estrutura da tabela para tabela
my_table
" e "Dump de dados para tabelamy_table
".Você pode usar uma linha de comando do Windows da seguinte maneira para obter os números de linha das várias seções. Ajuste a sequência pesquisada conforme necessário.
encontre / n "para a tabela` "sql.txt
O seguinte será retornado:
---------- SQL.TXT
[4384] - Estrutura de tabela para tabela
my_table
[4500] - Dados de despejo para tabela
my_table
[4514] - Estrutura de mesa para mesa
some_other_table
... etc.
Isso te dá os números de linha que você precisa ... agora, se eu soubesse como usá-los ... investigando.
fonte
Em 2008, eu também precisava fazer isso. Eu escrevi um script Perl que fará isso, e agora é o meu método de escolha. Também resumiu como fazer isso no awk ou como restaurar em outro lugar e extrair. Recentemente, adicionei esse método sed à lista também. Você pode encontrar o script e os outros métodos aqui: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
fonte
Eu tentei algumas opções, que eram incrivelmente lentas. Isso dividiu um despejo de 360 GB em suas tabelas em alguns minutos:
Como eu divido a saída do mysqldump em arquivos menores?
fonte
As soluções 'sed' mencionadas anteriormente são boas, mas como mencionadas, não são 100% seguras
Você pode ter comandos INSERT com dados contendo: ... CREATE TABLE ... (tanto faz) ... mytable ...
ou mesmo a string exata "CREATE TABLE` mytable`; " se você estiver armazenando comandos DML, por exemplo!
(e se a tabela for grande, você não deseja verificar isso manualmente)
Gostaria de verificar a sintaxe exata da versão de despejo usada e ter uma pesquisa de padrões mais restritiva:
Evite ". *" E use "^" para garantir que começamos no início da linha. E eu preferiria pegar o 'DROP' inicial
Em suma, isso funciona melhor para mim:
fonte