كيف يمكنني تقسيم الناتج من mysqldump إلى أصغر الملفات ؟

StackOverflow https://stackoverflow.com/questions/132902

  •  02-07-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى نقل كامل الجداول من قاعدة بيانات MySQL إلى آخر.أنا لم يكن لديك حق الوصول الكامل إلى ثانية واحدة فقط بريس المجانية.أنا يمكن فقط تحميل (مضغوط) sql ملفات أصغر من 2 ميغابايت.ولكن المضغوط الناتج من mysqldump أول قاعدة بيانات الجداول أكبر من 10MB.

هل هناك طريقة تقسيم الناتج من mysqldump إلى أصغر الملفات ؟ أنا لا يمكن استخدام سبليت(1) منذ أنا لا يمكن أن القط(1) الملفات مرة أخرى على الملقم البعيد.

أو هل هناك حل آخر لدي غاب ؟

تحرير

و-مدد-إدراج=FALSE خيار mysqldump اقترح أول ملصق ينتج .ملف sql التي يمكن تقسيمها إلى ارداتها الملفات ، شريطة أن تقسيم(1) يسمى مناسبة --خطوط الخيار.عن طريق التجربة والخطأ وجدت أن bzip2 كمادات .ملفات sql بمقدار 20, لذلك أنا في حاجة إلى معرفة كيفية العديد من الأسطر من التعليمات البرمجية sql تتوافق تقريبا مع 40MB.

هل كانت مفيدة؟

المحلول

أولا تفريغ المخطط (بالتأكيد يناسب في 2Mb؟)

mysqldump -d --all-databases 

واستعادته.

بعد ذلك تفريغ البيانات فقط في فصل إدراج البيانات بحيث يمكنك تقسيم الملفات و استعادتها دون الحاجة إلى سلسلة لهم على الملقم البعيد

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

نصائح أخرى

هذا السيناريو باش يقسم على dumpfile من قاعدة بيانات واحدة إلى ملفات منفصلة لكل جدول الأسماء csplit وأسماء وفقا لذلك:

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

على أساس https://gist.github.com/jasny/1608062
و https://stackoverflow.com/a/16840625/1069083

أقول لكم أن لم يكن لديك الوصول إلى الملقم الثاني.ولكن إذا كان لديك قذيفة الوصول إلى الخادم الأول ، حيث الجداول ، يمكنك تقسيم تفريغ الجدول:

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

هذا سوف إنشاء ملف gzip لكل جدول.

آخر طريقة تقسيم الناتج من mysqldump في ملفات منفصلة باستخدام --التبويب الخيار.

mysqldump [connecting options] --tab=directory_name dbname 

حيث directory_name هو اسم من دليل فارغ.هذا الأمر يخلق .ملف sql لكل جدول يتضمن إنشاء جدول بيان،.txt ملف يحتوي على البيانات, استعادة باستخدام تحميل البيانات INFILE.أنا لست متأكدا مما إذا بريس يمكن التعامل مع هذه الملفات مع قيود معينة ، على الرغم من.

الرد المتأخر ولكن كنت أبحث عن نفس الحل جاء عبر البرمجية التالية من الموقع أدناه:

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individual-files

هناك هذا ممتاز mysqldumpsplitter السيناريو الذي يأتي مع طن من الخيارات عندما يتعلق الأمر إلى استخراج من mysqldump.

أود أن نسخ وصفة هنا أن اختيار قضية من:

1) استخراج بيانات واحدة من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

الأمر أعلاه سيتم إنشاء sql على قاعدة البيانات المحددة من المحدد "اسم الملف" ملف sql وتخزينها في شكل مضغوط إلى قاعدة البيانات name.sql.gz.

2) استخراج جدول واحد من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

الأمر أعلاه سيتم إنشاء sql محددة من الجدول المحدد "اسم الملف" mysqldump الملف وتخزينه في شكل مضغوط إلى قاعدة البيانات name.sql.gz.

3) استخراج الجداول مطابقة التعبير العادي من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

الأمر أعلاه سيتم إنشاء sqls الجداول مطابقة المحدد العادية التعبير من تحديد "اسم الملف" mysqldump الملف وتخزينه في شكل مضغوط الفردية table-name.sql.gz.

4) استخراج جميع قواعد البيانات من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

الأمر أعلاه سيتم استخراج كافة قواعد البيانات من تحديد "اسم الملف" mysqldump الملف وتخزينه في شكل مضغوط الفردية قاعدة البيانات name.sql.gz.

5) استخراج كل جدول من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

الأمر أعلاه سيتم استخراج جميع الجداول من تحديد "اسم الملف" mysqldump الملف وتخزينه في شكل مضغوط الفردية الجدول-name.sql.gz.

6) استخراج قائمة الجداول من mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

الأمر أعلاه سيتم استخراج الجداول من تحديد "اسم الملف" mysqldump الملفات وتخزينها في شكل مضغوط الفردية الجدول-name.sql.gz.

7) استخراج بيانات من ضغط mysqldump:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

الأمر أعلاه سيتم ضغط filename.sql.gz باستخدام gzip, استخراج قاعدة البيانات اسمه "dbname" من "filename.sql.gz" & تخزينه كما خارج/dbname.sql.gz

8) استخراج بيانات من ضغط mysqldump في غير مضغوط الشكل:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

