mysql每晚转储更新到本地vm

d4so4syb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(390)

为什么

我的公司会把每一个进入php的请求都记录到aws的数据库中,因为我们发现它在跟踪系统错误时非常有用。不幸的是,我们每天收到大约200000个请求,每个请求插入3-5个表(取决于请求是否有错误),因此存储日志的表会定期清除。
但是,我们希望将日志数据保留更长的时间,最好的方法是开始将其存储在本地,而不是在aws上。但是让每个请求都在本地连接php是不可行的(会导致系统严重减速)

怎么做

我已经决定处理这个问题的最佳方法是基本上只将过去24小时日志表的数据转储到本地计算机,然后清除从生产中转储的数据。生产将永远不会有超过24小时的数据,我们可以保留数据长达6个月的本地。

问题

理想情况下,我不希望编写php脚本在两个数据库之间传输大量数据。我认为可以用 mysqldump 将特定表的更新从一个数据库转储到另一个数据库,但我不知道如何进行(垃圾箱日志也是一样)
我的问题是:我如何使用 mysqldump 或者bin日志只从aws向本地数据库添加特定表中的行?

5hcedyr0

5hcedyr01#

要使用binlog,可以将所有binlog下载到本地示例,并使用 mysqlbinlog ,并使用它将它们加载到本地数据库中。看到了吗https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html
然后就可以在生产环境中截断表,而无需将截断表添加到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表,可以使用 sed 在本地重放binlog时过滤掉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上重放这些语句。当您每天插入转储文件时,它将积累越来越多的数据。

相关问题