如何在同一台服务器上复制MySQL数据库

mysql database sync replicate

39117 观看

6回复

2555 作者的声誉

我有一个庞大的MySQL数据库,让我们调用它live_db,我想在同一台机器上复制它以提供一个测试系统来玩(test_db),包括表结构和数据。我定期更新test_db内容live_db; 如果可能的增量。

MySQL中是否有一些内置机制可以做到这一点?我认为主从复制不是我想要的东西,因为它应该可以改变数据test_db。但是,不必保留这些更改。

问候,

CGD

作者: Christoph Grimmer-Dietrich 的来源 发布者: 2011 年 7 月 11 日

回应 (6)


72

230800 作者的声誉

决定

mysql命令行客户端将接受来自标准输入的SQL语句的流。因此,您可以将输出mysqldump直接传递到mysql命令行。将此作为cron作业将定期使用更新的实时数据覆盖您的测试数据:

mysql --user=username --password=passwd -e 'DROP DATABASE test_db;'
mysql --user=username --password=passwd -e 'CREATE DATABASE test_db;'
mysqldump --user=username --password=passwd live_db | mysql --user=username --password=passwd test_db

请注意,由于您的数据很大,因此需要很长时间。

作者: Michael Berkowski 发布者: 11.07.2011 03:04

0

116 作者的声誉

如果您更喜欢MySQL Migration Toolkit,可以在“数据映射”步骤中双击模式名称并更改目标模式名称。

作者: Vasili 发布者: 09.10.2014 06:12

6

1391 作者的声誉

迈克尔斯回答abowe运作良好,但不复制事件,存储过程或触发器。

要复制那些mysqldump需要更多的开关: --events --triggers --routines

补充已经制作的副本:

mysqldump --user=username --password=passwd --no-data --no-create-info --no-create-db --events --triggers --routines live_db | mysql --user=username --password=passwd test_db

作者: Samuel Åslund 发布者: 20.04.2015 10:15

-1

1356 作者的声誉

这个解决方案工作正常,但如果您使用PHPunit进行单元测试,它将无法完成交易。

在命令行中使用密码会生成一个警告,该警告由PHPUnit捕获并生成异常(是非常重要的......)

解决此问题的方法是使用配置文件。

在我的情况下,我不想在配置文件和PHP代码中维护密码和用户,所以我从代码生成配置文件并检查它是否存在(否则我直接在命令行中使用用户名和密码作为退回选项)。

这是一个示例,在PHP中,如何复制安装数据库以创建具有不同名称的新数据库(例如,如果您为每个客户管理具有不同子域/数据库的主域):

/**
* If the $dbName doesn't exist, then create it.
* 
* @param $errorMessage String to return the error message.
* @param $dbName String name of the database to create.
* @param $cleanExisting Boolean if the database exist, clear it to recreate it.
*
* @return boolean ($dbExists)
*/
private function createDatabase(&$errorMessage, $dbName, $clearExisting = false){

    $command = "";
    $configurationString = "[client]" . "\r\n" . "user=" . parent::$support_user . "\r\n" . "password=" . md5(parent::$support_pass);
    $dbExist = false;
    $path = realpath(dirname(__FILE__));

    $connectionString = " --defaults-extra-file=" . $path . "\mysql.cnf ";

    $dbName = strtolower($dbName);

    if ($this->isDestinationDbNameValid($errorMessage, $dbName)) {

        $dbExist = $this->isDestinationDbExist($errorMessage, $dbName);

        if (empty($errorMessage) and ($dbExist === false or $clearExisting === true)) {

            if (file_put_contents($path . '/mysql.cnf', $configurationString) === false) {

                $connectionString = " --user=" . parent::$support_user . " --password=" . md5(parent::$support_pass). " ";
            }

            if ($dbExist and $clearExisting) {

                $command = $path . '/../../../mysql/bin/mysql ' . $connectionString . ' --execute="DROP DATABASE ' . $dbName  .';" &';
            }

            $command .= '"' . $path . '/../../../mysql/bin/mysql" ' . $connectionString . ' --execute="CREATE DATABASE ' . $dbName . ';" &"' .
                        $path . '/../../../mysql/bin/mysqldump" ' . $connectionString . ' --events --triggers --routines setup | "' .
                        $path . '/../../../mysql/bin/mysql" ' . $connectionString . $dbName;

            exec($command);

            $dbExist = $this->isDestinationDbExist($errorMessage, $dbName);

            if (!$dbExist) {

                $errorMessage = parent::getErrorMessage("COPY_SETUP_DB_ERR", "An error occurred during the duplication process of the setup database.");
            }
        }
    }

    return $dbExist;
}

附加说明:

  1. 我不得不在我的SQL语句中使用双引号(“)而不是单引号(')。

  2. 我不得不使用&符号来分隔我的不同命令。

  3. 此示例不包括新数据库名称的验证(isDestinationDbNameValid()方法)。无需提及您永远不应该信任用户输入...

  4. 您还必须编写自定义方法以验证数据库副本是否按预期工作(isDestinationDbExist()方法)。您至少应该验证数据库是否存在,是否存在来自您的设置的表,并且可选地验证存储的程序。

明智地使用我的朋友,

来自蒙特利尔的Jonathan Parent-Lévesque

作者: Jonathan Parent Lévesque 发布者: 20.07.2015 07:07

0

11 作者的声誉

对于所有的mac用户,使用续集专业版,您需要做的就是转到数据库(菜单) - >重复数据库。完成!

作者: Priyank 发布者: 29.05.2019 06:08

0

42228 作者的声誉

MySQLdump的问题是,当它转储时,实时数据库要么无法使用,要么使用起来很笨拙,要么备份不一致。除非你有足够长的时间窗口,因为实时数据库的不可用性并不重要,因为无论如何都不需要使用数据库(例如深夜)。

另一种可能性是,如果你有空间 - 而且,现在,20 Gb并不是那么多 - 就是使用辅助数据库。

您可以在另一个端口上安装MySQL服务器的第二个副本,并使其成为从属服务器。然后你将有两个相同的数据库(现场主人,现场奴隶)。

当您需要克隆测试数据库时,停止从属复制 - 活动从站将立即“冻结” - 并使用MySQLbackup或仅复制数据文件将活动从站备份到测试数据库。完成后,重新启动复制。

对实时主站的影响可以忽略不计,从站实际上可以用于非更新关键选择。

作者: LSerni 发布者: 29.05.2019 06:29
32x32