Làm cách nào để chia một tệp sao lưu MySql lớn thành nhiều tệp?


14

Tôi có tệp SQL sao lưu 250 MB nhưng giới hạn lưu trữ mới chỉ là 100 MB ...

Có chương trình nào cho phép bạn chia một tệp SQL thành nhiều tệp SQL không?

Có vẻ như mọi người đang trả lời sai câu hỏi ... vì vậy tôi sẽ làm rõ hơn:

Tôi CHỈ có tệp 250 MB và chỉ có lưu trữ mới bằng phpMyAdmin hiện không có dữ liệu trong cơ sở dữ liệu. Tôi cần lấy tệp 250 MB và tải nó lên máy chủ mới nhưng có giới hạn kích thước tải lên tệp sao lưu SQL 100 MB. Tôi chỉ cần lấy một tệp quá lớn và chia nó thành nhiều tệp, mỗi tệp chỉ chứa các câu lệnh SQL hợp lệ đầy đủ (không có câu lệnh nào có thể được phân chia giữa hai tệp).


Nó có phải là nhiều tệp SQL hợp lệ không? Tôi sẽ nén tệp vào một số tài liệu lưu trữ trong 100 MB và tải lên.
Nifle

Đúng, nó phải là nhiều tệp SQL hợp lệ ... miễn là không có một nửa câu lệnh trong một tệp và nửa còn lại trong một tệp khác.
Brian T Hannan

Câu trả lời:


5

Từ Làm cách nào để chia đầu ra từ mysqldump thành các tệp nhỏ hơn?

Đầu tiên kết xuất lược đồ (nó chắc chắn phù hợp với 2Mb, không?)

mysqldump -d --all-databases

và khôi phục nó.

Sau đó, chỉ kết xuất dữ liệu trong các câu lệnh chèn riêng biệt, do đó bạn có thể chia nhỏ các tệp và khôi phục chúng mà không phải nối chúng trên máy chủ từ xa

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

Lời khuyên tốt! Làm cho cảm giác hoàn hảo. Thực sự tốt khi có các phụ thuộc phức tạp giữa các bảng để việc chia tách xuất cả lược đồ và dữ liệu không hoạt động.
Reed Richards

7

Cách đơn giản nhất để phân chia tệp sao lưu là sử dụng một phần mềm sqldumpsplitter, cho phép bạn chia tệp db thành nhiều tệp db. Tải về tại đây

Hoặc người khác sử dụng lệnh đầu cuối này.

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

Ở đây, 600 là số dòng bạn muốn có trong các tệp được chia. Và hai đối số là nguồn và đích của các tệp tương ứng.

LƯU Ý: bạn phải kiểm tra các tệp được tách, bạn không chia bất kỳ lệnh nào.


1
Cảm ơn đã gợi ý theo đúng hướng! Nhưng thay vì sử dụng splittôi khuyên bạn nên sử dụng csplit. Nó sẽ không phân chia ngay sau một số dòng nhất định, có thể nằm giữa một danh sách các INSERTgiá trị chẳng hạn. Bạn có thể vượt qua một regex để xác định các dòng để phân chia tại. Sử dụng nó theo cách sau, ví dụ : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Điều này sẽ phân chia tệp kết xuất của bạn trước mỗi create table …câu lệnh. Thay đổi điều này theo nhu cầu của bạn. (Bằng cách tôi vượt qua {900}thay {*}vì vì tôi gặp lỗi "csplit: *}: số lần lặp lại xấu" , có thể chỉ là sự cố trên MacOS?)
Arvid

3

Tôi đã viết mysqldumpsplitter (shell script), phân tách cơ sở dữ liệu / bảng theo hướng dẫn một cách nhanh chóng và dễ dàng. Xem tất cả các trường hợp sử dụng có thể có của cách trích xuất từ ​​mysqldump .

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


0

1) Bạn có tùy chọn tải tệp lên bằng phương pháp khác không, ví dụ: scp hoặc ftp và sau đó khôi phục tệp từ tệp cục bộ?

2) ISP của bạn sẽ lấy tệp trên CD và tải nó cho bạn chứ?

3) Bạn có thể khôi phục tệp vào máy chủ cục bộ và sau đó tạo một loạt các tệp sao lưu từ nó bằng các tiêu chí cụ thể để giảm kích thước riêng lẻ không?

4) Bạn có thể tách tệp theo cách thủ công sau đó dọn dẹp các lệnh SQL ở cuối tệp?


Tôi đã suy nghĩ về lựa chọn 2, 3 và 4. 2 sẽ là phương sách cuối cùng. 3 thực sự có lẽ là điều tiếp theo tôi sẽ cố gắng làm. 4 là suy nghĩ đầu tiên của tôi, nhưng tôi thậm chí không thể mở tệp lớn trong notepad hoặc bất kỳ trình soạn thảo nào. Phải mất hàng giờ để mở tệp 250 MB của tất cả văn bản ... tất cả các ứng dụng giống như notepad đều đóng băng và không bao giờ quay lại.
Brian T Hannan

@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ có thể xử lý chúng tốt. khác nhìn vào superuser.com/questions/34749/ từ
Sathyajith Bhat

Nếu bạn muốn tách tệp TỰ ĐỘNG và sau đó dọn dẹp các phần nhỏ hơn, hãy xem tùy chọn phân tách của tiện ích Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000

0

Bạn có thể chia một tệp lớn trong Eclipse. Tôi đã thử một tệp 105 GB trong Windows thành công:

Chỉ cần thêm thư viện MySQLDumpSplitter vào dự án của bạn: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Ghi chú nhanh về cách nhập:

- 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

Tôi cũng gặp vấn đề này và quyết định mã hóa một đoạn mã cực kỳ hiệu quả về bộ nhớ & CPU để chia một tệp .sql thành nhiều tệp (mỗi bảng một lần).

Tôi đã phải viết nó vì bất kỳ giải pháp nào khác tôi thấy không hoạt động đủ tốt. Trên một bãi rác 16 GB thực sự, tôi đã xoay sở để chia nó trong vòng chưa đầy 2 phút.

Mã và hướng dẫn có sẵn tại trang dự án trên github


0

Có một vài lựa chọn nếu bạn có thể chạy tập lệnh bash hoặc perl. Hãy thử cái này từ 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

Thay vì chia nhỏ tệp, bạn có thể sử dụng máy khách MySQL trên máy cục bộ của mình và kết nối nó với MySQL DB từ xa. Tôi sử dụng HeidiSQL và thấy nó rất tốt.

Tất nhiên, có thể mất một lúc để gửi 250MB câu lệnh SQL trên Internet.

Bạn cũng có thể thử BigDump

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.