我的公司将每个访问PHP的请求记录到AWS中的数据库中,因为我们发现在追踪系统中的错误时非常有用。不幸的是,我们每天收到大约200,000个请求,每个请求都插入3-5个表(取决于请求是否有错误),因此存储我们日志的表会定期清除。
但是,我们希望将日志数据保持更长时间,最好的方法是开始在本地存储,而不是在AWS上存储。但是,为每个请求在本地连接PHP都是不可行的。 (会导致MAJOR系统减速)
我已经决定处理此问题的最佳方法是将日志表的过去24小时数据基本上只转储到本地计算机,然后清除从生产转储的数据。生产的数据永远不会超过24小时,我们可以将数据保存在本地长达6个月。
理想情况下,我宁愿不编写PHP脚本来在两个数据库之间传输大量数据。我认为可以使用mysqldump
将特定表的更新从1个数据库转储到另一个数据库,但我不知道如何。 (bin日志也一样)
我的问题:如何使用mysqldump
或bin日志从仅将行从特定表添加到AWS的本地数据库?/ p>
答案 0 :(得分:1)
要使用binlogs,,您可以将所有binlogs下载到本地实例,并使用mysqlbinlog
将它们转换为SQL,并使用它们将它们加载到本地数据库中。见https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html
然后,您可以在生产上截断表,而无需将truncate table添加到binlog中。这样你的生产中的表将被截断,但是当你对本地MySQL重放binlog时,本地MySQL不会被截断。
SET SESSION sql_log_bin=0;
TRUNCATE TABLE <tablename>;
SET SESSION sql_log_bin=1;
但这有风险,因为如果你忘记在一天之前忘记TRUNCATE TABLE语句的binlog,它将截断本地MySQL中该表的所有数据!
如果您不能从binlog中省略TRUNCATE TABLE,则可以在本地重播binlog时使用sed
过滤掉TRUNCATE TABLE语句。
mysqlbinlog <binlogs> | sed -e '/^TRUNCATE TABLE/d' | mysql ...
这只是一个例子。您可能需要对模式更加彻底。我还没有测试过它。
对于mysqldump,,您只能转储数据,而不需要通常添加到转储中的DROP TABLE / CREATE TABLE语句。
mysqldump --single-transaction --no-create-info mydatabase mytable ...
然后转储应该只包含很多INSERT语句,你可以用你的本地MySQL重放它。每天插入转储时,它会累积越来越多的数据。