当前位置:  开发笔记 > 编程语言 > 正文

复制/复制数据库而不使用mysqldump

如何解决《复制/复制数据库而不使用mysqldump》经验,为你挑选了4个好方法。

没有本地访问服务器,有没有办法将MySQL数据库(包含内容和没有内容)复制/克隆到另一个不使用mysqldump

我目前正在使用MySQL 4.0.



1> Rafe..:

我可以看到你说你不想使用mysqldump,但我在寻找类似的解决方案时到达了这个页面,而其他人也可能会找到它.考虑到这一点,这是从Windows服务器的命令行复制数据库的简单方法:

    使用MySQLAdmin或您首选的方法创建目标数据库.在此示例中,db2是目标数据库,其中db1将复制源数据库.

    在命令行上执行以下语句:

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

注意:-p和之间没有空格[password]


反对**mysqldump**的情况是,必须有一种更快的方法,然后将数据序列化为查询,在进程外传输查询,并通过tty返回到**完全相同的进程**,重新分析查询,并将它们作为陈述执行.这听起来效率低下且不必要.我们不是在讨论MySQL主服务器之间的交叉或更改存储引擎.令人震惊的是,没有有效的进程内二进制传输.
如果您不想在终端历史记录中保存密码明文,则需要拆分命令:`mysqldump -h [server] -u [user] -p db1> db1`,`mysql -h [server] - 你[用户] -p db2 如果你设置.my.cnf文件来存储你的用户/主机/密码文件,使用bash中的mysqldump和mysql变得更加简单
`mysqldump -u root -p -v db1 | mysql -u root -p db2`并且两次输入pass
/什么是不使用mysqldump的好理由?
上帝,可以请有人解释我为什么一个问题,说"没有mysqldump"作为第一个响应使用mysqldump?喜欢,比_correct_一票多6倍票?来吧,SO ......

2> Gary Richard..:

您可以通过运行来复制没有数据的表:

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!

编辑 Maatkit还有一些脚本可能有助于同步数据.它可能不会更快,但你可以在没有太多锁定的情况下在实时数据上运行它们的同步脚本.


你可以[`CREATE TABLE ... SELECT`](http://dev.mysql.com/doc/refman/4.1/en/create-table-select.html).
我曾尝试复制一次MyISAM数据库的表文件,但这只是损坏了新数据库.可能是我的坏,但它绝对不像一些人说的那样微不足道.
这是一个很好的技巧,我很喜欢,但请注意:**这不会继承任何外键约束**(即使是[MySQL Docs]中的外键约束也是如此) https://dev.mysql.com/doc/refman/5.7/zh-CN/create-table-like.html)

3> 小智..:

如果您使用的是Linux,则可以使用此bash脚本:(它可能需要一些额外的代码清理,但它可以工作......而且它比mysqldump | mysql快得多)

#!/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


如果您将上述脚本与InnoDB表一起使用并具有外键,请将最后一行更改为以下内容:`echo"set foreign_key_checks = 0; $ fCreateTable; $ fInsertData; set foreign_key_checks = 1;" | mysql $ DBCONN $ DBNAME`

4> mr_app..:

在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

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有