我有这个 MySQL
DELETE FROM sys_log
WHERE sys_log.tstamp < UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL -2 MONTH))
ORDER BY sys_log.tstamp ASC
LIMIT 10000
如果我 cronjob,这对保持 sys_log 很小有好处吗?
我有这个 MySQL
DELETE FROM sys_log
WHERE sys_log.tstamp < UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL -2 MONTH))
ORDER BY sys_log.tstamp ASC
LIMIT 10000
如果我 cronjob,这对保持 sys_log 很小有好处吗?
是和否
如果你关心你的记录历史,那不是。您可以使用 sys_history 表恢复对记录(内容、页面等)的更改。sys_history 表和 sys_log 表是相关的。当您截断 sys_log 时,您也失去了回滚对系统的任何更改的能力。您的客户可能不喜欢这样。
如果您只关心 sys_log 大小,那就是这样。通过 cron 截断表格很好。
在 TYPO3 4.6 及更高版本中,您可以使用表垃圾收集调度程序任务 als pcampe 说。对于 4.5 以下的 TYPO3 版本,您可以使用tablecleaner扩展。如果您从 sys_log 中删除早于 [N] 天的所有记录,您还将保留您的记录历史记录 [N] 天。这对我来说似乎是最好的解决方案。
请首先尝试修复填充您的 sys_log 的内容 ;-)
是的。
另请参阅Jochen Weiland关于保持 TYPO3 安装干净和小巧的其他建议
为此有一个调度程序任务。
它被称为Table garbage collection (scheduler)
。
在 TYPO3 4.7 中,它只能清理sys_log
表。从 TYPO3 6.0 开始,它还可以清理sys_history
桌子。您可以配置天数和要清理的表。
扩展可以注册更多的表来清理。
Since TYPO3 9, the history is no longer stored using sys_log.
You can safely delete records from sys_log.
请参阅重大更改 #55298。
简短的回答:
不,这绝对不是一个好主意(除非您使用的是 TYPO3 9 或更高版本,请参阅本文底部的注释)。如果您真的想从 sys_log 中删除内容,请记住 sys_history 仍在引用它。你也应该对 sys_history 做同样的事情。
或者,只需执行以下操作:
DELETE FROM sys_log WHERE NOT EXISTS
(SELECT * FROM sys_history WHERE sys_history.sys_log_uid=sys_log.uid)
AND recuid=0 AND tstamp < $timestamp LIMIT $limit
随意根据您的要求对其进行优化。
您还可以安全地(不影响 sys_history)删除带有 sys_log.error != 0 的记录。
还有一些建议:
truncate sys_log
。truncate sys_history
不过,请务必先与编辑附近的人交谈,因为这将删除整个历史记录。确保您愿意这样做。对于调度程序任务“表垃圾收集”,请参阅文档:https ://docs.typo3.org/c/typo3/cms-scheduler/master/en-us/Installation/BaseTasks/Index.html
大表的另一个常见原因sys_log
是 TYPO3 安装中使用的扩展之一中的问题/错误。
使用旧版本的常见示例tx_solr
:
Core: Error handler (FE): PHP Warning: Invalid argument supplied for foreach() in typo3conf/ext/solr/classes/class.tx_solr_util.php
Core: Error handler (FE): PHP Warning: array_reverse() expects parameter 1 to be array, null given in typo3conf/ext/solr/classes/class.tx_solr_util.php line 280
这组记录每隔一分钟左右就会弹出sys_log
一次,从而在短时间内产生数百万条记录。
幸运的是,这些记录对记录历史和相关的回滚功能没有任何影响sys_history
,因此删除它们是安全的。
如果你有一个大的sys_log
,这可能会导致LOCK
超时问题,所以你必须限制删除查询:
delete from sys_log where details LIKE 'Core:%' LIMIT 200000;