我有一个包含5个表和TEST版本的MySQL数据库的实时版本。
我不断使用phpMyAdmin将LIVE版本中的每个表格复制到TEST版本。
有没有人有mysql查询语句来制作数据库的完整副本?查询字符串需要考虑结构,数据,自动增量值以及与需要复制的表相关联的任何其他内容。
感谢。
答案 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)
取决于您对服务器的访问权限。我建议使用直接mysql
和mysqldump
命令。这就是phpMyAdmin所做的一切。
答案 2 :(得分:2)
Mysqldump的参考资料。
答案 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;这是它在制作副本时会锁定数据库。 这意味着你最终得到一致的副本。 这也意味着您的生产数据库将在复制期间被捆绑,这通常不是一件好事。
如果没有锁定或交易,如果您在复制时正在写入数据库,则最终可能会在您的副本中显示孤立数据。
要在不影响生产的情况下获得良好的副本,您应该在另一台服务器上创建一个奴隶。 从站实时更新。 您可以在从站上运行相同的命令,而不会影响生产。