Mantain是一个与远程生产数据库同步的本地mysql数据库,用于测试

时间:2017-02-08 22:53:42

标签: mysql database testing synchronization

我想对生产数据库中存在的数据进行一些分析。出于显而易见的原因,我维护了db(mysql)的本地副本,但是我有一些额外的要求:

  1. 我想轻松地将本地数据库与生产数据库同步。一个 我可以通过CLI执行的手动同步很好

  2. 我希望能够指定以下表格:

    • 不应下载
    • 仅包含最近x天的数据
    • 应包含整个数据集
  3. 任何想法/工具如何做到这一点?我的本地设置是:MacOS,Sequel Pro,MySQL服务器

1 个答案:

答案 0 :(得分:2)

假设您可以从开发框直接访问生产系统,则可以轻松进行简单的转储和恢复:

mysqldump --single-transaction --host production -A \
  | mysql --host localhost

-A选项表示所有数据库,所有表。如果需要特定数据库,可以指定它们:

mysqldump --single-transaction  --host production \
  --databases eenie meenie miney moe \
  | mysql --host localhost

指定数据库是个好主意,因为这样您就不会转储和恢复存储MySQL密码和权限的mysql数据库。

还有一个--tables选项,但是从文档中使用它并不清楚,我很少使用该选项。不确定语法是什么。

如果您无法直接访问生产,则必须分两个阶段执行此操作,在服务器上运行一步以将数据转储到文件中:

mysqldump --single-transaction --databases eenie meenie miney moe \
  > dump.sql

然后将文件下载到本地工作站,然后将转储文件加载到MySQL数据库中:

mysql --host localhost < dump.sql

如果您想要更多灵活性,可以使用名为mydumper的社区工具,它可以让您列出数据库和数据库。表格成文件。这个工具是免费的,但您可能必须自己从源代码编译它。

不幸的是,只获得最后X天更加棘手。 创建时,数据没有隐含的概念。

Mysqldump有一个选项--where,因此您可以为每个转储数据的查询添加一个条件。但它只能按列名称对数据施加条件。例如,如果每个表中都有一个同名的时间戳列,则可以可靠地指示数据上次修改的时间(即,您始终使用触发器或其他内容维护它)。

mysqldump --single-transaction  --host production \
  --databases eenie meenie miney moe \
  --where "updatedAt > NOW() - INTERVAL 6 DAY" \
  | mysql --host localhost

如果你没有在每张表格中都有该栏目,那么这项工作就无法完成。

另一种方法是仅转储和恢复表定义,而不是数据。

mysqldump --single-transaction  --host production --no-data \
  --databases eenie meenie miney moe \
  | mysql --host localhost

然后,作为一个单独的步骤,使用服务器的二进制日志从六天前使用mysqlbinlog工具获取数据的所有更改。这个你必须在服务器上运行。

mysqlbinlog --start-datetime="2017-02-02 00:00:00" mysql-binlog.* \
  > replay.sql

...download replay.sql...

然后将这些更改加载到本地数据库中:

mysql --host localhost < replay.sql

这可能不是你想要的,因为&#34;持续六天的数据&#34;意思?如果您在过去4天内使用UPDATE修改数据,但修改后的数据最初是在16天前创建的,该怎么办? binlog是一系列SQL更改,而不是数据。