TYPO3 10.4:sys_history操作重执行及扩展表恢复方案咨询
TYPO3 10.4 恢复被TRUNCATE的数据表
关于sys_history的局限性
- sys_history仅存储单条记录的创建、编辑、删除操作日志,TRUNCATE TABLE属于整表级操作,不会被记录到sys_history中,因此无法通过原生sys_history功能直接恢复整表数据。
- 若自定义表此前有单条记录的编辑/删除日志,仅能恢复那些有记录的单条数据,无法复原全表。
可用扩展方案
- datahandler_history:该扩展可增强sys_history的记录范围,支持更多操作类型,但需提前安装配置才能生效,TRUNCATE操作发生后再安装无法补救。
- 备份类扩展(如
typo3-backup):这类工具用于定期备份数据库,同样需要事前配置,事后无法直接恢复已被TRUNCATE的数据。
PHP API代码示例(恢复sys_history中存在的单条记录)
如果自定义表的部分记录操作日志存在于sys_history中,可使用以下代码提取并恢复:
<?php use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Utility\GeneralUtility; // 替换为你的自定义数据表名 $targetTable = 'tx_yourextension_domain_model_yourtable'; // 查询sys_history中目标表的操作记录 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_history'); $historyRecords = $queryBuilder ->select('uid', 'recuid', 'tablename', 'newdata', 'tstamp') ->from('sys_history') ->where( $queryBuilder->expr()->eq('tablename', $queryBuilder->createNamedParameter($targetTable)), // 筛选删除/修改操作:1=创建,2=修改,3=删除,可按需调整 $queryBuilder->expr()->in('action', $queryBuilder->createNamedParameter([2, 3], Connection::PARAM_INT_ARRAY)) ) ->orderBy('tstamp', 'DESC') ->execute() ->fetchAllAssociative(); // 遍历恢复记录 $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($targetTable); foreach ($historyRecords as $history) { // 反序列化存储的记录数据 $recordData = unserialize($history['newdata'], ['allowed_classes' => false]); if (!empty($recordData)) { // 避免重复插入已恢复的记录 $existingRecord = $connection->select(['uid'], $targetTable, ['uid' => $history['recuid']])->fetchAssociative(); if (!$existingRecord) { $connection->insert($targetTable, $recordData); } } }
代码说明
- 务必替换
$targetTable为你的自定义数据表名称。 - 可根据需求调整
action筛选条件,匹配需要恢复的操作类型。 - sys_history的
newdata字段为序列化数组,需反序列化后使用。 - 建议先在测试环境验证代码逻辑,再在生产环境执行。
重要补充
若sys_history中无对应记录,上述代码无法恢复任何数据。此时可检查服务器是否开启了数据库二进制日志(binlog),若开启,可通过mysqlbinlog工具提取TRUNCATE操作前的数据进行恢复。
内容的提问来源于stack exchange,提问作者Stefano Danieli
相关产品推荐
相关产品推荐

