ฉันจะแบ่งไฟล์สำรอง MySql ขนาดใหญ่เป็นหลายไฟล์ได้อย่างไร


14

ฉันมีไฟล์ SQL สำรองข้อมูล 250 MB แต่ขีด จำกัด ของโฮสติ้งใหม่นั้นมีขนาดเพียง 100 MB ...

มีโปรแกรมที่ให้คุณแยกไฟล์ SQL ออกเป็นหลายไฟล์ SQL หรือไม่?

ดูเหมือนว่าผู้คนกำลังตอบคำถามที่ผิด ... ดังนั้นฉันจะอธิบายเพิ่มเติม:

ฉันมีไฟล์ 250 MB เท่านั้นและมีโฮสติ้งใหม่โดยใช้ phpMyAdmin ซึ่งปัจจุบันไม่มีข้อมูลในฐานข้อมูล ฉันต้องใช้ไฟล์ 250 MB และอัปโหลดไปยังโฮสต์ใหม่ แต่มีขีด จำกัด ขนาดการอัปโหลดไฟล์สำรอง SQL 100 MB ฉันเพียงแค่ต้องใช้ไฟล์เดียวที่มีขนาดใหญ่เกินไปและแบ่งออกเป็นหลายไฟล์แต่ละไฟล์มีคำสั่ง SQL ที่ถูกต้องเท่านั้น (ไม่มีคำสั่งใดสามารถแยกระหว่างสองไฟล์)


ต้องเป็นไฟล์ SQL ที่ถูกต้องหลายไฟล์หรือไม่? ฉันจะซิปไฟล์ลงในคลังข้อมูลหลาย ๆ อันในช่องว่างขนาด 100MB และอัปโหลดไฟล์นั้น
Nifle

ใช่มันต้องเป็นไฟล์ SQL ที่ถูกต้องหลายไฟล์ ... เท่าที่ไม่มีคำสั่งครึ่งหนึ่งในไฟล์เดียวและอีกไฟล์เป็นไฟล์อื่น
Brian T Hannan

คำตอบ:


5

จากฉันจะแยกเอาต์พุตจาก mysqldump เป็นไฟล์ขนาดเล็กได้อย่างไร

เริ่มแรกให้สคีมา (มันพอดีใน 2Mb ไม่ใช่เหรอ)

mysqldump -d --all-databases

และเรียกคืน

หลังจากนั้นดัมพ์เฉพาะข้อมูลในคำสั่ง insert ที่แยกต่างหากดังนั้นคุณสามารถแยกไฟล์และเรียกคืนไฟล์เหล่านั้นโดยไม่ต้องต่อเชื่อมกับเซิร์ฟเวอร์ระยะไกล

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

คำปรึกษาที่ดี! ทำให้รู้สึกที่สมบูรณ์แบบ ดีจริงๆเมื่อมีการพึ่งพาที่ซับซ้อนระหว่างตารางเพื่อให้การแยกการส่งออกของสคีมาและข้อมูลไม่ทำงาน
Reed Richards

7

วิธีที่ง่ายที่สุดในการแบ่งไฟล์สำรองคือการใช้ซอฟต์แวร์sqldumpsplitterซึ่งช่วยให้คุณสามารถแยกไฟล์ db ออกเป็นหลายไฟล์ db ดาวน์โหลดได้ที่นี่

มิฉะนั้นให้ใช้คำสั่งเทอร์มินัลนี้

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

ที่นี่ 600 คือจำนวนบรรทัดที่คุณต้องการให้มีในไฟล์แยกของคุณ และทั้งสองข้อโต้แย้งคือแหล่งที่มาและปลายทางของไฟล์ตามลำดับ

หมายเหตุ: คุณต้องตรวจสอบไฟล์แยกคุณไม่ต้องแยกคำสั่งใด ๆ