الأمر أعلاه سيتم ضغط filename.sql.gz باستخدام gzip و استخراج قاعدة البيانات اسمه "dbname" من "filename.sql.gz" & تخزينه عادي sql خارج/dbname.sql

9) استخراج alltables من mysqldump في مجلد مختلف:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

الأمر أعلاه سيتم استخراج جميع الجداول من تحديد "اسم الملف" mysqldump الملف واستخراج الجداول في تنسيق مضغوط الفردية الملفات ، table-name.sql.gz تخزين تحت /path/to/مقتطفات/.السيناريو سيتم إنشاء مجلد /path/to/مقتطفات/ إن لم يكن موجودا.

10) استخراج جدول واحد أو أكثر من قاعدة بيانات واحدة في تفريغ:

النظر لديك تفريغ كامل مع العديد من قواعد البيانات كما تريد استخراج قليل من الجداول من قاعدة بيانات واحدة.

استخراج بيانات واحدة: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

استخراج جميع الجداول sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" على الرغم من أننا يمكن استخدام خيار آخر للقيام بذلك في واحد الأوامر كما يلي:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

الأمر أعلاه سيتم استخراج كل tbl1 و tbl2 من DBNAME في قاعدة البيانات sql format ضمن مجلد "من" في الدليل الحالي.

يمكنك استخراج جدول واحد كما يلي:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) استخراج جميع الجداول من قاعدة بيانات محددة:

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

الأمر أعلاه سيتم استخراج جميع الجداول من DBNAME قاعدة بيانات في sql شكل وتخزينها تحت عنوان "الدليل".

12) قائمة المحتوى من mysqldump الملف

mysqldumpsplitter.sh --source filename --desc

الأمر أعلاه قائمة قواعد البيانات و الجداول من ملف تفريغ.

يمكنك بعدها اختيار لتحميل الملفات:zcat filename.sql.gz | mysql -uUSER -p-hHOSTNAME

  • أيضا بمجرد استخراج جدول واحد الذي لا يزال أكبر ، يمكنك استخدام لينكس تقسيم الأمر مع عدد من خطوط إلى مزيد من الانقسام تفريغ.split -l 10000 filename.sql

  • أنه قال: إذا كان هذا هو الخاص بك تحتاج (يأتي في كثير من الأحيان) ، قد تنظر في استخدام mydumper والتي في الواقع يخلق الفرد مقالب لن تحتاج إلى تقسيم!

لقد تم إنشاؤها مؤخرا sqlsplit.com.محاولة الخروج منها.

أنت لا تحتاج إلى ssh الوصول إلى أي من الملقمات الخاصة بك.مجرد الخلية[تفريغ] العميل على ما يرام.مع mysql[تفريغ] ، يمكنك تفريغ قاعدة البيانات الخاصة بك و الاستيراد مرة أخرى.

في جهاز الكمبيوتر الخاص بك ، يمكنك أن تفعل شيئا مثل:

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h newhost newdatabase

والانتهاء من ذلك.:-)

ويساعد هذا الأمل

يمكنك تفريغ الجداول مع mysqldump عن طريق تشغيل mysqldump database table1 table2 ... tableN

إذا كان أي من الجداول كبيرة جدا, هذا سيكون كافيا.وإلا سيكون لديك لبدء تقسيم البيانات في أكبر الجداول.

أنصح فائدة bigdump, يمكنك الاستيلاء عليها هنا. http://www.ozerov.de/bigdump.php هذا وترنح تنفيذ مكب النفايات في أقرب ما يمكن أن ينجح في الحد الخاص بك ، تنفيذ كله خطوط في وقت واحد.

توضيح الجواب @Vérace :

أنا خصيصا مثل التفاعلية الأسلوب ؛ يمكنك تقسيم ملف كبير في الكسوف.لقد حاولت 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.

محاولة csplit(1) لخفض ما يصل الانتاج إلى الجداول على أساس التعبيرات العادية (مطابقة الجدول الحدود أعتقد).

هذا السيناريو ينبغي أن نفعل ذلك:

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done

تحقق من SQLDumpSplitter 2 ، أنا فقط استخدامه لتقسيم 40MB تفريغ مع النجاح.يمكنك الحصول عليه في الرابط أدناه:

sqldumpsplitter.com

نأمل أن يكون هذا مساعدة.

لقد خلق MySQLDumpSplitter.java على عكس باش مخطوطات, يعمل على نظام التشغيل ويندوز.انها متوفرة هنا https://github.com/Verace/MySQLDumpSplitter.

يمكنك تقسيم الملف موجود من قبل AWK.انها جدا كويك وبسيطة

دعونا تقسيم الجدول تفريغ من قبل 'الجداول' :

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

أو يمكنك تقسيم تفريغ من قبل 'قاعدة البيانات'

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';

جرب هذا: https://github.com/shenli/mysqldump-hugetable فإنه سيتم تفريغ البيانات في العديد من الملفات الصغيرة.كل ملف يحتوي على أقل من أو تساوي MAX_RECORDS السجلات.يمكنك تعيين هذه المعلمة في env.sh.

كتبت نسخة جديدة من SQLDumpSplitter هذه المرة مع سليم محلل ، مما يسمح أشياء لطيفة مثل إدراج مع العديد من القيم على تقسيم الملفات و هو منصة متعددة الآن: https://philiplb.de/sqldumpsplitter3/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top