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

如何在同一台服务器上复制MySQL数据库,mysql,database,sync,replicate,Mysql,Database,Sync,Replicate,我有一个大型MySQL数据库,我们称之为live\u db,我想在同一台机器上复制它,以提供一个测试系统来使用(test\u db),包括表结构和数据。 我想定期用live_db的内容更新test_db;如果可能,增量 MySQL中是否有一些内置机制可以做到这一点?我认为主从复制不是我想要的东西,因为它应该可以改变test_db中的数据。不过,这些更改不必保留 问候, CGDmysql命令行客户端将接受来自标准输入的SQL语句流。因此,您可以通过管道将mysqldump的输出直接导入命令行上的m

我有一个大型MySQL数据库,我们称之为
live\u db
,我想在同一台机器上复制它,以提供一个测试系统来使用(
test\u db
),包括表结构和数据。 我想定期用
live_db
的内容更新
test_db
;如果可能,增量

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

问候,


CGD

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

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

如果您更喜欢MySQL迁移工具包,您可以在数据映射步骤中双击架构名称并更改目标架构名称。

Michaels answer我们工作得很好,但不会复制事件、存储过程或触发器

要复制这些,mysqldump还需要几个开关:
--事件--触发器--例程

要补充已制作的副本,请执行以下操作:


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

此解决方案工作正常,但如果您使用PHPunit进行单元测试,它将无法完成任务

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

解决这个问题的方法是使用配置文件

在我的例子中,我不想在配置文件和PHP代码中同时维护密码和用户,所以我从代码中生成配置文件,并检查它是否存在(否则,我直接在命令行中使用用户名和密码作为后备选项)

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

补充说明:

  • 我不得不在SQL语句中使用双引号(“)而不是单引号(”)

  • 我不得不用符号(&)来分隔不同的命令

  • 此示例不包括对新数据库名称的验证(isDestinationDbNameValid()方法)

  • 您还必须编写自定义方法来验证数据库副本是否按预期工作(isDestinationDbExist()方法)。 您至少应该验证数据库是否存在,安装程序中的表是否存在,或者验证存储程序是否存在

  • 明智地使用原力,我的朋友们


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

    对于所有mac用户,使用sequel pro,您需要做的就是进入数据库(菜单)->复制数据库。完成了!

    我已经在不同的环境中使用中小型数据库(1克到100克)做了几年了.mysqldump的快速和脏
    mysqldump
    适用于较小的数据集;数据集越小,效果越好

    当超过5-10GB时,根据MySQL负载的不同,快速和脏的将不再削减它

    为什么
    mysqldump
    可能还不够 MySQLdump的问题在于,当它转储时,实时数据库要么不可用,要么使用起来非常笨拙,要么备份将不一致。除非您有足够宽的时间窗口,此时实时数据库的不可用性并不重要,因为数据库无论如何都不需要使用(例如,深夜)

    默认选项(关于原因的讨论)会使数据库在转储时几乎不可用,除非其用途只是读取数据,而很少读取数据。在繁忙的电子商务网站上,您看到的是客户端堆积崩溃

    所以您使用InnoDB和modern选项(据我所知,不是默认选项)

    这允许站点在转储期间运行,尽管比正常速度慢。根据使用情况,它可能会明显地慢一些

    在进行此操作时,还可以转储其他可能很重要的数据:

    --events --triggers --routines
    
    (…哦,这仍然不会有转储的用户权限。要用作测试,可能它并不那么重要)

    我发现有一个变通方法是“建议”(!)作为“伟大的黑客”“,它基本上禁用事务完整性,允许数据库在转储时全速运行。有点像从你的车上拆下刹车来减轻它的重量,让它跑得更快,是的,它会起作用,但会有一些副作用,你可能不会马上注意到。你几乎肯定迟早会注意到它们——就像刹车一样,它会在你最需要它们的时候出现,而且不会很漂亮

    但是,对于测试数据库,它仍然可以工作

    Xtrabackup 如果你有一个“严肃”的数据库,你为什么不拥有它

    从复制 如果您有空闲空间的话,另一种可能性是使用辅助数据库,而现在,20GB并不是那么多

    您可以在不同端口的同一台服务器上安装MySQL服务器的第二个副本,并将其作为从属服务器(从存储速度来看,服务器将受到性能影响)。然后您将有两个相同的数据
    --single-transaction --skip-lock-tables
    
    --events --triggers --routines