Mysqldump ব্যবহার না করে অনুলিপি / অনুলিপি


427

সার্ভারে স্থানীয় অ্যাক্সেস ব্যতিরেকে, কোনও মাইএসকিউএল ডিবি (কনটেন্ট সহ এবং সামগ্রী ব্যতীত) ব্যবহার না করে অন্য কোনও ক্ষেত্রে নকল / ক্লোন করার কোনও উপায় আছে mysqldumpকি?

আমি বর্তমানে মাইএসকিউএল ৪.০ ব্যবহার করছি।


12
এর সাথে কী হয়েছে mysqldump?
মাইকেল মায়ার

48
আপনি এটি না করেছেন তা নিশ্চিত করুন : CREATE TABLE t2 SELECT * FROM t1;আপনি যেমন আপনার সূচক তথ্য হারাবেন, তেমন কোনও বিশেষ জিনিস যেমন অটো_সিত্তিককরণ ইত্যাদি .. ।
জন হান্ট

59
একটি অফ টপিক প্রশ্ন 92 টি আপগেট এবং 37 টি পছন্দ করে। এ জাতীয় বিষয়বস্তু বন্ধ করার জন্য থাম্বস আপ। পুরানো নির্দেশিকা।
pal4Live 20'13

25
100% সম্মত হন যে "অফ টপিক হিসাবে বন্ধ হয়েছে" ভুল এবং গিল্ডলাইনগুলি আপডেট করা উচিত - আরও বেশি বিন্যাস প্রয়োজন - এসও ভুল দিকে যাচ্ছে। এটি স্পষ্টতই যে @ ইচ্ছেমতো পুরোপুরি ছাপ ফেলেছে, এবং তার মডারেটরের সুবিধাগুলি সরিয়ে নেওয়া উচিত - এই একক প্রশ্নই যথেষ্ট প্রমাণ proof
স্টলসভিক

10
অফ টপিক হিসাবে বন্ধ করা 100% ভুল। এটি আমার কাছে সঠিক প্রশ্ন এবং এটির একটি সুস্পষ্ট সংজ্ঞাযুক্ত প্রযুক্তিগত উত্তর রয়েছে যা নিছক মতামতের সাথে সম্পর্কিত নয়। আমি মনে করি মডারেটর অবশ্যই প্রশ্নগুলি বন্ধ করার জন্য "সেরা" এর মতো শব্দ খুঁজছিল।
স্যাম গোল্ডবার্গ

উত্তর:


686

আমি দেখতে পাচ্ছি আপনি বলেছিলেন যে আপনি ব্যবহার করতে চান না mysqldump, তবে আমি এই পৃষ্ঠায় পৌঁছেছি একই রকম সমাধানের জন্য এবং অন্যরাও এটি খুঁজে পেতে পারে। এটি মনে রেখে, একটি উইন্ডোজ সার্ভারের কমান্ড লাইন থেকে একটি ডাটাবেস নকল করার একটি সহজ উপায়:

  1. মাইএসকিউএলডমিন বা আপনার পছন্দসই পদ্ধতিটি ব্যবহার করে লক্ষ্য ডাটাবেস তৈরি করুন। এই উদাহরণে, db2লক্ষ্য ডাটাবেস, যেখানে উত্স ডাটাবেস db1অনুলিপি করা হবে।
  2. কমান্ড লাইনে নিম্নলিখিত বিবৃতিটি কার্যকর করুন:

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

দ্রষ্টব্য: -pএবং এর মধ্যে কোনও স্থান নেই[password]


