Pergunta

Eu tenho um backup mysqldump de meu banco de dados mysql que consiste em todas as nossas mesas que é cerca de 440 megas. Quero restaurar o conteúdo de apenas uma das mesas formam o mysqldump. Isso é possível? Teoricamente, eu poderia simplesmente cortar a seção que recria a mesa que eu quero, mas eu nem sei como editar efetivamente um documento de texto que tamanho.

Foi útil?

Solução

Você pode tentar usar sed para extrair apenas a tabela que você deseja.

Vamos dizer que o nome da sua tabela é mytable eo mysql.dump arquivo é o arquivo que contém o seu enorme despejo:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

Isso irá copiar na mytable.dump arquivo que está localizado entre CREATE TABLE mytable ea próxima CREATE TABLE correspondente para a próxima mesa.

Você pode então ajustar a mytable.dump arquivo que contém a estrutura do mytable mesa, e os dados (a lista de INSERT).

Outras dicas

Eu usei uma versão modificada do comando sed de uloBasEI. Ele inclui o comando DROP anterior, e lê até mysql é feito despejo de dados para a sua mesa (desbloquear). Trabalhou para mim (re) importação wp_users para um monte de sites Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

Isto pode ser feito com mais facilidade? Isto é como eu fiz isso:

Criar um banco de dados temporário (por exemplo, restaurar):

mysqladmin u root -p criar restaurar

Restaurar o despejo completo no banco de dados temporário:

mysql u root -p restaurar

Despejar a tabela que você deseja recuperar:

mysqldump restaurar mytable> mytable.sql

Importar a tabela em outro banco de dados:

mysql -u banco de dados raiz -p

Uma solução simples seria a de simplesmente criar um despejo de apenas a tabela que você deseja restaurar separadamente. Você pode usar o comando mysqldump a fazê-lo com a seguinte sintaxe:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Em seguida, importá-lo como normal, e isso só vai importar a tabela despejado.

Uma forma ou outra, qualquer processo de fazer isso vai ter que passar por todo o texto do despejo e analisá-lo de alguma forma. Eu tinha acabado de grep para

INSERT INTO `the_table_i_want`

e canalizar a saída para mysql. Dê uma olhada na primeira mesa no despejo antes, para se certificar de que você está recebendo o caminho certo do INSERT.

Edit:. OK, tem a formatação certo desta vez

Você deve tentar comando @bryn mas com a `delimitador de outra forma você também vai extrair as tabelas ter um prefixo ou um sufixo, isso é o que eu costumo fazer:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

Também para testar propósito, você pode querer mudar o nome da tabela antes de importar:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

Para importar você pode usar o comando mysql:

mysql -u root -p'password' mydatabase < mytable_restore.sql
  1. Backup

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Restaurar mesa única

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    

Uma forma possível de lidar com isso é para restaurar a um banco de dados temporário, e despejar apenas que a tabela do banco de dados temporário. Em seguida, use o novo script.

Esta ferramenta pode ser o que você quer: tbdba-restore-mysqldump.pl

https://github.com/orczhou/ dba-ferramenta / blob / master / tbdba-restore-mysqldump.pl

por exemplo. Restaurar uma tabela de arquivo de despejo de banco de dados:

tbdba-restore-mysqldump.pl -t YourTable -s yourdb -f backup.sql

Isto pode ajudar também.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

A maioria dos editores de texto modernos deve ser capaz de lidar com um arquivo de texto que o tamanho, se o sistema é até ele.

De qualquer forma, eu tinha que fazer isso uma vez muito rapidamente e eu não tenho tempo para encontrar todas as ferramentas. Criei uma nova instância MySQL, importado todo o backup e, em seguida, cuspir apenas a tabela que eu queria.

Então eu importados que a tabela no banco de dados principal.

Foi tedioso, mas bastante fácil. Boa sorte.

Você pode usar o editor vi. Tipo:

vi -o mysql.dump mytable.dump

para abrir toda tanto mysql.dump despejo e uma nova mytable.dump arquivo. Localizar a inserção apropriada em linha pressionando / e depois digitar uma frase, por exemplo: "inserção em` mytable`", então copiar essa linha usando yy. Mudar para o próximo arquivo por ctrl+w então down arrow key, colar a linha copiada com pp. Finalmente salvar o novo arquivo por :wq digitação e bastante vi 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 que N é o número de linhas a serem copiados.

Eu tenho feito isso com um arquivo de 920 MB de tamanho.

sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Esta é uma solução melhor do que alguns dos outros acima porque nem todos os depósitos de SQL conter uma declaração DROP TABLE. Este trabalho uma vontade vai todos os tipos de lixeiras.

Tabela deve apresentar com a mesma estrutura em ambos despejo e de banco de dados.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

ou

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`

Obter um editor de texto decente como o Notepad ++ ou Vim (se você já está acostumado com isso). Procure o nome da tabela e você deve ser capaz de destacar apenas os cria, comandos ALTER, e INSERT para essa tabela. Pode ser mais fácil de navegar com o teclado em vez de um mouse. E eu gostaria de ter certeza de que você está em uma máquina com abundância ou RAM para que ele não vai ter um problema ao carregar o arquivo inteiro de uma vez. Uma vez que você destacou e copiado as linhas que você precisa, seria uma boa idéia para fazer backup apenas a parte copiada em que é arquivo de backup própria e, em seguida, importá-lo para MySQL.

Os pedaços de SQL estão bloqueados com "estrutura de tabela para my_table mesa" e "Dumping dados para my_table mesa."

Você pode usar uma linha de comando do Windows da seguinte forma para obter os números de linhas para as várias secções. Ajustar o texto a pesquisar, conforme necessário.

find / n "para a tabela`" sql.txt

A seguir irá ser devolvido:

---------- sql.txt

[4384] - estrutura de mesa para a tabela my_table

[4500] - dados de dumping para mesa my_table

[4514] - estrutura de mesa para a tabela some_other_table

... etc.

Que você recebe os números de linha que você precisa ... agora, se eu só sabia como usá-los ... investigando.

Para trás em '08 Eu tinha uma necessidade de fazer isso também. Eu escrevi um script Perl que vai fazê-lo, e agora é o meu método de escolha. Também resumidos como fazê-lo em awk ou como restaurar em outro lugar e extrato. Recentemente eu adicionei este método sed para a lista também. Você pode encontrar o roteiro e os outros métodos aqui: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

Eu tentei algumas opções, que eram incrivelmente lento. Esta divisão um despejo 360GB em suas mesas, em poucos minutos:

Como eu dividir a saída do mysqldump em arquivos menores?

As soluções 'sed' mencionado anteriormente são bons, mas como mencionado não é 100% segura

  • Você pode ter comandos INSERT com dados contendo: ... CREATE TABLE ... (seja qual for) ... mytable ...

  • ou até mesmo a string exata "CREATE TABLE` mytable`;" se você estiver armazenando comandos DML, por exemplo!

(e se a tabela é enorme você não quiser verificar isso manualmente)

Gostaria de verificar a sintaxe exata da versão despejo usado, e tem uma pesquisa mais restritiva padrão:

Evite "*" e use '^' para garantir que começar no início da linha. E eu prefiro para pegar o 'drop' inicial

Em suma, isso funciona melhor para mim:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top