您可以使用MySQL查询来完全创建数据库的副本

时间:2011-05-13 19:57:03

标签: php mysql

我有一个包含5个表和TEST版本的MySQL数据库的实时版本。

我不断使用phpMyAdmin将LIVE版本中的每个表格复制到TEST版本。

有没有人有mysql查询语句来制作数据库的完整副本?查询字符串需要考虑结构,数据,自动增量值以及与需要复制的表相关联的任何其他内容。

感谢。

7 个答案:

答案 0 :(得分:4)

好的,经过大量研究,谷歌搜索和阅读每个人的评论后,我制作了以下脚本 - 我现在从浏览器地址栏运行。测试它,它完全符合我的需要。感谢大家的帮助。

<?php
function duplicateTables($sourceDB=NULL, $targetDB=NULL) {
    $link = mysql_connect('{server}', '{username}', '{password}') or die(mysql_error()); // connect to database
    $result = mysql_query('SHOW TABLES FROM ' . $sourceDB) or die(mysql_error());
    while($row = mysql_fetch_row($result)) {
        mysql_query('DROP TABLE IF EXISTS `' . $targetDB . '`.`' . $row[0] . '`') or die(mysql_error());
        mysql_query('CREATE TABLE `' . $targetDB . '`.`' . $row[0] . '` LIKE `' . $sourceDB . '`.`' . $row[0] . '`') or die(mysql_error());
        mysql_query('INSERT INTO `' . $targetDB . '`.`' . $row[0] . '` SELECT * FROM `' . $sourceDB . '`.`' . $row[0] . '`') or die(mysql_error());
        mysql_query('OPTIMIZE TABLE `' . $targetDB . '`.`' . $row[0] . '`') or die(mysql_error());
    }
    mysql_free_result($result);
    mysql_close($link);
} // end duplicateTables()
duplicateTables('liveDB', 'testDB');
?>

答案 1 :(得分:2)

取决于您对服务器的访问权限。我建议使用直接mysqlmysqldump命令。这就是phpMyAdmin所做的一切。

答案 2 :(得分:2)

答案 3 :(得分:1)

有一个PHP class,我还没有测试过。

从它的描述:

This class can be used to backup a MySQL database.

It queries a database and generates a list of SQL statements that can be used later to restore the database **tables structure** and their contents.

我猜这就是你需要的。

答案 4 :(得分:0)

您好,您可以使用简单的bash脚本备份整个数据库。

######### SNIP BEGIN ########## 
## Copy from here ############# 
#!/bin/bash 
# to use the script do following: 
# sh   backup.sh DBNAME | sh 
# where DBNAME is database name from alma016 
# ex Backuping mydb data: 
# sh  backup.sh mydb hostname username pass| sh 
echo "#sh  backup.sh mydb hostname username pass| sh" 
DB=$1
host=$2
user=$3
pass=$4 
NOW=$(date +"%m-%d-%Y") 
FILE="$DB.backup.$NOW.gz" 
# rest of script 
#dump command: 
cmd="mysqldump -h $host -u$user -p$pass  $DB | gzip -9 > $FILE"
echo $cmd 
############ END SNIP ###########

修改

如果您想克隆backuped数据库,只需编辑转储并更改数据库名称,然后:

      tar xzf yourdump.tar.gz| mysql -uusername -ppass
欢呼阿曼。

答案 5 :(得分:0)

在脚本表单中,您可以尝试使用

CREATE TABLE ... LIKE语法,遍历表格列表,您可以从SHOW TABLES获取。

唯一的问题是本机不会重新创建索引或外键。所以你必须列出它们并创建它们。然后进行了几次INSERT ... SELECT调用以获取数据。

如果您的架构永远不会更改,只会更改数据。然后创建一个复制表结构的脚本,然后在事务中执行INSERT ... SELECT业务。

如果不这样,mysqldump正如其他人所说的那样很容易从脚本开始工作。我有一个每日触发cron作业,从我的数据中心服务器转储所有方式的数据库,通过FTPS连接到我的位置,并发送所有转储。它可以非常有效地完成。显然你必须确保这些设施被锁定,但同样,不要太难。


根据代码请求

代码是专有的,但我会向您展示您需要的关键部分。这是来自foreach循环的中间,因此continue语句和$c..前缀变量(我使用它来表示当前循环(或实例) )变量)。 echo命令可以是您想要的任何内容,这是cron脚本,因此回显当前状态是合适的。当您从浏览器运行脚本时,flush()行很有用,因为输出将发送到该点,因此浏览器结果会在运行时填充,而不是在结束时全部显示。 ftp_fput()行显然取决于我在某处上传转储并直接从管道上传的情况 - 您可以使用另一个打开的进程将输出通过管道传输到mysql进程来复制数据库。提供适当的修改。

$cDumpCmd = $mysqlDumpPath . ' -h' . $dbServer . ' -u' . escapeshellarg($cDBUser) . ' -p' . escapeshellarg($cDBPassword) . ' ' . $cDatabase . (!empty($dumpCommandOptions) ? ' ' . $dumpCommandOptions : '');

$cPipeDesc = array(0 => array('pipe', 'r'),
                   1 => array('pipe', 'w'),
                   2 => array('pipe', 'w'));
$cPipes = array();

$cStartTime = microtime(true);

$cDumpProc = proc_open($cDumpCmd, $cPipeDesc, $cPipes, '/tmp', array());

if (!is_resource($cDumpProc)) {
    echo "failed.\n";
    continue;
} else {
    echo "success.\n";
}

echo "DB: " . $cDatabase . " - Uploading Database...";

flush();

$cUploadResult = ftp_fput($ftpConn, $dbFileName, $cPipes[1], FTP_BINARY);

$cStopTime = microtime(true);

if ($cUploadResult) {
    echo "success (" . round($cStopTime - $cStartTime, 3) . " seconds).\n";
    $databaseCount++;
} else {
    echo "failed.\n";
    continue;
}

$cErrorOutput = stream_get_contents($cPipes[2]);

foreach ($cPipes as $cFHandle) {
    fclose($cFHandle);
}

$cDumpStatus = proc_close($cDumpProc);

if ($cDumpStatus != 0) {
    echo "DB: " . $cDatabase . " - Dump process caused an error:\n";
    echo $cErrorOutput . "\n";
    continue;
}

flush();

答案 6 :(得分:0)

如果你正在使用linux或mac,这里只有一行来克隆数据库。

mysqldump -uUSER -pPASSWORD -hsample.host --single-transaction --quick test | mysql -uUSER -pPASSWORD -hqa.sample.host --database=test

&#39>优势&#39;这是它在制作副本时会锁定数据库。 这意味着你最终得到一致的副本。 这也意味着您的生产数据库将在复制期间被捆绑,这通常不是一件好事。

如果没有锁定或交易,如果您在复制时正在写入数据库,则最终可能会在您的副本中显示孤立数据。

要在不影响生产的情况下获得良好的副本,您应该在另一台服务器上创建一个奴隶。 从站实时更新。 您可以在从站上运行相同的命令,而不会影响生产。