108
মাইসকিলডাম্পের বিরুদ্ধে মামলাটি হ'ল দ্রুততর উপায় হতে পারে তথ্যের পরে তথ্যগুলিকে কোয়েরিতে রূপান্তরিত করা, প্রক্রিয়াটির বাইরে কোয়েরিগুলি প্রেরণ করা এবং টিটিটির মাধ্যমে ঠিক একই প্রক্রিয়াতে ফিরে আসা, প্রশ্নের পুনরাবৃত্তি করা এবং বিবৃতি হিসাবে কার্যকর করা। এটি ভয়াবহভাবে অদক্ষ এবং অপ্রয়োজনীয় শোনায় । আমরা মাইএসকিউএল মাস্টারগুলির মধ্যে পার হওয়ার বা স্টোরেজ ইঞ্জিন পরিবর্তন করার কথা বলছি না। এটি মর্মান্তিক যে কোনও দক্ষ আন্তঃপ্রসেস বাইনারি স্থানান্তর নেই।
টোডিয়াস ঝো

42
: যদি আপনি আপনার টার্মিনাল ইতিহাসে পাসওয়ার্ড প্লেইন সঞ্চয় না চান, আপনি কমান্ড বিভক্ত করতে হবে mysqldump -h [server] -u [user] -p db1 > db1, mysql -h [server] -u [user] -p db2 < db1 আপ অন্যথায় পাসওয়ার্ড প্রম্পটের messes এটা আমার জন্য অন্তত পুটিং ব্যবহার করে।
কেপেক্স

5
আপনি যদি আপনার ব্যবহারকারী / হোস্ট / পাসওয়ার্ড ফাইলগুলি সংরক্ষণ করতে .my.cnf ফাইল সেট আপ করেন তবে বাশ থেকে মাইএসকিএলডাম এবং মাইএসকিএল ব্যবহার করা আরও সহজ হয়ে যায়
এরিচবিএসচুল্জ

4
mysqldump -u root -p -v db1 | mysql -u root -p db2এবং দুইবার পাস প্রবেশ করুন
এইচএলসিএস

6
godশ্বর, কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন কেন "মাইকিকিলডাম্প ছাড়াই" প্রশ্ন করা প্রশ্নটির প্রথম প্রতিক্রিয়া হিসাবে মাইএসকিल्ड্প ব্যবহার করে? মত, সঠিক এক চেয়ে 6x বেশি ভোট ?
সিমন

135

আপনি চালিয়ে ডেটা ছাড়াই একটি টেবিলটি নকল করতে পারেন:

CREATE TABLE x LIKE y;

( মাইএসকিউএল তৈরি টেবিল ডক্স দেখুন)

আপনি এমন একটি স্ক্রিপ্ট লিখতে পারেন যা SHOW TABLESএকটি ডাটাবেস থেকে আউটপুট নেয় এবং স্কিমাটিকে অন্যটিতে অনুলিপি করে। আপনার মতো স্কিমা + টেবিলের নাম উল্লেখ করতে সক্ষম হওয়া উচিত:

CREATE TABLE x LIKE other_db.y;

তথ্য যতদূর যায়, আপনি এটি মাইএসকিউএল এও করতে পারেন, তবে এটি অগত্যা দ্রুত নয়। আপনি রেফারেন্সগুলি তৈরি করার পরে, আপনি ডেটা অনুলিপি করতে নিম্নলিখিতটি চালাতে পারেন:

INSERT INTO x SELECT * FROM other_db.y;

যদি আপনি মাইআইএসএএম ব্যবহার করেন তবে আপনি টেবিলের ফাইলগুলি অনুলিপি করা ভাল; এটা অনেক দ্রুত হবে। আপনি প্রতি টেবিল টেবিল স্পেস সহ INNODB ব্যবহার করছেন এমনটি করতে সক্ষম হবেন ।

যদি আপনি কোনও কাজ শেষ করেন INSERT INTO SELECT, তবে অস্থায়ীভাবে এর সাথে সূচকগুলি বন্ধ করে দিতে ভুলবেন না ALTER TABLE x DISABLE KEYS!

এডিট ম্যাটকিটের কিছু স্ক্রিপ্টও রয়েছে যা ডেটা সিঙ্ক করার জন্য সহায়ক হতে পারে। এটি দ্রুত নাও হতে পারে তবে আপনি সম্ভবত খুব বেশি লক না করে সরাসরি সিঙ্কের তাদের সিঙ্ক স্ক্রিপ্টগুলি চালাতে পারেন run


