Mysqldump का उपयोग किए बिना डेटाबेस को कॉपी / डुप्लिकेट करें


427

सर्वर तक स्थानीय पहुंच के बिना, क्या MySQL db (सामग्री के साथ और सामग्री के बिना) का उपयोग किए बिना किसी अन्य में डुप्लिकेट / क्लोन करने का कोई तरीका है mysqldump?

मैं वर्तमान में MySQL 4.0 का उपयोग कर रहा हूं।


12
इसमें गलत क्या है mysqldump?
माइकल मिओर

48
सुनिश्चित करें कि आप ऐसा नहीं करते हैं: CREATE TABLE t2 SELECT * FROM t1;जैसा कि आप अपनी अनुक्रमणिका की जानकारी, किसी विशेष सामान जैसे कि auto_increment आदि को खो देंगे। बहुत से Google इस प्रतिलिपि तालिका प्रकार के लिए आपको ऐसा करने के लिए प्रेरित करेंगे और इसके अन-वांछित परिणाम होंगे ।
जॉन हंट

59
एक ऑफ टॉपिक प्रश्न को 92 अपवोट और 37 पसंदीदा मिलते हैं। इस तरह के विषय प्रश्न के लिए अंगूठे। निर्धारित दिशा-निर्देश।
pal4life

25
100% सहमत हैं कि "बंद विषय के रूप में" गलत है और गिल्ड को अद्यतन किया जाना चाहिए - अधिक उदारता की आवश्यकता है - एसओ गलत दिशा में बढ़ रहा है। यह स्पष्ट है कि @will पूरी तरह से निशान से दूर है, और उसके मॉडरेटर विशेषाधिकार को हटा दिया जाना चाहिए - यह एकल प्रश्न पर्याप्त सबूत है।
स्टॉल्सविक

10
विषय के रूप में बंद 100% गलत है। यह मेरे पास सटीक प्रश्न है, और इसमें एक अच्छी तरह से परिभाषित तकनीकी उत्तर है जो केवल राय से संबंधित नहीं है। मुझे लगता है कि मध्यस्थ को प्रश्नों को खोजने के लिए "सर्वश्रेष्ठ" जैसे शब्दों की तलाश करनी चाहिए।
सैम गोल्डबर्ग

जवाबों:


686

मैं देख सकता हूँ कि आपने कहा था कि आप उपयोग नहीं करना चाहते हैं mysqldump, लेकिन मैं इसी तरह के समाधान की तलाश करते हुए इस पृष्ठ पर पहुंचा और अन्य लोग भी इसे खोज सकते हैं। इस बात को ध्यान में रखते हुए, यहाँ विंडोज़ सर्वर की कमांड लाइन से डेटाबेस को डुप्लिकेट करने का एक सरल तरीका है:

  1. MySQLAdmin या अपने पसंदीदा विधि का उपयोग कर लक्ष्य डेटाबेस बनाएँ। इस उदाहरण में, db2लक्ष्य डेटाबेस है, जहां स्रोत डेटाबेस db1की प्रतिलिपि बनाई जाएगी।
  2. कमांड लाइन पर निम्नलिखित कथन निष्पादित करें:

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

नोट: -pऔर के बीच कोई स्थान नहीं है[password]


108
Mysqldump के खिलाफ मामला यह है कि एक तेज़ तरीका है फिर डेटा को प्रश्नों में क्रमबद्ध करना, प्रक्रिया से बाहर के प्रश्नों को प्रसारित करना और ठीक उसी प्रक्रिया में tty के माध्यम से , प्रश्नों को पुन: प्रस्तुत करना, और उनके कथनों को निष्पादित करना। यह बहुत ही अयोग्य और अनावश्यक लगता है । हम MySQL के मास्टर्स या स्टोरेज इंजन को बदलने के बीच की बात नहीं कर रहे हैं। यह चौंकाने वाला है कि कोई कुशल इंट्राप्रोसेस बाइनरी ट्रांसफर नहीं है।
टोड्डियस ज़ो