1
ขอบคุณสำหรับคำใบ้ในทิศทางที่ถูกต้อง! แต่แทนที่จะใช้ผมขอแนะนำให้ใช้split csplitจะไม่แยกหลังจากหมายเลขบรรทัดที่แน่นอนซึ่งอาจอยู่ระหว่างรายการของINSERTค่าตัวอย่างเช่น คุณสามารถส่งregexเพื่อระบุบรรทัดที่จะแยกที่ ใช้ในวิธีต่อไปนี้ตัวอย่าง : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` นี่จะแบ่งไฟล์ดัมพ์ของคุณก่อนแต่ละcreate table …คำสั่ง เปลี่ยนสิ่งนี้เป็นความต้องการของคุณ (โดยวิธีที่ฉันผ่าน{900}แทน{*}เพราะผมได้รับข้อผิดพลาด"csplit: *}: นับซ้ำไม่ดี"อาจจะเป็นเพียงปัญหาใน MacOS?)
Arvid

3

ฉันเขียนmysqldumpsplitter (shell script) ซึ่งแยกฐานข้อมูล / ตารางตามคำแนะนำอย่างรวดเร็วและง่ายดาย ดูทุกกรณีการใช้งานเป็นไปได้ของวิธีการสกัดจาก mysqldump

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

2

รหัสนี้จะทำสิ่งที่คุณต้องการ (และเป็นโอเพ่นซอร์ส):

https://web.archive.org/web/20160313044916/http://rodo.nl/index.php?page=mysql-splitter

จะช่วยให้คุณสามารถแยกไฟล์ SQL ใด ๆ เป็นไฟล์ขนาดเล็กหลายไฟล์ (คุณสามารถกำหนดขนาดสูงสุด) ไวยากรณ์ SQL จะถูกเก็บไว้อย่างถูกต้องและจะทำงานร่วมกับไวยากรณ์แบบสอบถาม 'แทรกหลาย'

หวังว่านี่จะช่วยได้!


0

1) คุณมีตัวเลือกในการอัปโหลดไฟล์ด้วยวิธีอื่นเช่น: scp หรือ ftp แล้วกู้คืนจากไฟล์ภายในเครื่องหรือไม่?

2) ISP ของคุณจะใช้ไฟล์บน CD และโหลดให้คุณหรือไม่

3) คุณสามารถกู้คืนไฟล์ไปยังเซิร์ฟเวอร์ภายในแล้วสร้างชุดของไฟล์สำรองจากไฟล์โดยใช้เกณฑ์เฉพาะเพื่อลดขนาดไฟล์ลง

4) คุณสามารถแบ่งไฟล์ด้วยตนเองแล้วจัดระเบียบคำสั่ง SQL ที่ท้ายไฟล์ได้หรือไม่


ฉันกำลังคิดเกี่ยวกับตัวเลือก 2, 3, และ 4 2 จะเป็นทางเลือกสุดท้าย 3 น่าจะเป็นสิ่งต่อไปที่ฉันจะลองทำ 4 เป็นความคิดแรกของฉัน แต่ฉันไม่สามารถแม้แต่เปิดไฟล์ขนาดใหญ่ใน notepad หรือแก้ไขใด ๆ b / c ต้องใช้เวลาหลายชั่วโมงในการเปิดไฟล์ขนาด 250 MB ของข้อความทั้งหมด
Brian T Hannan

@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ สามารถจัดการได้ดี ดูที่superuser.com/questions/34749/
Sathyajith Bhat

หากคุณต้องการแยกไฟล์โดยอัตโนมัติแล้วจัดเรียงชิ้นเล็ก ๆ ให้ดูที่ตัวเลือกการแยกของยูทิลิตี้ Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000

0

คุณสามารถแยกไฟล์ขนาดใหญ่ใน Eclipse ฉันได้ลองใช้ไฟล์ 105GB ใน Windows สำเร็จแล้ว:

เพียงเพิ่มห้องสมุด 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

มีสองตัวเลือกถ้าคุณสามารถเรียกใช้สคริปต์ทุบตีหรือ 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และพบว่ามันดีมาก

แน่นอนว่าอาจใช้เวลาสักครู่ในการส่งคำสั่ง SQL 250MB ผ่านอินเทอร์เน็ต

คุณสามารถลองBigDump ได้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.