我有这个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很小很有用吗?
答案 0 :(得分:8)
是和否
如果您关心自己的记录历史记录不 。 您可以使用sys_history表还原对记录(内容,页面等)的更改。 sys_history表和sys_log表是相关的。截断sys_log时,您也无法回滚对系统的任何更改。您的客户可能不喜欢这样。
如果您只关心sys_log大小,则 IS 。 通过cron截断表格很好。
在TYPO3 4.6及以上版本中,您可以使用Table垃圾收集调度程序任务,pgampe说。对于低于4.5的TYPO3版本,您可以使用tablecleaner扩展名。如果从[N]天以后的sys_log中删除所有记录,您还将保留[N]天的记录历史记录。这对我来说似乎是最好的解决方案。
请首先尝试修复填充sys_log的内容; - )
答案 1 :(得分:7)
是的,是的。
另见other suggestions by Jochen Weiland关于保持TYPO3安装清洁和小型
答案 2 :(得分:6)
这有一个调度任务。
它被称为Table garbage collection (scheduler)
。
在TYPO3 4.7中,它只能清除sys_log
表。从TYPO3 6.0开始,它还可以清除sys_history
表。您可以配置要清理的天数和表。
扩展可以注册更多表来清理。
答案 3 :(得分:2)
简答:
不,这绝对不是一个好主意(除非您使用的是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
,并在主要版本升级时删除已删除= 1的记录。请务必先与编辑附近的人交谈,因为这样会删除整个历史记录。确保你想要这样做。在较新的TYPO3版本上,sys_log和sys_history之间不再存在这种关系问题。看看TYPO3 9中的突破变化#55298。
答案 4 :(得分:1)
大型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;