42
: यदि आप अपने टर्मिनलों के इतिहास में पासवर्ड सादा पाठ को बचाने के लिए नहीं करना चाहते हैं, तो आप आदेश विभाजित करने की आवश्यकता mysqldump -h [server] -u [user] -p db1 > db1, mysql -h [server] -u [user] -p db2 < db1 ऊपर अन्यथा पासवर्ड मांगना भोजनालयों यह मेरे लिए कम से कम पोटीन का उपयोग करते समय।
केपेक्स

5
अगर आप सेट अप करते हैं तो bash से mysqldump और mysql का उपयोग करना बहुत सरल हो जाता है। अपने उपयोगकर्ता / होस्ट / पासवर्ड फ़ाइलों को संग्रहीत करने के लिए .my.cnf फ़ाइल
ErichBSchulz

4
mysqldump -u root -p -v db1 | mysql -u root -p db2और दो बार पास
hlcs

6
भगवान, क्या कोई मुझे यह समझा सकता है कि "बिना मायस्कल्डपम्प" के एक प्रश्न का पहला उत्तर मेरे पास क्यों है जो माईस्क्लेम्प का उपयोग करता है? जैसे, 6x अधिक वोट सही से?
c'mon

135

आप बिना डेटा के किसी तालिका को डुप्लिकेट कर सकते हैं:

CREATE TABLE x LIKE y;

(देखें MySQL क्रिएट टेबल डॉक्स)

आप एक स्क्रिप्ट लिख सकते हैं जो आउटपुट SHOW TABLESको एक डेटाबेस से लेता है और स्कीमा को दूसरे में कॉपी करता है। आपको स्कीमा + तालिका नामों का संदर्भ देने में सक्षम होना चाहिए:

CREATE TABLE x LIKE other_db.y;

जहां तक ​​डेटा जाता है, आप इसे MySQL में भी कर सकते हैं, लेकिन यह जरूरी नहीं है कि यह तेज हो। आपके द्वारा संदर्भ बनाए जाने के बाद, आप डेटा की प्रतिलिपि बनाने के लिए निम्नलिखित चला सकते हैं:

INSERT INTO x SELECT * FROM other_db.y;

यदि आप MyISAM का उपयोग कर रहे हैं, तो आप टेबल फ़ाइलों की प्रतिलिपि बनाना बेहतर समझते हैं; यह बहुत तेज होगा। यदि आप INNODB का उपयोग प्रति टेबल टेबल रिक्त स्थान के साथ कर रहे हैं तो आपको ऐसा करने में सक्षम होना चाहिए ।

यदि आप अंत में एक कर रहे हैं INSERT INTO SELECT, तो अस्थायी रूप से अनुक्रमणिका को बंद करना सुनिश्चित करें ALTER TABLE x DISABLE KEYS!

EDIT Maatkit में कुछ स्क्रिप्ट भी होती हैं जो डेटा सिंक करने के लिए मददगार हो सकती हैं। यह तेज़ नहीं हो सकता है, लेकिन आप संभवत: बिना लॉकिंग के लाइव डेटा पर उनकी सिंकिंग स्क्रिप्ट चला सकते हैं।


1
क्या डुप्लिकेट टेबल के लिए यह काम है? चूँकि मैं देख रहा हूँ कि कमांड
क्रिएट

4
आप कर सकते हैं CREATE TABLE ... SELECT
एग्यगल

3
मैंने एक बार एक MyISAM डेटाबेस की तालिका फ़ाइलों की प्रतिलिपि बनाने की कोशिश की, लेकिन उसने नए डेटाबेस को दूषित कर दिया। शायद मेरा बुरा है, लेकिन यह निश्चित रूप से एक ऑपरेशन के रूप में तुच्छ नहीं है जैसा कि कुछ कहते हैं।
जोहान फ्रेड्रिक वर्न

2
यह एक अच्छी चाल है और मैं एक प्रशंसक हूं, लेकिन एक महत्वपूर्ण नोट: यह किसी भी विदेशी कुंजी बाधाओं (यहां तक ​​कि जो प्रतिलिपि बनाई जा रही स्कीमा के लिए बाहरी हैं) पर नहीं ले जाता है MySQL डॉक्स के
abigperson

