Bagaimana cara membagi file cadangan MySql besar menjadi beberapa file?

14

Saya memiliki file cadangan SQL 250 MB tetapi batas hosting baru hanya 100 MB ...

Apakah ada program yang memungkinkan Anda membagi file SQL menjadi beberapa file SQL?

Sepertinya orang menjawab pertanyaan yang salah ... jadi saya akan menjelaskan lebih lanjut:

Saya HANYA memiliki file 250 MB dan hanya memiliki hosting baru menggunakan phpMyAdmin yang saat ini tidak memiliki data dalam database. Saya perlu mengambil file 250 MB dan mengunggahnya ke host baru tetapi ada batas ukuran unggah file cadangan SQL 100 MB. Saya hanya perlu mengambil satu file yang terlalu besar dan membaginya menjadi beberapa file masing-masing hanya berisi pernyataan SQL yang valid penuh (tidak ada pernyataan dapat dibagi antara dua file).

Brian T Hannan
sumber
Apakah harus beberapa file SQL yang valid? Saya akan zip file ke beberapa arsip dalam potongan 100MB dan mengunggahnya.
Nifle
Ya, itu harus beberapa file SQL yang valid ... sejauh tidak memiliki setengah dari satu pernyataan dalam satu file dan setengah lainnya di file lain.
Brian T Hannan

Jawaban:

5

Dari Bagaimana cara membagi output dari mysqldump menjadi file yang lebih kecil?

Pertama membuang skema (itu pasti cocok dalam 2MB, bukan?)

mysqldump -d --all-databases

dan kembalikan.

Setelah itu, hanya buang data dalam pernyataan sisipan terpisah, sehingga Anda dapat memisahkan file dan mengembalikannya tanpa harus menyatukannya di server jauh

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
harrymc
sumber
Saran yang bagus! Masuk akal. Sangat bagus ketika ada dependensi kompleks antara tabel sehingga pemisahan ekspor skema dan data tidak berfungsi.
Reed Richards
7

Cara termudah untuk membagi file cadangan adalah dengan menggunakan perangkat lunak sqldumpsplitter, yang memungkinkan Anda untuk membagi file db menjadi beberapa file db. Unduh di sini

Atau gunakan perintah terminal ini.

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

Di sini, 600 adalah jumlah baris yang ingin Anda miliki di file split Anda. Dan kedua argumen tersebut adalah sumber dan tujuan masing-masing file.

CATATAN: Anda harus memeriksa file split, Anda tidak membagi perintah apa pun.

GIRI
sumber
1
Terima kasih telah mengisyaratkan ke arah yang benar! Tapi daripada menggunakan splitsaya sarankan menggunakan csplit. Itu tidak akan terpecah tepat setelah nomor baris tertentu, yang mungkin antara daftar INSERTnilai misalnya. Anda dapat melewati regex untuk mengidentifikasi garis yang harus dibelah. Gunakan dengan cara berikut, contoh : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Ini akan membagi file dump Anda sebelum setiap create table …pernyataan. Ubah ini sesuai kebutuhan Anda. (Ngomong-ngomong saya lewat {900}bukan {*}karena saya mendapatkan kesalahan "csplit: *}: count pengulangan yang buruk" , mungkin hanya masalah pada MacOS?)
Arvid
3

Saya menulis mysqldumpsplitter (skrip shell), yang membagi database / tabel seperti yang diperintahkan dengan cara cepat dan mudah. Lihat semua kemungkinan kasus penggunaan cara mengekstrak dari mysqldump .

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

1) Apakah Anda memiliki opsi untuk mengunggah file dengan metode lain misalnya: scp atau ftp dan kemudian mengembalikannya dari file lokal?

2) Apakah ISP Anda akan mengambil file dalam CD dan memuatnya untuk Anda?

3) Dapatkah Anda mengembalikan file ke server lokal dan kemudian membuat serangkaian file cadangan menggunakan kriteria tertentu untuk menjaga ukuran individu?

4) Anda dapat membagi file secara manual kemudian merapikan perintah SQL di akhir file?

Linker3000
sumber
Saya sedang memikirkan opsi 2, 3, dan 4. 2 akan menjadi pilihan terakhir. 3 sebenarnya mungkin hal berikutnya yang akan saya coba lakukan. 4 adalah pikiran pertama saya, tetapi saya bahkan tidak bisa membuka file besar di notepad atau editor apa pun. Dibutuhkan berjam-jam untuk membuka file 250 MB dari semua teks ... semua aplikasi seperti notepad membeku dan tidak pernah kembali.
Brian T Hannan
@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ dapat menanganinya dengan baik. lain lihat superuser.com/questions/34749/…
Sathyajith Bhat
Jika Anda ingin membagi file OTOMATIS dan kemudian merapikan potongan-potongan yang lebih kecil, lihat opsi split utilitas Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000
0

Anda dapat membagi file besar di Eclipse. Saya telah mencoba file 105GB di Windows dengan sukses:

Cukup tambahkan perpustakaan MySQLDumpSplitter ke proyek Anda: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Catatan cepat tentang cara mengimpor:

- 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.
Alisa
sumber
0

Saya juga mengalami masalah ini dan memutuskan untuk membuat kode yang sangat efisien & efisien CPU yang membagi satu file .sql menjadi beberapa (satu per tabel).

Saya harus menulisnya karena solusi lain yang saya temukan tidak cukup baik. Pada dump 16GB nyata saya berhasil memisahkannya dalam waktu kurang dari 2 menit.

Kode dan instruksi tersedia di halaman proyek di github

Andrea Baccega
sumber
0

Ada beberapa opsi jika Anda dapat menjalankan skrip bash atau perl. Coba yang ini dari 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!"
Jrgns
sumber
-1

Alih-alih membelah file, Anda bisa menggunakan klien MySQL pada mesin lokal Anda dan menghubungkannya ke DB MySQL jarak jauh. Saya menggunakan HeidiSQL dan merasa sangat bagus.

Tentu saja butuh beberapa saat untuk mengirim 250MB pernyataan SQL di Internet.

Anda juga bisa mencoba BigDump

Hydaral
sumber