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