59

यदि आप लिनक्स का उपयोग कर रहे हैं, तो आप इस बैश स्क्रिप्ट का उपयोग कर सकते हैं: (इसे शायद कुछ अतिरिक्त कोड सफाई की आवश्यकता है लेकिन यह काम करता है ... और यह बहुत तेज़ है तो mysqldump | mysql)

#!/bin/bash

DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com

fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
        createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
        fCreateTable="${fCreateTable} ; ${createTable}"
        insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
        fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME

7
यदि आप InnoDB तालिकाओं के साथ ऊपर की स्क्रिप्ट का उपयोग कर रहे हैं और विदेशी कुंजियाँ हैं, तो अंतिम पंक्ति को निम्न में बदलें:echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME
pegli

क्या यह भी बाधा डेटा और तालिकाओं के अन्य गुणों की नकल करता है?
लुकास मॉस्कोप्स

1
ऐसा लगता है, क्योंकि वह "SHOW CREATE TABLE" कथन का उपयोग करता है जो मूल के सभी गुणों के साथ एक CREATE TABLE बनाता है।
दनिता

1
यदि आपको समस्या मिलती है तो @ ज़िरेल ने वर्णन किया है कि यह संभवतः इसलिए है क्योंकि स्क्रिप्ट विचारों को कॉपी करने में विफल हो रही है। आप SHOW TABLESपंक्ति को बदलकर SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'और जोड़कर प्रतिलिपि के विचारों को अनदेखा कर सकते हैं | cut -f 1। पूरी लाइन कुछ इस तरह दिखनी चाहिए लेकिन सिंगल बैकटिक्स के साथ डबल बैकटिक्स को बदलें: for TABLE in ``echo "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" | mysql $DBCONN $DBSNAME | tail -n +2 | cut -f 1``; do
कोड कमांडर

1
मैं @jozjan द्वारा साफ-गया है इस स्क्रिप्ट और GIST पर इस संस्करण बनाने के लिए विदेशी और अन्य कुंजी के बारे में कुछ टिप्पणियों को लागू किया gist.github.com/christopher-hopper/8431737
क्रिस्टोफर

11

PHP में:

function cloneDatabase($dbName, $newDbName){
    global $admin;
    $db_check = @mysql_select_db ( $dbName );
    $getTables  =   $admin->query("SHOW TABLES");   
    $tables =   array();
    while($row = mysql_fetch_row($getTables)){
        $tables[]   =   $row[0];
    }
    $createTable    =   mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
    foreach($tables as $cTable){
        $db_check   =   @mysql_select_db ( $newDbName );
        $create     =   $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
        if(!$create) {
            $error  =   true;
        }
        $insert     =   $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
    }
    return !isset($error);
}


// usage
$clone  = cloneDatabase('dbname','newdbname');  // first: toCopy, second: new database

यदि आप विंडोज़ मशीन पर काम कर रहे हैं। फिर कृपया कमांड निष्पादित करने के लिए लंबा रास्ता खोजने के बजाय इसका उपयोग करें।
परिक्षित

यह स्क्रिप्ट गिनती में विचार नहीं लेती है
sd1sd1

4

ध्यान दें कि mysql उपयोगिताओं पर ऐड के भाग के रूप में एक mysqldbcopy कमांड है .... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html


लेकिन इसके लिए एक अतिरिक्त पैकेज की स्थापना की आवश्यकता होती है:apt install mysql-utilities
जोएल जी मैथ्यू

2
लेकिन यह कहते हुए कोई प्रतिबंध नहीं था कि यह संभव नहीं था .... और यह एक सामान्य रूप से स्थापित चीज़ है (लेकिन जैसा कि आप कहते हैं वैकल्पिक) यदि यह स्थापित नहीं है, तो बहुत से लोग उस पैकेज को स्थापित करने और 60 लाइन बैश स्क्रिप्ट चलाने से आसान पाएंगे। , इत्यादि ....
फरिश्ता

