为什么
我的公司会把每一个进入php的请求都记录到aws的数据库中,因为我们发现它在跟踪系统错误时非常有用。不幸的是,我们每天收到大约200000个请求,每个请求插入3-5个表(取决于请求是否有错误),因此存储日志的表会定期清除。
但是,我们希望将日志数据保留更长的时间,最好的方法是开始将其存储在本地,而不是在aws上。但是让每个请求都在本地连接php是不可行的(会导致系统严重减速)
怎么做
我已经决定处理这个问题的最佳方法是基本上只将过去24小时日志表的数据转储到本地计算机,然后清除从生产中转储的数据。生产将永远不会有超过24小时的数据,我们可以保留数据长达6个月的本地。
问题
理想情况下,我不希望编写php脚本在两个数据库之间传输大量数据。我认为可以用 mysqldump
将特定表的更新从一个数据库转储到另一个数据库,但我不知道如何进行(垃圾箱日志也是一样)
我的问题是:我如何使用 mysqldump
或者bin日志只从aws向本地数据库添加特定表中的行?
1条答案
按热度按时间5hcedyr01#
要使用binlog,可以将所有binlog下载到本地示例,并使用
mysqlbinlog
,并使用它将它们加载到本地数据库中。看到了吗https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html然后就可以在生产环境中截断表,而无需将截断表添加到binlog中。这样,生产中的表将被截断,但是当您针对本地mysql重放binlog时,本地mysql不会被截断。
但这是有风险的,因为即使有一天您忘记跳过truncate table语句的binlog,它也会在您的本地mysql中截断该表中的所有数据!
如果不能从binlog中省略truncate表,可以使用
sed
在本地重放binlog时过滤掉truncate table语句。这只是一个例子。你可能需要更彻底地了解这个模式。我没试过。
对于mysqldump,您只能转储数据,而不需要通常添加到转储中的drop table/create table语句。
然后转储应该只包含很多insert语句,您可以在本地mysql上重放这些语句。当您每天插入转储文件时,它将积累越来越多的数据。