Como faço para dividir um grande arquivo de backup do MySql em vários arquivos?


14

Eu tenho um arquivo SQL de backup de 250 MB, mas o limite para a nova hospedagem é de apenas 100 MB ...

Existe um programa que permite dividir um arquivo SQL em vários arquivos SQL?

Parece que as pessoas estão respondendo à pergunta errada ... então vou esclarecer mais:

Eu só tenho o arquivo de 250 MB e só tenho a nova hospedagem usando o phpMyAdmin, que atualmente não possui dados no banco de dados. Preciso pegar o arquivo de 250 MB e enviá-lo para o novo host, mas há um limite de tamanho de upload de arquivo de backup SQL de 100 MB. Eu só preciso pegar um arquivo muito grande e dividi-lo em vários arquivos, cada um contendo apenas instruções SQL válidas completas (nenhuma instrução pode ser dividida entre dois arquivos).


Tem que haver vários arquivos SQL válidos? Eu compactaria o arquivo em vários arquivos em pedaços de 100 MB e o carregaria.
N1 de

Sim, ele deve ter vários arquivos SQL válidos ... na medida em que não tenha metade de uma instrução em um arquivo e a outra metade em outro arquivo.
Brian T Hannan

Respostas:


5

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

Primeiro despeje o esquema (ele certamente se encaixa em 2Mb, não?)

mysqldump -d --all-databases

e restaure-o.

Depois, despeje apenas os dados em instruções de inserção separadas, para que você possa dividir os arquivos e restaurá-los sem precisar concatená-los no servidor remoto

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE

Bom conselho! Faz todo o sentido. Realmente bom quando existem dependências complexas entre tabelas para que uma divisão da exportação do esquema e dos dados não funcione.
Reed Richards

7

A maneira mais simples de dividir o arquivo de backup é usar um software sqldumpsplitterque permita dividir o arquivo db em vários arquivos db. Faça o download aqui

Ou então use este comando do terminal.

split -l 600 ./path/to/source/file.sql ./path/to/dest/file-

Aqui, 600 é o número de linhas que você deseja ter em seus arquivos divididos. E os dois argumentos são a origem e o destino dos arquivos, respectivamente.

NOTA: você deve verificar os arquivos divididos, não divide nenhum comando.


1
Obrigado por sugerir na direção correta! Mas, em vez de usar, spliteu recomendo usar csplit. Ele não será dividido logo após um determinado número de linha, que pode estar entre uma lista de INSERTvalores, por exemplo. Você pode passar uma regex para identificar linhas nas quais dividir. Use-o da seguinte maneira, exemplo : `csplit -kdump.sql '/ ^ CREATE TABLE. * /' '{900}' 'Isso dividirá seu arquivo de despejo antes de cada create table …instrução. Mude isso para suas necessidades. (Pela maneira que eu passar {900}em vez de {*}porque eu recebo um erro "csplit: *}: contagem de repetição" , talvez apenas um problema no MacOS?)
Arvid

3

Eu escrevi mysqldumpsplitter (shell script), que divide os bancos de dados / tabelas conforme as instruções de uma maneira rápida e fácil. Veja todos os casos de uso possíveis de como extrair do mysqldump .

sh mysqldumpsplitter.sh --source mysqldump-file.sql --extract DB --match_str database-name


0

1) Você tem a opção de fazer upload do arquivo por outro método, por exemplo: scp ou ftp, e depois restaurá-lo a partir do arquivo local?

2) Seu ISP pegará o arquivo em CD e o carregará para você?

3) Você pode restaurar o arquivo em um servidor local e criar uma série de arquivos de backup usando critérios específicos para manter os tamanhos individuais baixos?

4) Você pode dividir o arquivo manualmente e depois arrumar os comandos SQL no final dos arquivos?


Eu estava pensando nas opções 2, 3 e 4. 2 seria o último recurso. 3 é provavelmente a próxima coisa que vou tentar fazer. 4 foi meu primeiro pensamento, mas não consigo nem abrir o arquivo grande no bloco de notas ou em qualquer editor, pois leva horas para abrir um arquivo de 250 MB de todo o texto ... todos os aplicativos semelhantes ao bloco de notas congelam e nunca mais retornam.
Brian T Hannan

@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - O Notepad ++ pode lidar com eles muito bem. olhar outra pessoa em superuser.com/questions/34749/...
Sathyajith Bhat

Se você deseja dividir o arquivo automaticamente e depois arrumar as peças menores, consulte a opção de divisão do utilitário Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000

0

Você pode dividir um arquivo grande no Eclipse. Eu tentei um arquivo de 105 GB no Windows com êxito:

Basta adicionar a biblioteca MySQLDumpSplitter ao seu projeto: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Nota rápida sobre como importar:

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.

0

Também tive esse problema e decidi codificar um pedaço de código extremamente eficiente em termos de memória e CPU que divide um único arquivo .sql em vários (um por tabela).

Eu tive que escrevê-lo, pois qualquer outra solução que encontrei não estava funcionando suficientemente bem. Em um dump de 16 GB, eu consegui dividi-lo em menos de 2 minutos.

O código e as instruções estão disponíveis na página do projeto no github


0

Existem algumas opções se você pode executar um script bash ou perl. Experimente este em yoodey.com

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.
use strict;
use warnings;
my $dbfile;
my $dbname = q{};
my $header = q{};
while (<>) {    

# Beginning of a new database section:
    # close currently open file and start a new one
    if (m/-- Current Database\: \`([-\w]+)\`/) {
    if (defined $dbfile && tell $dbfile != -1) {
        close $dbfile or die "Could not close file!"
    }
    $dbname = $1;
    open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
    print $dbfile $header;
    print "Writing file $1_dump.sql ...\n";
    }
    if (defined

$dbfile && tell $dbfile != -1) {
    print $dbfile $_;
    }
    # Catch dump file header in the beginning
    # to be printed to each separate dump file.
    if (!

$dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"

-1

Em vez de dividir o arquivo, você pode usar um cliente MySQL na sua máquina local e conectá-lo ao banco de dados MySQL remoto. Eu uso o HeidiSQL e achei muito bom.

É claro que pode demorar um pouco para enviar os 250 MB de instruções SQL pela Internet.

Você também pode experimentar o BigDump

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.