データベースのコピー

13 10月

データベースを丸ごとコピーする必要が生じて、その際にデータに処理を加えなければならなかったので、PHP で書いてみました。

まず、データベースに含まれるテーブル名を取得します。

<?php

$DB = mysqli_connect( 'localhost', 'username', 'password', 'databasename') or die(mysqli_connect_error());  
mysqli_set_charset($DB, 'utf8');

$sql = "SHOW TABLES;";
$result = mysqli_query($DB, $sql) or die(mysqli_error($DB2));

$rows = mysqli_num_rows($result);

for ($i = 0; $i < $rows; $i = $i + 1) {

	$row = mysqli_fetch_array($result);

	echo $row[0]."\n";

}
?>

出力は下記のようにテーブル名が並びます。

authors
table_College_Physics
table_friend
table_ryuji-kondo

次に、コピーです。コピー先のデーターベースは空のものを前もって用意しておきます。コピーする前に、同じ構造の空のテーブルを作成して、その後データを移します。

<?php

$DB = mysqli_connect( 'localhost', 'username', 'password', 'コピー元のDB') or die(mysqli_connect_error());  
mysqli_set_charset($DB, 'utf8');

$DB2 = mysqli_connect( 'localhost', 'username', 'password', 'コピー先のDB') or die(mysqli_connect_error());  
mysqli_set_charset($DB2, 'utf8');



$sql = "SHOW TABLES;";

$result = mysqli_query($DB, $sql) or die(mysqli_error($DB));

$rows = mysqli_num_rows($result);



for ($i = 0; $i < $rows; $i = $i + 1) {

	$row = mysqli_fetch_array($result);

	$a_table_name = "`".$row[0]."`";


	$sql = "CREATE TABLE コピー先のDB.$a_table_name LIKE コピー元のDB.$a_table_name";

	mysqli_query($DB2, $sql) or die(mysqli_error($DB2));


	$sql = "INSERT INTO コピー先のDB.$a_table_name SELECT * FROM コピー元のDB.$a_table_name";

	mysqli_query($DB2, $sql) or die(mysqli_error($DB2));

}

?>

この手順でコピーすると、AUTO INCREMENT などもそのままコピーされます。