1
এই কাজটি নকল টেবিলের জন্য? যেহেতু আমি দেখছি কমান্ডটি তৈরি করুন টেবিল
GusDeCooL

4
আপনি করতে পারেন CREATE TABLE ... SELECT
উদয়গতি

3
আমি একবার মাইআইএসএএম ডাটাবেসের টেবিল ফাইলগুলি অনুলিপি করার চেষ্টা করেছি, তবে এটি কেবল নতুন ডাটাবেসটিকে দূষিত করেছে। সম্ভবত আমার খারাপ, তবে এটি অবশ্যই কোনও অপারেশন হিসাবে ততটা তুচ্ছ নয় some
জোহান ফ্রেডরিক ভারেন

2
এটি একটি দুর্দান্ত কৌশল এবং আমি একজন অনুরাগী, তবে একটি গুরুত্বপূর্ণ দ্রষ্টব্য: এটি মাইএসকিউএল ডক্স অনুসারে কোনও বিদেশী কী বাধা (এমনকি স্কিমার অনুলিপি বহির্মুখী এমনকি) বহন করে না
২৮

59

আপনি যদি লিনাক্স ব্যবহার করে থাকেন তবে আপনি এই ব্যাশ স্ক্রিপ্টটি ব্যবহার করতে পারেন: (এটি সম্ভবত কিছু অতিরিক্ত কোড সাফাই প্রয়োজন তবে এটি কাজ করে ... এবং এটি ম্যাসিক্ল্ডম্প্প | মাইএসকিএল) এর চেয়ে আরও দ্রুত

#!/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
পেগলি

এটি কি সীমাবদ্ধতার ডেটা এবং টেবিলের অন্যান্য বৈশিষ্ট্যগুলিও অনুলিপি করে?
লুকাস মোসকোপস

1
দেখে মনে হচ্ছে, কারণ তিনি একটি "শো ক্রেইট টেবিল" বিবৃতি ব্যবহার করেন যা মূলগুলির সমস্ত বৈশিষ্ট্য সহ একটি তৈরি টেবিল তৈরি করে।
দানিটা 6'11

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
আমি এই লিপিটি @ জোজ্জন দ্বারা পরিষ্কার করেছি এবং জিআইএসটি gist.github.com/christopher-hopper/8431737
ক্রিস্টোফার

11

পিএইচপি-তে:

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

নোট সেখানে মাইএসকিউএল ইউটিলিটি উপর অ্যাড অংশ হিসাবে একটি mysqldbcopy কমান্ড .... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html


কিন্তু এটি একটি অতিরিক্ত প্যাকেজ ইনস্টল করা প্রয়োজনapt install mysql-utilities
জোএল জি ম্যাথু

