サーバーへのローカル アクセスがない場合、MySQL db (コンテンツありとコンテンツなし) を別のデータベースに複製/クローンする方法はありますmysqldump
か?
現在、MySQL 4.0 を使用しています。
サーバーへのローカル アクセスがない場合、MySQL db (コンテンツありとコンテンツなし) を別のデータベースに複製/クローンする方法はありますmysqldump
か?
現在、MySQL 4.0 を使用しています。
を使いたくないと言ったのはわかりますがmysqldump
、同様の解決策を探しているときにこのページにたどり着きました。他の人も同様に見つけるかもしれません。これを念頭に置いて、Windows サーバーのコマンド ラインからデータベースを複製する簡単な方法を次に示します。
db2
は、 はソース データベースdb1
がコピーされるターゲット データベースです。mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
注: と の間-p
にスペースはありません[password]
次のコマンドを実行すると、データなしでテーブルを複製できます。
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には、データの同期に役立つスクリプトもいくつかあります。高速ではないかもしれませんが、ロックをあまりかけずに、ライブ データに対して同期スクリプトを実行できるでしょう。
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
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