436

サーバーへのローカル アクセスがない場合、MySQL db (コンテンツありとコンテンツなし) を別のデータベースに複製/クローンする方法はありますmysqldumpか?

現在、MySQL 4.0 を使用しています。

4

11 に答える 11

689

を使いたくないと言ったのはわかりますがmysqldump、同様の解決策を探しているときにこのページにたどり着きました。他の人も同様に見つけるかもしれません。これを念頭に置いて、Windows サーバーのコマンド ラインからデータベースを複製する簡単な方法を次に示します。

  1. MySQLAdmin または任意の方法を使用して、ターゲット データベースを作成します。この例でdb2は、 はソース データベースdb1がコピーされるターゲット データベースです。
  2. コマンド ラインで次のステートメントを実行します。

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

注: と の間-pにスペースはありません[password]

于 2011-08-18T17:00:30.477 に答える
137

次のコマンドを実行すると、データなしでテーブルを複製できます。

CREATE TABLE x LIKE y;

( MySQL CREATE TABLEのドキュメントを参照してください)

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には、データの同期に役立つスクリプトもいくつかあります。高速ではないかもしれませんが、ロックをあまりかけずに、ライブ データに対して同期スクリプトを実行できるでしょう。

于 2008-08-25T14:19:24.960 に答える
60

Linux を使用している場合は、次の bash スクリプトを使用できます。

#!/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
于 2010-01-03T14:54:11.867 に答える
13

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
于 2011-08-31T11:33:21.817 に答える