2
তবে সেখানে কোনও বিধিনিষেধ ছিল না যা বলা সম্ভব ছিল না .... এবং এটি একটি সাধারণভাবে ইনস্টল করা জিনিস (তবে আপনি যেমন বলতে চান এটি it'sচ্ছিক) যদি এটি ইনস্টল না করা হয়, তবে অনেকে 60 পংক্তির বাশ স্ক্রিপ্ট স্থাপন ও চালনার চেয়ে সেই প্যাকেজটি ইনস্টল করা সহজ মনে করতে পারে many , ইত্যাদি ....
ফ্রিকাল

আপনার পোস্টটি সম্ভবত ভোট দেওয়া হয়েছে কারণ আপনি লিঙ্ক ব্যতীত অন্য কোনও তথ্য অন্তর্ভুক্ত করেননি। উত্তরগুলি আরও বিস্তৃত বলে মনে করা হচ্ছে।
জোয়েল জি ম্যাথিউ

1

"স্থানীয় অ্যাক্সেস" বলতে কী বোঝাতে চেয়েছি তা সত্যই আমি জানি না। তবে সেই সমাধানের জন্য আপনাকে যেখানে ডাটাবেস সঞ্চিত আছে সেই ফাইলগুলি অনুলিপি করতে সার্ভারের ওপরে অ্যাক্সেস করতে সক্ষম হওয়া দরকার ।

আমি mysqldump ব্যবহার করতে পারি না, কারণ আমার ডাটাবেস বড় (7Go, mysqldump ফেইল) 2 mysql ডাটাবেসের সংস্করণ যদি খুব আলাদা হয় তবে এটি কার্যকর নাও হতে পারে, আপনি mysql -V ব্যবহার করে আপনার mysql সংস্করণটি পরীক্ষা করতে পারেন।

1) আপনার রিমোট সার্ভার থেকে আপনার স্থানীয় কম্পিউটারে ডেটা অনুলিপি করুন (ভিপিএস আপনার দূরবর্তী সার্ভারে উপনাম, রুট @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

পূর্ববর্তী সমস্ত সমাধান কিছুটা হলেও পয়েন্টে আসে তবে তারা কেবল সমস্ত কিছু অনুলিপি করে না। আমি একটি পিএইচপি ফাংশন তৈরি করেছি (কিছুটা দীর্ঘ হলেও) যা টেবিল, বিদেশী কী, ডেটা, মতামত, পদ্ধতি, ফাংশন, ট্রিগার এবং ইভেন্টগুলি সহ সমস্ত কিছু অনুলিপি করে। কোডটি এখানে:

/* 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]));
        }
    }
}

ডাউনভোটেড কারণ প্রশ্নটি "মাইএসকিলডাম্প ব্যবহার করবেন না" তবে "মাইএসকিএলডাম্পের চেয়ে আরও ভাল পদ্ধতির ব্যবহার করুন" is mysqldumpদক্ষতার দিক থেকে এটি আরও খারাপ ।
ভ্যালারিও বোজ

1

প্রকৃতপক্ষে আমি পিএইচপি-তে ঠিক এটি অর্জন করতে চেয়েছিলাম তবে এখানে উত্তরগুলির কোনওটিই খুব কার্যকর ছিল না তাই মাইএসকিউএলআই ব্যবহার করে আমার - বেশ সোজা - সমাধানটি এখানে:

// 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

আমি আমার বিকাশ সার্ভারে দ্রুত ওয়ার্ডপ্রেস ইনস্টলেশন তৈরির জন্য এটি ব্যবহার করছি। এই অংশটি অন্য কয়েকটি রুটিনের সাথে যুক্ত এবং একটি উত্স ইনস্টলেশনটি একটি নতুন প্রকল্পে সমন্বিত করে। তার জন্য এটি ঠিক কাজ করে ... তবে একটি ফাঁকা ওয়ার্ডপ্রেস ডাটাবেস খুব জটিল নয় তাই আমি আরও বর্ধিত ব্যবহারের ক্ষেত্রে বিবৃতি দিতে পারি না
জিডিওয়াই

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এবং তারপরে কেবল ক্লোন ক্লোন করতে ব্যবহার করতে পারেন।

এটা আসল প্রশ্ন কেন? কারণ ডিবি 2 জিবি-র বেশি হলে মাইএসকিল্ডাম্পস আপলোড করা কুশলী ধীর হয়। এবং আপনি কেবল ডিবি ফাইল (স্ন্যাপশট ব্যাকআপিংয়ের মতো) অনুলিপি করে InnoDB টেবিলগুলি ক্লোন করতে পারবেন না।


0

একটি এসকিউএল যা এসকিউএল কমান্ডগুলি দেখায়, একটি ডেটাবেস থেকে অন্য ডাটাবেসে নকল করতে চালানো প্রয়োজন run প্রতিটি টেবিলের জন্য একটি সারণী বিবৃতি এবং একটি সন্নিবেশ বিবৃতি তৈরি করা হয়। এটি ধরে নেয় যে উভয় ডাটাবেস একই সার্ভারে রয়েছে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.