आपकी पोस्ट को शायद इसलिए वोट दिया गया क्योंकि आपने लिंक के अलावा कोई अन्य जानकारी शामिल नहीं की थी। उत्तर अधिक व्यापक माना जाता है।
जोएल जी मैथ्यू

1

मुझे वास्तव में नहीं पता है कि "स्थानीय पहुंच" से आपका क्या मतलब है। लेकिन उस समाधान के लिए आपको उन फ़ाइलों को कॉपी करने के लिए सर्वर पर पहुंचने में सक्षम होना चाहिए जहां डेटाबेस संग्रहीत है

मैं mysqldump का उपयोग नहीं कर सकता, क्योंकि मेरा डेटाबेस बड़ा है (7Go, mysqldump विफल) यदि 2 mysql डेटाबेस का संस्करण बहुत भिन्न है, तो यह काम नहीं कर सकता है, आप mysql संस्करण का उपयोग कर सकते हैं mysql -V।

1) अपने दूरस्थ सर्वर से डेटा को अपने स्थानीय कंप्यूटर पर कॉपी करें (vps आपके दूरस्थ सर्वर का उपनाम है, इसे root@1.2.3.4 द्वारा बदला जा सकता है)

ssh vps:/etc/init.d/mysql stop
scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql
ssh vps:/etc/init.d/apache2 start

2) अपने स्थानीय कंप्यूटर पर कॉपी किए गए डेटा को आयात करें

/etc/init.d/mysql stop
sudo chown -R mysql:mysql /tmp/var_lib_mysql
sudo nano /etc/mysql/my.cnf
-> [mysqld]
-> datadir=/tmp/var_lib_mysql
/etc/init.d/mysql start

यदि आपके पास एक अलग संस्करण है, तो आपको चलाने की आवश्यकता हो सकती है

/etc/init.d/mysql stop
mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs
/etc/init.d/mysql start

यह इसे करने का सबसे कुशल तरीका है, लेकिन मुझे लगता है कि "सर्वर तक स्थानीय पहुंच के बिना" का अर्थ है कि हम सिस्टम तक नहीं पहुंच सकते हैं। शायद एक साझा होस्टिंग? तो इसका जवाब नहीं है।
वेलेरियो बूज

1

पूर्व समाधान के सभी बिंदु पर थोड़ा मिलता है, हालांकि, वे बस सब कुछ खत्म नहीं करते हैं। मैंने एक PHP फ़ंक्शन (कुछ हद तक लंबा) बनाया है जो तालिकाओं, विदेशी कुंजी, डेटा, विचार, प्रक्रिया, फ़ंक्शन, ट्रिगर और घटनाओं सहित सब कुछ कॉपी करता है। यहाँ कोड है:

/* This function takes the database connection, an existing database, and the new database and duplicates everything in the new database. */
function copyDatabase($c, $oldDB, $newDB) {

    // creates the schema if it does not exist
    $schema = "CREATE SCHEMA IF NOT EXISTS {$newDB};";
    mysqli_query($c, $schema);

    // selects the new schema
    mysqli_select_db($c, $newDB);

    // gets all tables in the old schema
    $tables = "SELECT table_name
               FROM information_schema.tables
               WHERE table_schema = '{$oldDB}'
               AND table_type = 'BASE TABLE'";
    $results = mysqli_query($c, $tables);

    // checks if any tables were returned and recreates them in the new schema, adds the foreign keys, and inserts the associated data
    if (mysqli_num_rows($results) > 0) {

        // recreates all tables first
        while ($row = mysqli_fetch_array($results)) {
            $table = "CREATE TABLE {$newDB}.{$row[0]} LIKE {$oldDB}.{$row[0]}";
            mysqli_query($c, $table);
        }

        // resets the results to loop through again
        mysqli_data_seek($results, 0);

        // loops through each table to add foreign key and insert data
        while ($row = mysqli_fetch_array($results)) {

            // inserts the data into each table
            $data = "INSERT IGNORE INTO {$newDB}.{$row[0]} SELECT * FROM {$oldDB}.{$row[0]}";
            mysqli_query($c, $data);

            // gets all foreign keys for a particular table in the old schema
            $fks = "SELECT constraint_name, column_name, table_name, referenced_table_name, referenced_column_name
                    FROM information_schema.key_column_usage
                    WHERE referenced_table_name IS NOT NULL
                    AND table_schema = '{$oldDB}'
                    AND table_name = '{$row[0]}'";
            $fkResults = mysqli_query($c, $fks);

            // checks if any foreign keys were returned and recreates them in the new schema
            // Note: ON UPDATE and ON DELETE are not pulled from the original so you would have to change this to your liking
            if (mysqli_num_rows($fkResults) > 0) {
                while ($fkRow = mysqli_fetch_array($fkResults)) {
                    $fkQuery = "ALTER TABLE {$newDB}.{$row[0]}                              
                                ADD CONSTRAINT {$fkRow[0]}
                                FOREIGN KEY ({$fkRow[1]}) REFERENCES {$newDB}.{$fkRow[3]}({$fkRow[1]})
                                ON UPDATE CASCADE
                                ON DELETE CASCADE;";
                    mysqli_query($c, $fkQuery);
                }
            }
        }   
    }

    // gets all views in the old schema
    $views = "SHOW FULL TABLES IN {$oldDB} WHERE table_type LIKE 'VIEW'";                
    $results = mysqli_query($c, $views);

    // checks if any views were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $view = "SHOW CREATE VIEW {$oldDB}.{$row[0]}";
            $viewResults = mysqli_query($c, $view);
            $viewRow = mysqli_fetch_array($viewResults);
            mysqli_query($c, preg_replace("/CREATE(.*?)VIEW/", "CREATE VIEW", str_replace($oldDB, $newDB, $viewRow[1])));
        }
    }

    // gets all triggers in the old schema
    $triggers = "SELECT trigger_name, action_timing, event_manipulation, event_object_table, created
                 FROM information_schema.triggers
                 WHERE trigger_schema = '{$oldDB}'";                 
    $results = mysqli_query($c, $triggers);

    // checks if any triggers were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $trigger = "SHOW CREATE TRIGGER {$oldDB}.{$row[0]}";
            $triggerResults = mysqli_query($c, $trigger);
            $triggerRow = mysqli_fetch_array($triggerResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $triggerRow[2]));
        }
    }

    // gets all procedures in the old schema
    $procedures = "SHOW PROCEDURE STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $procedures);

    // checks if any procedures were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $procedure = "SHOW CREATE PROCEDURE {$oldDB}.{$row[1]}";
            $procedureResults = mysqli_query($c, $procedure);
            $procedureRow = mysqli_fetch_array($procedureResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $procedureRow[2]));
        }
    }

    // gets all functions in the old schema
    $functions = "SHOW FUNCTION STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $functions);

    // checks if any functions were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $function = "SHOW CREATE FUNCTION {$oldDB}.{$row[1]}";
            $functionResults = mysqli_query($c, $function);
            $functionRow = mysqli_fetch_array($functionResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $functionRow[2]));
        }
    }

    // selects the old schema (a must for copying events)
    mysqli_select_db($c, $oldDB);

    // gets all events in the old schema
    $query = "SHOW EVENTS
              WHERE db = '{$oldDB}';";
    $results = mysqli_query($c, $query);

    // selects the new schema again
    mysqli_select_db($c, $newDB);

    // checks if any events were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $event = "SHOW CREATE EVENT {$oldDB}.{$row[1]}";
            $eventResults = mysqli_query($c, $event);
            $eventRow = mysqli_fetch_array($eventResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $eventRow[3]));
        }
    }
}

नीचा दिखाया गया क्योंकि सवाल "mysqldump का उपयोग न करें" लेकिन "mysqldump की तुलना में बेहतर दृष्टिकोण का उपयोग करें" है। mysqldumpदक्षता के मामले में यह और भी खराब है ।
वेलेरियो बूज

