2008-09-25 8 views
33

मुझे पूरे टेबल को एक MySQL डेटाबेस से दूसरे में स्थानांतरित करने की आवश्यकता है। मेरे पास दूसरी बार, केवल phpMyAdmin पहुंच तक पूर्ण पहुंच नहीं है। मैं केवल 2 एमबी से छोटी (संपीड़ित) एसक्यूएल फाइल अपलोड कर सकता हूं। लेकिन पहले डेटाबेस की टेबल के mysqldump से संपीड़ित आउटपुट 10 एमबी से बड़ा है।मैं आउटपुट को mysqldump से छोटी फ़ाइलों में कैसे विभाजित करूं?

क्या mysqldump से आउटपुट को छोटी फ़ाइलों में विभाजित करने का कोई तरीका है? मैं विभाजन (1) का उपयोग नहीं कर सकता क्योंकि मैं रिमोट सर्वर पर फ़ाइलों को वापस नहीं कर सकता (1)।

या क्या कोई और समाधान है जिसे मैंने याद किया है?

संपादित

--extended-डालने = FALSE विकल्प पहले पोस्टर ने सुझाव दिया mysqldump है कि विभाजन (1) के साथ कहा जाता है प्रदान की है, कि तब आयात योग्य फ़ाइलों में विभाजित किया जा सकता है एक sql फ़ाइल पैदावार एक उपयुक्त - लाइन विकल्प। परीक्षण और त्रुटि से मैंने पाया कि bzip2 20 के कारक द्वारा .sql फ़ाइलों को संपीड़ित करता है, इसलिए मुझे यह पता लगाने की आवश्यकता है कि SQL कोड की कितनी पंक्ति लगभग 40 एमबी से मेल खाती है।

+0

इस प्रश्न को देखें यदि आप कैसे खोजते हैं [छोटी फ़ाइलों में एक बड़े पोस्टग्रेस्क्ल डंप को विभाजित करें] (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into- छोटी फाइलें) – rubo77

उत्तर

28

पहले स्कीमा डंप (यह निश्चित रूप से, कोई 2Mb में फिट बैठता है?)

mysqldump -d --all-databases 

और उसे पुनर्स्थापित करें।

बाद में अलग डालने बयानों में केवल डेटा डंप, ताकि आप फ़ाइलों को विभाजित है और रिमोट सर्वर पर उन्हें श्रेणीबद्ध किए बिना उन्हें बहाल कर सकते हैं

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

मैं कई पंक्तियों या VALUES का उपयोग करके प्रत्येक पंक्ति के साथ एक बड़े पैमाने पर बयान के बजाय, प्रत्येक पंक्ति डालने के लिए एक INSERT कथन सक्षम करने का एक तरीका ढूंढ रहा था। '--extended-insert = FALSE' ध्वज जो मुझे चाहिए था। धन्यवाद! – dmkc

+0

तालिका बनाएं: 'mysqldump mydatabase mytable -d> mytable-create.sql' डेटा: ' mysqldump mydatabase mytable --extended-insert = FALSE --no-create-info = TRUE> mytable-data.sql' फिर इसे किसी भी लंबाई की फ़ाइलों की एक श्रृंखला में विभाजित करें: 'विभाजित mytable-data.sql -l10000' अब आप पहले SQL बना सकते हैं। फिर 10,000 लंबाई की प्रत्येक तालिका। डिफ़ॉल्ट फ़ाइलों द्वारा xaa, xab, xac नाम दिया जाएगा ...)। 'mysql mydatabase liamvictor

0

कोशिश csplit (1) में उत्पादन अप कटौती करने के लिए नियमित अभिव्यक्तियों के आधार पर अलग-अलग टेबल (तालिका सीमा से मिलान करना मुझे लगता है)।

1

आप mysqldump database table1 table2 ... tableN

तालिकाओं में से कोई भी बहुत बड़ी हैं, तो चलाकर mysqldump के साथ व्यक्तिगत टेबल डंप कर सकते हैं, वह पर्याप्त नहीं होगा। अन्यथा, आपको बड़ी तालिकाओं में डेटा को विभाजित करना होगा।

10

आप कहते हैं कि आपके पास दूसरे सर्वर तक पहुंच नहीं है। लेकिन अगर आप पहली बार सर्वर, जहां टेबल रहे हैं करने के लिए खोल पहुँच है या नहीं, आप तालिका के आधार पर आपके डंप विभाजित कर सकते हैं:

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 के आउटपुट को विभाजित करने का एक और तरीका --tab विकल्प का उपयोग कर रहा है।

mysqldump [connecting options] --tab=directory_name dbname

