求助如何查询一个月前的DML sql执行语句

想找回一个月前的一条数据,未开启general log ,但是开启了binlog,找不到binlog的存放目录
image

tiup看下pump组件的数据目录在哪,默认是在data.pump里

tiup cluster edit-config ${Cluster_Name}查看路径

1、部署一个drainer组件把binlog日志输出成日志文件, initial-commit-ts开始时间可以自己设置
https://docs.pingcap.com/zh/tidb/v6.5/tidb-binlog-configuration-file#drainer
2、通过 Reparo解析文件中的 binlog,下游服务类型取值为 print只做解析打印到标准输出,就可以在期中找到你需要的sql了
https://docs.pingcap.com/zh/tidb/v6.5/tidb-binlog-reparo

1 个赞

tidb的binlog包括2个组件,pump和drainer,pump负责收集各个节点的日志,drainer负责最终排序输出到下游,下游可以是文件,所以你得看下你drainer组件的配置,找到落文件的位置,可以通过tiup cluster show-config <cluseter_name>

image
看了一最早只有2023-11-10的 :grimacing:

好的,感谢,已经找到了,到时只有到11月10日的日志 :sob:

你看下pump设置了多久数据有效期

确实只有7天,想问下大佬开启general log对性能影响大吗,客户需求要180天的日志

这个一般在排查问题的时候临时开启,不建议长时间开启,会消耗很多资源。

一般没人会一直开着general log的,到之后日志都得多大,你搜的过来吗。。。。如果实在像记录,建议部署个elk,把日志存到es里吧。。。

1.先找到二进制日志(binlog)存放在哪儿。通常在 Linux 系统上是 /var/log/mysql,Windows 系统上是 C:\ProgramData\MySQL\MySQL Server 8.0\Data\。
2.确定一个月前的时间点对应的二进制日志文件。
3.查询一个月前的数据库操作记录。用以下命令:
mysql -e “SET GLOBAL log_bin_trust_function_names=1; SET GLOBAL log_bin_trust_timestamps=1; SELECT * FROM information_schema.general_log WHERE event_time >= DATE_SUB(NOW(), INTERVAL 1 MONTH) AND command_type = ‘Query’ AND argument LIKE ‘%INSERT%’ OR argument LIKE ‘%UPDATE%’ OR argument LIKE ‘%DELETE%’;”
这个命令会找出一个月内(截止到现在)的所有数据库操作记录。
3.根据查询结果,找出需要的数据。执行这些操作时,可能会影响数据库,所以在操作前先备份数据。

明白了,感谢

明白了,谢谢

三克油

:yum:商业版支持审计的要求,可以建议客户上线商业版。

1 个赞

开日志要定期备份日志吧

如果之前有br备份的话,可以考虑用br恢复相关的记录ddl执行的表到一个新的空集群里面,看看里面的记录。6.1应该是支持br的。不过如果之前没有做过br备份的话,这个方法临时想起来是用不了的。

https://docs.pingcap.com/zh/tidb/stable/backup-and-restore-overview

存储大量日志需要很多硬盘空间的,最好使用备份来解决

:yum:所以还是得养成经常备份的好习惯~