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

Chr*_*ich 49 mysql database sync replicate

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

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

问候,

CGD

Mic*_*ski 72

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
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果要还原到其他数据库,请不要在左侧使用--database orig_db参数.mysqldump将包含一个"use`orig_db`;" 在其输出中的语句,您将不会写入您在管道右侧指定的数据库.学到了一个艰难的道路.: - / (6认同)
  • 我用过mysqldbcopy:http://dev.mysql.com/doc/mysql-utilities/1.3/en/mysqldbcopy.html (5认同)
  • 正如我在上面的评论中所述,数据库目前为 12.9 GB 并且还在增长。做一个完整的转储需要大量的时间。 (2认同)
  • 你真的需要DROP | CREATE数据库:mysqldump无论如何都会包含DROP TABLE,所以除非你在测试数据库中生成表(因此除非手动DROPped仍然存在),否则你不需要前两行? (2认同)

Sam*_*und 6

迈克尔斯回答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


LSe*_*rni 5

我多年来一直在不同的环境中使用中小型数据库(1 G 到 100 G)进行此操作。mysqldump对于较小的数据集来说,快速而肮脏的工作;它们越小,效果就越好。

当你超过 5-10 GB 时,根据 MySQL 负载,快速和肮脏就不再有效。

为什么mysqldump可能还不够

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

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

所以你使用 InnoDB 和现代选项(据我所知,不是默认值)

--single-transaction --skip-lock-tables
Run Code Online (Sandbox Code Playgroud)

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

当您这样做时,还可以转储其他可能重要的数据:

--events --triggers --routines
Run Code Online (Sandbox Code Playgroud)

(...哦,这仍然不会转储用户权限。用作测试也许并不那么重要)。

我发现了一个“建议”(!)作为“伟大的黑客”的解决方法,它基本上禁用了事务完整性,允许数据库在转储时全速运行。有点像卸下汽车的刹车以减轻重量并让它跑得更快,是的,它会起作用,但它会产生一些您可能不会立即注意到的副作用。您几乎肯定迟早会注意到它们 - 就像刹车一样,这将是您最需要它们的时候,而且它不会很漂亮。

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

超备份

如果您有一个“严肃”的数据库,那么为什么不进行“严肃”的备份呢?

从机复制

如果您有空闲空间(现在 20 GB 已经不多了),另一种可能性是使用辅助数据库。

您可以在同一服务器上的不同端口上安装MySQL 服务器的第二个副本,并将其作为从属服务器(该服务器将在存储速度方面受到性能影响)。然后您将拥有两个相同的数据库(实时主数据库,实时从数据库)。第一次,您仍然需要运行完整转储以使它们同步,并处理其中涉及的所有问题。

当您需要克隆测试数据库时,停止从属复制 - 实时从属现在将保持“冻结”状态 - 并使用 MySQLbackup 或仅复制数据文件将实时从属备份到测试数据库。完成后,您可以重新启动复制。

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