我想对生产数据库中存在的数据进行一些分析。出于显而易见的原因,我维护了db(mysql)的本地副本,但是我有一些额外的要求:
我想轻松地将本地数据库与生产数据库同步。一个 我可以通过CLI执行的手动同步很好
我希望能够指定以下表格:
任何想法/工具如何做到这一点?我的本地设置是:MacOS,Sequel Pro,MySQL服务器
答案 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更改,而不是数据。