You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

代码说明

  1. 务必替换$targetTable为你的自定义数据表名称。
  2. 可根据需求调整action筛选条件,匹配需要恢复的操作类型。
  3. sys_history的newdata字段为序列化数组,需反序列化后使用。
  4. 建议先在测试环境验证代码逻辑,再在生产环境执行。

重要补充

若sys_history中无对应记录,上述代码无法恢复任何数据。此时可检查服务器是否开启了数据库二进制日志(binlog),若开启,可通过mysqlbinlog工具提取TRUNCATE操作前的数据进行恢复。

内容的提问来源于stack exchange,提问作者Stefano Danieli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:20:27