如何将大型MySql备份文件拆分为多个文件?


14

我有一个250 MB的备份SQL文件,但是对新主机的限制仅为100 MB ...

是否有一个程序可以让您将一个SQL文件拆分为多个SQL文件?

似乎人们在回答错误的问题...所以我将澄清更多:

我只有250 MB的文件,只有使用phpMyAdmin的新主机,该主机当前在数据库中没有数据。我需要获取250 MB的文件并将其上传到新主机,但是SQL备份文件的上传大小限制为100 MB。我只需要获取一个太大的文件,然后将其拆分为多个文件,每个文件仅包含完整的有效SQL语句(不能在两个文件之间拆分语句)。


它必须是多个有效的SQL文件吗?我将文件压缩为100MB的几个存档,然后上传。
Nifle

是的,它必须是多个有效的SQL文件……只要一个文件中没有一个语句的一半,而另一文件中没有另一条语句。
Brian T Hannan

Answers:


5

如何将mysqldump的输出拆分为较小的文件?

首先转储架构(它肯定适合2Mb,不是吗?)

mysqldump -d --all-databases

并恢复它。

之后,仅将数据转储到单独的插入语句中,因此您可以拆分文件并还原它们,而不必在远程服务器上将它们串联起来

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

好建议!很有道理。当表之间存在复杂的依赖关系时,这非常好,这样就无法拆分模式和数据的导出。
里德·理查兹

7

拆分备份文件的最简单方法是使用软件sqldumpsplitter,该软件可让您将db文件拆分为多个db文件。在这里下载

否则使用此终端命令。

分割-l 600 ./path/to/source/file.sql ./path/to/dest/file-

在这里,600是您希望在拆分文件中包含的行数。这两个参数分别是文件的源和目标。

注意:您必须检查拆分文件,不要拆分任何命令。


1
感谢您指出正确的方向!但是split我建议不要使用而不是使用csplit。它不会在特定的行号之后立即拆分,例如可能在INSERT值列表之间。您可以传递正则表达式来标识要分割的行。以以下方式使用它,例如:`csplit -k dump.sql'/ ^ CREATE TABLE。* /''{900}'`这将在每个create table …语句之前分割转储文件。将此更改为您的需求。(通过我的方式,{900}而不是{*}因为出现错误“ csplit:*}:错误的重复计数”,也许只是MacOS上的一个问题?)
Arvid,



0

1)您是否可以选择通过其他方法上传文件,例如:scp或ftp,然后从本地文件还原?

2)您的ISP是否会将CD上的文件加载并为您加载?

3)能否将文件还原到本地服务器,然后使用特定条件从文件中制作一系列备份文件以减小单个文件的大小?

4)您可以手动拆分文件,然后整理文件末尾的SQL命令?


我在考虑选项2、3和4。2将是最后的选择。3实际上可能是我要尝试做的下一件事。4是我的第一个想法,但我什至无法在记事本或任何编辑器中打开大型文件b / c,要花250个小时才能打开所有文本的文件...所有类似记事本的应用程序都冻结了,再也无法返回。
Brian T Hannan

@Brian:-Notepad 4 was my first thought, but I can't even open the large file in notepad or any editor ++可以很好地处理它们。别人看superuser.com/questions/34749/...
Sathyajith铢

如果你想自动分割文件,然后收拾小块,看看在瑞士档案刀实用的拆分选项(stahlworks.com/dev/swiss-file-knife.html
Linker3000

0

您可以在Eclipse中分割一个大文件。我已经在Windows中成功尝试了105GB的文件:

只需将MySQLDumpSplitter库添加到您的项目中:http ://dl.bintray.com/verace/MySQLDumpSplitter/jar/

关于如何导入的快速说明:

- 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

我也遇到了这个问题,因此决定编写一段内存和CPU效率极高的代码,将一个.sql文件拆分为多个(每个表一个)。

我不得不编写它,因为我发现任何其他解决方案都不能令人满意。在真正的16GB转储中,我设法在不到2分钟的时间内将其拆分了。

代码和说明可在github的项目页面上找到


0

如果您可以运行bash或perl脚本,则有两种选择。从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

除了拆分文件,您还可以在本地计算机上使用MySQL客户端,然后将其连接到远程MySQL数据库。我使用HeidiSQL,发现它非常好。

当然,可能需要一段时间才能在Internet上发送250MB的SQL语句。

您也可以尝试BigDump

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.