जहां DIRECTORY_NAME एक खाली निर्देशिका का नाम है। यह आदेश प्रत्येक तालिका के लिए एक .sql फ़ाइल बनाता है, जिसमें CREATE TABLE कथन, और एक .txt फ़ाइल है, जिसमें डेटा डेटा शामिल है, लोड डेटा INFILE का उपयोग करके पुनर्स्थापित किया जा सकता है। मुझे यकीन नहीं है कि phpMyAdmin इन फ़ाइलों को आपके विशेष प्रतिबंध के साथ संभाल सकता है, हालांकि।

+0

हालांकि यह ओपी की ज़रूरतों को सीधे पूरा नहीं कर सकता है, यह व्यक्तिगत टेबल को अपनी फाइलों में प्राप्त करने का एक शानदार तरीका है ... grep आदि के लिए –

2

आपको अपने किसी भी सर्वर पर एसएसएच एक्सेस की आवश्यकता नहीं है। बस एक mysql [डंप] ग्राहक ठीक है। mysql [डंप] के साथ, आप अपने डेटाबेस को डंप कर सकते हैं और इसे फिर से आयात कर सकते हैं।

अपने पीसी में, आप की तरह कुछ कर सकते हैं:

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

newdatabase और बस हो गया। :-)

आशा है कि यह मदद मिलती है

0

चेक SQLDumpSplitter 2, मैं सिर्फ यह प्रयोग किया जाता सफलता के साथ एक 40MB डंप विभाजित करने के लिए। आप इसे नीचे दिए गए लिंक पर प्राप्त कर सकते हैं:

sqldumpsplitter.com

आशा इस मदद करते हैं।

+0

यूआरएल अब – cdmdotnet

+0

काम नहीं करता है इसके बारे में क्या: http://www.sqldumpsplitter.com/ – Sk8erPeter

+0

SQLDumpSplitter2 केवल 2 जीबी तक फ़ाइलों को संभाल सकता है (2 147 483 648 बाइट्स - यह फ़ाइल आकार के लिए 32 बिट हस्ताक्षरित पूर्णांक का उपयोग करता है, मुझे लगता है)। इसे संशोधित करना या 64 बिट के लिए मूल स्रोत कोड संकलित करना बहुत अच्छा हो सकता है, लेकिन मुझे डर है कि स्रोत कोड शायद खो गया है। अन्यथा यह एक अच्छा उपकरण है। लेकिन एसक्यूएल फाइलों को विभाजित करने में कई समस्याएं लगभग 2 जीबी आकार के आसपास शुरू होती हैं। –

1

मैं उपयोगिता bigdump की सिफारिश करेंगे, आप इसे यहां प्राप्त कर सकते हैं। http://www.ozerov.de/bigdump.php यह डंप के निष्पादन को रोकता है, जैसा कि यह आपकी सीमा तक प्रबंधित हो सकता है, एक समय में पूरी लाइनों को निष्पादित करता है।

26

यह bash स्क्रिप्ट के हिसाब से 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 [email protected]_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 [email protected]_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

+6

ध्यान दें कि मैक पर csplit इस स्क्रिप्ट के साथ काम नहीं करता है क्योंकि यह {*} वाक्यविन्यास का समर्थन नहीं करता है। इसे लिनक्स में चलाने की आवश्यकता है। – rlorenzo

+0

फ्रीबीएसडी पर ही। लेकिन आप जीएनयू उपयोगिता प्राप्त करने के लिए sysutils/coreutils बंदरगाह या पैकेज स्थापित कर सकते हैं और इसके बजाय gcsplit का उपयोग कर सकते हैं। – Dereckson

+0

ऐसा पुराना उत्तर है लेकिन अभी भी काम करता है, प्रभावशाली! –

0

यह script करना चाहिए के आधार पर यह:

#!/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 
0

मैंने MySQLDumpSplitter.java बनाया है, जो बैश स्क्रिप्ट के विपरीत, विंडोज पर काम करता है। यह यहां उपलब्ध है https://github.com/Verace/MySQLDumpSplitter

0

आप 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}'; 
+0

मेरे लिए काम नहीं कर रहा है – SpaceDog

2

इस उत्कृष्ट mysqldumpsplitter स्क्रिप्ट जो के साथ आता है द्वारा डंप विभाजित कर सकते हैं निकालने के लिए जब यह mysqldump निकालने की बात आती है।

मैं यहाँ नुस्खा कॉपी अपने मामले का चयन करने से होगा:

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

आदेश निर्दिष्ट डेटाबेस के लिए एसक्यूएल पैदा करेगा ऊपर निर्दिष्ट से :