1

वास्तव में मैं PHP में ठीक वैसा ही हासिल करना चाहता था, लेकिन यहाँ कोई भी जवाब बहुत उपयोगी नहीं था, इसलिए यहाँ मेरा बहुत - सीधा और सरल समाधान है:

// Database variables

$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';

$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';



// MYSQL Connect

$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );



// Create destination database

$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );



// Iterate through tables of source database

$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );

while( $table = $tables->fetch_array() ): $TABLE = $table[0];


    // Copy table and contents in destination database

    $mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
    $mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );


endwhile;

मुझे यकीन नहीं है कि टिहिस 1: 1 क्लोन बनाता है, लेकिन लगता है कि सरल डेटाबेस के लिए पर्याप्त हो सकता है।
beppe9000

मैं अपने विकास सर्वर पर त्वरित वर्डप्रेस इंस्टॉलेशन बनाने के लिए उपयोग कर रहा हूं। यह हिस्सा कुछ अन्य रूटीन डुप्लिकेट के साथ जोड़ा गया है और एक स्रोत की स्थापना को एक नई परियोजना में समायोजित करता है। इसके लिए यह ठीक काम करता है ... लेकिन एक खाली वर्डप्रेस डेटाबेस बहुत जटिल नहीं है, इसलिए मैं अधिक विस्तारित उपयोग के मामलों के लिए एक बयान नहीं दे सकता
GDY

0

Mysqldump के बिना डेटाबेस तालिकाओं को क्लोन करने का सबसे अच्छा तरीका:

  1. एक नया डेटाबेस बनाएँ।
  2. क्वेरी के साथ क्लोन-क्वेरी बनाएँ:

    SET @NewSchema = 'your_new_db';
    SET @OldSchema = 'your_exists_db';
    SELECT CONCAT('CREATE TABLE ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';INSERT INTO ',@NewSchema,'.',table_name,' SELECT * FROM ', TABLE_SCHEMA ,'.',table_name,';') 
    FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW';
  3. उस आउटपुट को चलाएं!

लेकिन ध्यान दें, केवल तेज़ क्लोन टेबलों के ऊपर की स्क्रिप्ट - विचार, ट्रिगर और उपयोगकर्ता-कार्य नहीं: आप तेजी से संरचना प्राप्त कर सकते हैं mysqldump --no-data --triggers -uroot -ppassword, और फिर केवल स्टेटमेंट सम्मिलित करने के लिए क्लोन का उपयोग कर सकते हैं।

यह वास्तविक प्रश्न क्यों है? क्योंकि DB 2Gb से अधिक है तो mysqldumps को अपलोड करना बदसूरत है। और आप बस DB फ़ाइलों (जैसे स्नैपशॉट बैकअप) की प्रतिलिपि बनाकर InnoDB तालिकाओं को क्लोन नहीं कर सकते।


0

एक SQL जो SQL कमांड दिखाता है, उसे एक डेटाबेस से दूसरे डेटाबेस में डुप्लिकेट करने के लिए चलाने की आवश्यकता होती है। प्रत्येक तालिका के लिए एक तालिका विवरण और एक सम्मिलित विवरण बनाना है। यह मानता है कि दोनों डेटाबेस एक ही सर्वर पर हैं:

select @fromdb:="crm";
select @todb:="crmen";

SET group_concat_max_len=100000000;


SELECT  GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;") 

SEPARATOR '\n\n')

as sqlstatement
 FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';

-1

माईस्कल्डम्प खराब समाधान नहीं है। डेटाबेस को डुप्लिकेट करने का सबसे सरल तरीका:

mysqldump -uusername -ppass dbname1 | mysql -uusername -ppass dbname2

इसके अलावा, आप इस तरह से भंडारण इंजन को बदल सकते हैं:

mysqldump -uusername -ppass dbname1 | sed 's/InnoDB/RocksDB/' | mysql -uusername -ppass dbname2

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.