我将 PHP (Laravel 5.7) 应用程序连接到由 Galera 集群提供支持的数据库集群。我每晚都在运行 cron 作业以清除数据库表中成千上万的日志数据。我跑 Delete
MySQL根据时间戳范围删除表中行的语句。
我的删除操作看起来像
DB::delete('DELETE FROM incoming_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 DAY)');
DB::delete('DELETE FROM provisioning_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL '.Config::get('app.keep_provisioning_logs') .' DAY)');
注意:这些是在 Laravel 控制台命令和 Laravel 任务中安排的命令中定义的。
问题:
每次运行cron作业后删除大量数据:Main memory
数据库服务器的最大值,当我使用以下命令手动清除缓存内存时,我得到了我的 Main Memory
免费。
sync; echo 1 > /proc/sys/vm/drop_caches
我需要知道为什么缓存没有被自动回收,或者为什么在 cron 作业后我的内存耗尽以及我遇到的问题 too many connection
MySQL 错误。
或者这仅仅是因为我的数据库服务器(总共 3 个数据库服务器 在负载平衡器下并使用方铅矿同步)实时同步,所以当我尝试使用 cron 作业删除数千条记录时,服务器获取删除请求尝试删除和维护缓存以与其他数据库同步?我不确定发生了什么。请帮助我解决我的内存最大化问题。
我的架构:
一个负载均衡器(HA 代理下有三个数据库)和 galera 集群在这三个数据库之间同步数据。
最佳答案
你每晚都要删除一半的表?考虑每小时删除一个小时的值(value)。
你有 INDEX(created_at)
吗?这将有助于每小时清除一次,但可能不会每天清除一次。
此任务非常适合PARTITIONing
。
讨论了这些以及更多技术 here .
关于MySQL 服务器最大化内存,Galera 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53855998/