1) mysqldump से एकल डाटाबेस निकालें "फ़ाइल नाम" एसक्यूएल फ़ाइल और इसे संपीड़ित प्रारूप में डेटाबेस-name.sql.gz पर संग्रहीत करें।

2) mysqldump से एकल तालिका निकालें:

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

आदेश निर्दिष्ट "फ़ाइल नाम" mysqldump फ़ाइल से निर्दिष्ट तालिका के लिए एसक्यूएल बना सकते हैं और डेटाबेस-name.sql के लिए संकुचित प्रारूप में स्टोर करेगा ऊपर .gz।

3) निकालें mysqldump से नियमित अभिव्यक्ति मिलान टेबल:

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

आदेश तालिकाओं के लिए SQLs पैदा करेगा ऊपर निर्दिष्ट "फ़ाइल नाम" mysqldump फ़ाइल से अभिव्यक्ति नियमित निर्दिष्ट मिलान और करने के लिए संकुचित प्रारूप में संग्रहीत व्यक्तिगत तालिका-नाम.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

आदेश gzip का उपयोग कर filename.sql.gz को संपीड़ित होगा ऊपर, डेटाबेस "filename.sql.gz" से "dbname" & नामित निकालने इसे आउट/dbname.sql के रूप में स्टोर करें।GZ

8) एक असम्पीडित प्रारूप में संकुचित mysqldump से एक डेटाबेस निकालें:

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

आदेश gzip का उपयोग कर filename.sql.gz संपीड़न हटाने और निकालने जाएगा ऊपर डेटाबेस "फ़ाइल नाम से" dbname "नाम .sql.gz "& सादा एसक्यूएल के रूप में यह दुकान बाहर/dbname.sql अलग फ़ोल्डर में mysqldump से

9) निकालें alltables:

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

आदेश से ऊपर mysqldump फ़ाइल निर्दिष्ट "फ़ाइल नाम" से सभी तालिकाओं निकालने और व्यक्तिगत फ़ाइलों को संकुचित प्रारूप में टेबल अर्क होगा, टेबल-name.sql.gz// अर्क को/के तहत/पथ संग्रहीत। स्क्रिप्ट फ़ोल्डर/पथ/से/निष्कर्ष/यदि मौजूद नहीं है तो बना देगा।

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 निकाल देंगे वर्तमान निर्देशिका में फ़ोल्डर "आउट" के तहत एसक्यूएल प्रारूप में डीबीएनएन डेटाबेस।

इस प्रकार आप एकल तालिका निकाल सकते हैं:

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 डेटाबेस से सभी तालिकाओं निकाल देंगे प्रारूप और इसे "आउट" निर्देशिका के अंतर्गत स्टोर करें।

12) mysqldump फ़ाइल

mysqldumpsplitter.sh --source filename --desc

आदेश से ऊपर डंप फ़ाइल से डेटाबेस और तालिकाओं सूची जाएगा की सूची सामग्री।

आप बाद में फ़ाइलों को लोड करने के लिए चुन सकते हैं: zcat filename.sql.gz | mysql -uUSER -p -hHOSTNAME

  • इसके अलावा एक बार आप एक तालिका जो आपको लगता है अभी भी बड़ा है निकालने के लिए, आप लाइनों की संख्या के साथ लिनक्स विभाजन आदेश का उपयोग आगे डंप विभाजित करने के लिए कर सकते हैं। split -l 10000 filename.sql

  • कहा यही कारण है, कि अगर आपकी जरूरत नहीं है (अधिक बार आ रहा है), तो आप mydumper जो वास्तव में व्यक्ति डंप आप अभ्यस्त विभाजित करने की आवश्यकता पैदा उपयोग करने पर विचार हो सकता है!

1

@ Vérace के जवाब संबंधी स्पष्टीकरण:

मैं विशेष रूप से इंटरैक्टिव विधि की तरह; आप एक्लिप्स में एक बड़ी फाइल को विभाजित कर सकते हैं। मैं सफलतापूर्वक Windows में एक 105GB फ़ाइल की कोशिश की है: कैसे आयात करने के लिए पर http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

त्वरित टिप्पणी:

बस अपनी परियोजना के लिए MySQLDumpSplitter पुस्तकालय जोड़ने

- 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

इस प्रयास करें: https://github.com/shenli/mysqldump-hugetable यह होगा डेटा को कई छोटी फाइलों में डंप करें। प्रत्येक फ़ाइल में कम या बराबर MAX_RECORDS रिकॉर्ड होते हैं। आप इस पैरामीटर को env.sh में सेट कर सकते हैं।

संबंधित मुद्दे