尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SQL Server 2008误删数据恢复:恢复模式与日志备份实战
简介针对 SQL Server 2008 数据库误删数据恢复难题这份 doc 文档面向 DBA、运维与开发人员系统讲解恢复前提与实战路径。内容先厘清恢复模式仅完全模式可恢复及两个前提——误删前完整备份、恢复模式为 Full随后按三种场景分别给出处理思路重点演示场景二在无完整备份时借助 Recovery for SQL Server 从事务日志找回误删记录的操作流程并说明与 Log Explorer、SQL Log Rescue 等工具的适用性对比。资源为单个 Word 文档共 1 个文件大小仅 359KB适合遇到紧急误删、需要快速查阅恢复步骤的读者直接下载使用。已有 1823 人学习下载文档围绕真实案例展开包含备份/恢复 SQL 语句、恢复模式配置提醒、第三方工具界面级操作指引和排错要点可帮助读者形成从备份缺失到数据找回的完整应对方案。1. SQL Server 2008 误删数据恢复先看恢复模式再决定救法某开发者打来电话时语气都在抖——他在 SQL Server 2008 上执行了一条 DELETE 语句两个业务表的所有记录全部清空而这个库从建成起就没有做过完整备份。这类 SQL Server 2008 数据库误删除数据的恢复问题处理思路其实很清晰先查恢复模式是不是完全Full再查有没有误删前的备份。这两个前提的不同组合直接决定了三条路有备份完全模式用三条 T-SQL 语句就能还原无备份完全模式要靠第三方工具从事务日志里把删除记录捞回来恢复模式是简单Simple那基本没有后悔药。这篇笔记记录的是无备份完全模式这条最麻烦路径的完整过程也包含有备份场景下的标准还原命令。适合 DBA、运维工程师以及所有手上管着业务库的后端开发者——不管你是临时救火还是提前加固这里面的参数和坑都值得你先存一份。2. 恢复模式与事务日志链为什么完全模式是唯一后悔药在动手恢复之前先搞清楚一个关键问题为什么恢复模式和完整备份决定了你能不能救回来。很多新手遇到误删第一反应是去翻网上的恢复工具但工具能起作用的底层前提是日志还保留着足够的信息。这一章把恢复模式的机制和日志链的概念讲清楚后面所有命令你才能理解每一步到底在干什么。2.1 恢复模式决定命运完全、简单与大容量日志SQL Server 2008 的数据库恢复模式一共有三种简单Simple、完全Full和大容量日志Bulk-Logged。简单模式下数据库引擎在每次检查点CHECKPOINT之后就会自动截断事务日志把已经提交事务占用的日志空间标记为可重用。这意味着误删除操作对应的日志记录很快会被覆盖时间点恢复无从谈起。完全模式则不会自动截断日志会持续累积直到你做了一次日志备份才截断。大容量日志模式介于两者之间它支持日志备份但大批量操作的日志记录被做了最小化处理时间点恢复的完整性没有保证。用一张表把三种模式的关键差异列出来方便对照| 恢复模式 | 日志自动截断 | 支持日志备份 | 支持时间点恢复 | 适用场景 | | 简单 | 检查点即截断 | 不支持 | 不支持 | 开发库、测试库、可容忍丢失数据的业务 | | 完全 | 仅日志备份后截断 | 支持 | 支持 | 生产业务库、需要审计与恢复的库 | | 大容量日志 | 仅日志备份后截断 | 支持 | 部分支持 | 大批量导入时的临时切换 |提示判断当前数据库恢复模式最简单的方式是在 SSMS 里右键数据库 → 属性 → 选项 → 恢复模式也可以用 T-SQL 查 sys.databases 目录视图。实战中我接过很多数据库挂在简单模式的救火请求最后基本都只能摇头。其中一个开发库每周日做一次完整备份平时跑的是批处理程序每天定时 DELETE 再 INSERT。某次 DELETE 语句误删了整个主表去找日志才发现检查点一过日志空间已经被新事务覆盖了。所以判断恢复模式是整个过程的第一步也是唯一不能跳过的步骤。2.2 事务日志记录了什么STOPAT 的还原原理事务日志说白了就是一个按 LSN日志序列号顺序追加写入的文件它记录了每一个事务的开始、修改、提交和回滚。你在完全恢复模式下执行 DELETE 时被删除的每一行原来的值都以日志记录的形式保存在日志文件里这就是时间点恢复的数据基础。很多人以为 DELETE 之后数据就没了其实在完全模式下只要日志没被截断那些已删除的行还以日志记录的形式活在文件里。RESTORE LOG ... WITH STOPAT 之所以能回到过去是因为恢复引擎会从完整备份开始按顺序重放日志备份中的事务记录。重放到某个时间点时如果某个日志记录的事务提交时间晚于 STOPAT 指定的时间该事务会被回滚。换句话说STOPAT 不是把物理文件快照恢复而是把事务日志重放了一遍在重放链上找到了你指定的那个时间点。这个机制也解释了为什么恢复模式必须是完全只有在完全模式下日志里才保留了完整的事务明细简单模式下日志早就被截断重放根本没有素材。这个机制解释了三个实战现象第一恢复模式必须是完全第二你至少需要一个完整备份作为重放起点第三从完整备份到误删时刻之间日志链不能断——中间任何一段日志备份缺失重放就会停在那里后面的记录再翻不出来。所以日常维护时定期做日志备份不只是为了备份数据更是为了在将来某一天误删时留下一条能走回过去的完整链路。2.3 备份链路的最小闭环完整备份加日志备份缺一不可很多人以为有完整备份就能恢复这是最常见的误读。如果只有完整备份你恢复出来的数据只能停留在备份完成的那一刻备份之后到误删之前的更新、插入、删除全部丢失。要恢复到误删前几分钟你必须拥有完整的日志链一个误删之前的完整备份作为起点完整备份之后到误删时刻之前的所有日志备份作为重放素材再加上误删之后立即手动备份的一份当前事务日志把误删这个动作本身也包进日志里。我一般会在误删发生后第一时间执行 BACKUP LOG哪怕当时还没有完整备份这一步也能把日志文件尾部的记录封存下来避免后续日志截断导致可用信息丢失。这里的优先级是先冻结日志尾巴再研究恢复方案顺序不要反。误删之后不要贸然重启 SQL Server 服务也不要做任何会导致检查点的操作因为一旦日志被截断后面所有努力都会白费。日常备份策略的最小闭环应该是这样每周做一次完整备份每天做一次差异备份每小时或每 15 分钟做一次日志备份。这套组合既能控制日志文件大小又能保证任何误删发生时最多只丢失十几分钟的数据。如果你管理的库还处于只有完整备份、没有日志备份的状态那遇到误删就只能碰运气了。3. 有备份有日志T-SQL 三步还原到误删前命令与参数详解如果误删前的完整备份存在恢复模式也是完全那恭喜你这是最理想的情况。整个恢复过程只需要三条语句顺序不能乱参数也不能写错。这一章把每一步的命令、参数含义和容易出错的地方讲透。3.1 恢复前的三条检查恢复模式、备份文件与日志链动任何恢复命令之前先花两分钟确认三项内容。第一恢复模式是不是完全这点可以直接查 sys.databases 目录视图。第二手头有没有误删之前的完整备份备份文件的时间点必须在误删时刻之前。第三完整备份之后到误删时刻之间日志是否连续可回溯如果中间有一次完整备份或者日志备份断档后面的还原就会失败。顺手写一段检查脚本通常我在救火现场会先跑一遍-- 检查恢复模式1 表示 FULL0 表示 SIMPLE SELECT name, recovery_model, recovery_model_desc FROM sys.databases WHERE name YourDatabase; -- 查看所有备份文件及备份时间 SELECT database_name, type, backup_finish_date, physical_device_name, backup_size FROM msdb.dbo.backupset bs JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id bmf.media_set_id WHERE database_name YourDatabase ORDER BY backup_finish_date DESC;这里recovery_model_desc如果返回FULL说明恢复模式没问题第二段查询能列出这个库历史上做过的所有备份从backup_finish_date可以判断完整备份是否早于误删时间点。type字段中D表示完整备份、I表示差异备份、L表示日志备份这三类文件的清单就是你构建恢复链的基础素材。如果查不到任何D类型的备份记录那只能走第三方工具路线直接跳到下一章。3.2 前两步备份当前日志并还原完整备份确认三个前提都满足后第一步是备份当前事务日志。这一步的作用是封存误删之后日志文件尾部的所有记录防止后续操作触发日志截断而丢失还原素材。注意这一步一定要用WITH NORECOVERY让数据库进入正在还原状态不再接受业务写入-- 第一步备份当前活动事务日志同时将数据库置于还原中状态 BACKUP LOG [YourDatabase] TO DISK ND:\Backup\YourDatabase_log_tail.trn WITH NORECOVERY;WITH NORECOVERY是这个命令的关键它执行完备份后会立即将数据库切换到 Restoring 状态。这个状态下的数据库既不能读写也不能被其他用户访问但它是后面串联还原链的必要条件。执行完这一步后如果你的 SSMS 里数据库名称后面出现了正在还原字样不要慌张这是预期行为。备份文件名我习惯带日期和_tail后缀比如_20240115_tail.trn明确标识这是误删后抓取的日志尾部避免和日常日志备份混淆。第二步恢复误删之前的完整备份-- 第二步恢复误删前的完整备份继续保持还原中状态 RESTORE DATABASE [YourDatabase] FROM DISK ND:\Backup\YourDatabase_full_20240114.bak WITH NORECOVERY, REPLACE;这条命令把完整备份文件中的数据库结构、表数据和日志起点整体还原出来。WITH NORECOVERY再次出现表示这次还原还没有结束后续还要继续应用日志备份所以不让数据库上线。REPLACE参数表示允许用备份文件覆盖当前同名的数据库它绕过了 SQL Server 对同名数据库的校验。使用REPLACE前务必确认当前库里的数据已经不需要了因为这一步是不可逆的。3.3 第三步STOPAT 时间点还原与 RECOVERY 收尾完整备份还原完成后数据库还处于 Restoring 状态这时候轮到第三步把日志备份重放到误删前的那一刻-- 第三步将日志恢复至误删前的时间点并完成还原 RESTORE LOG [YourDatabase] FROM DISK ND:\Backup\YourDatabase_log_tail.trn WITH STOPAT N2024-01-15T14:30:00, RECOVERY;STOPAT指定时间点这里是整个恢复操作的核心。时间格式建议统一用 ISO 8601 的yyyy-MM-ddTHH:mm:ssT是日期和时间的分隔符不要写成带空格的格式以免不同语言区域解析出偏差。RECOVERY参数表示还原链已经结束数据库将回到在线状态用户可以访问。从这一刻起数据库里的数据就是误删前那一刻的状态理论上误删的指令不会重放进来。这里有一个小技巧如果你不知道误删的精确时间可以先不写RECOVERY改用WITH STOPAT N时间点, NORECOVERY让数据库保持 Restoring 状态然后反复尝试不同时间点观察恢复出来的行数是否与实际业务对得上。确认无误后再补一条RESTORE DATABASE [YourDatabase] WITH RECOVERY上线数据库。这种做法在时间点不确定时非常管用属于救火现场的标准操作。4. 无备份时启动第三方工具Recovery for SQL Server 的完整恢复流程绝大多数悲剧场景是第二种恢复模式是完全但从来没有做过完整备份。这种情况下 SQL 语句还原无路可走只能靠第三方工具从日志文件本身去挖数据。这一章记录的是一条完整可复现的工具恢复流程以及过程中的关键选型和产物处理。4.1 工具选型为什么 2008 比其他版本更难找恢复工具SQL Server 2008 这个版本在恢复工具生态里有点尴尬。早期很多免费或半免费的日志分析工具在 2005 时代还活跃到了 2008 就纷纷停更。我当时的排查顺序是先试 Log Explorer for SQL Server装上才发现它只支持到 2000 和 2005打不开 2008 的日志结构。接着试 SQL Log Rescue同样不支持 2008。再往下找发现某款 SQL Recovery 工具支持 2008但 Demo 版没有实际恢复功能需要购买授权才能导出数据试用等于没用。最终锁定的是 Recovery for SQL Server它支持 2008而且 Demo 版可以直接恢复数据限制是数据库文件不能超过 24GB。这个限制在当时的场景里正好够用——业务库的 MDF 文件不到 20GB。如果你遇到的库比 24GB 大那就需要评估是购买正式版还是换用其他能处理大文件的商用工具但无论如何操作思路是通用的让工具直接读取 MDF 和 LDF 文件扫描日志中的删除记录并反向生成 INSERT 语句。4.2 九步恢复流程从 MDF 到生成 SQL 脚本工具界面不算复杂但每一步的设置都会影响恢复结果我按实际走通的路径把操作拆成九步以管理员权限运行 Recovery for SQL Server。读取数据文件和日志文件需要绕过文件占用限制普通权限下后续步骤可能报文件被独占之类的错。点击菜单 File → Recover在文件选择对话框里选中要恢复的数据库的数据文件.mdf。工具会自动读取文件头信息识别出对应的数据库名称、版本和文件组结构。进入 Recovery Configuration 界面选择 Custom 模式。这里的默认选项是 QuickQuick 只做基本的结构读取不会深入日志文件分析Custom 才会暴露日志路径和删除记录搜索选项必须选 Custom。在 Recovery options 窗口里勾选 Search for d (deleted) records 选项然后在 Log file path 中指定该数据库的日志文件路径。这一步是找回被 DELETE 记录的核心开关不勾选的话工具只恢复现有数据误删的内容根本不会被扫描出来。配置 Destination folder也就是输出目录。工具会把恢复过程中生成的 SQL 语句和 bat 文件都写到这个文件夹里。建议选一个空间充足的磁盘数据的删除记录转成 INSERT 语句后文本量可能达到原始数据量的几倍。点击 Start 开始恢复操作。工具会先扫描 MDF 和 LDF把与删除操作相关的记录抠出来并生成脚本文件同时弹出新的 SQL Server Database Creation Utility 窗口进入导入环节。在工具窗口中选择被恢复数据存放的目标数据库。这里我会单独新建一个临时库比如 Restored_Temp而不是直接选原来的业务库。原因在后文避坑章节展开——恢复到临时库再人工核对、挑选、回灌比直接把原来库整个覆盖要安全得多。选择 Import available data both database and log files即同时导入数据库和日志文件中的可用数据。这一步保证既有当前现存的数据也包含从日志里恢复出来的已删除记录两者合并后才能得到完整结果。点击 Next 完成导入。恢复出来的表会出现在目标库中此时需要人工核对行数、抽查关键字段确认没有缺页或乱码后再决定如何回灌到正式环境。4.3 恢复产物怎么用SQL 脚本与 bat 文件的执行逻辑恢复操作并不是点完 Next 就结束。工具在目标文件夹里生成的 SQL 文件和 bat 文件才是整个恢复工作的核心产物。SQL 文件里一般包含三类内容建表语句、SET IDENTITY_INSERT 开关、批量 INSERT 脚本。bat 文件则是把这些 SQL 脚本按顺序执行起来的批处理封装。我一般会在目标库中按脚本文件名顺序执行sqlcmd -S . -d Restored_Temp -E -i 001_create_tables.sql sqlcmd -S . -d Restored_Temp -E -i 002_identity_on.sql sqlcmd -S . -d Restored_Temp -E -i 003_insert_records.sql cmd /c 004_check_counts.bat-S .表示连接本机-d指定目标数据库为 Restored_Temp-E使用 Windows 身份认证-i指定输入脚本文件。执行顺序必须按文件名编号来先建表再打开自增列插入开关然后批量导入数据。最后那个004_check_counts.bat是工具生成的核对脚本通常会把恢复表与原日志中的记录数做对比输出差异结果。如果某一步执行失败先不要继续往下跑直接查 sqlcmd 抛出的错误信息大多数情况是目标库中已存在同名对象或者自增列冲突需要先清一遍目标表。提示批量执行大量 INSERT 脚本时建议在 sqlcmd 后面加-b参数这样遇到错误会返回非零退出码bat 脚本就能中断执行不会把错误一路带到最后一步。5. 避坑指南日志截断、时间点偏差与工具限制的五个坑这章写的每一条都是实际救火时踩过的坑按现象 → 原因 → 解决展开。遇到相同现象时直接对号入座。5.1 现象一执行备份或还原时报数据库正在使用恢复操作进行到一半SQL Server 报错无法获得对数据库的独占访问权然后整个还原链卡住。原因是数据库有业务连接或者 SSMS 窗口占着连接还原操作要求独占访问冲突了。解决方式是把数据库切到单用户模式强制断开其他连接ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO -- 还原操作结束后恢复多用户模式 ALTER DATABASE [YourDatabase] SET MULTI_USER; GOWITH ROLLBACK IMMEDIATE会强制踢掉所有活动连接把数据库切到单用户。切单用户前最好确认没有正在跑的重要事务否则会直接回滚。我一般会在业务低峰期操作并通知应用方暂停连接。5.2 现象二STOPAT 时间点选错恢复出的数据中间断了一截用第三步还原出来后对账发现某个时间段的数据还是缺失行数对不上。原因是 STOPAT 指定的时间是发现误删的时间不是 DELETE 语句实际提交的时间。DELETE 本身可能执行了十几分钟而这期间还有其他事务穿插提交STOPAT 卡在中间就把部分事务排除了。解决方法是先不要指定RECOVERY用WITH NORECOVERY保持还原状态尝试多个候选时间点每次还原后用查询语句统计目标表的行数直到行数和业务侧记忆一致再补RESTORE DATABASE ... WITH RECOVERY收尾。5.3 现象三第三方工具 Demo 版提示数据库文件超过 24GB工具能正常打开 MDF但在扫描日志阶段提示数据库文件超过 Demo 版允许的 24GB无法继续恢复。原因是工具的限制针对的是数据文件实际大小不是逻辑数据库总大小MDF 超过 24GB 就走不了免费路线。解决方式三种一是把 MDF 数据文件瘦身后再试比如先把大日志表归档删除但注意瘦身动作本身会写入日志可能覆盖删除记录二是购买正式版授权三是换支持更大文件的工具重新扫描。实际抢救时如果库足够重要就不要在这个环节省钱数据价值通常远大于工具授权费用。5.4 现象四恢复出的表数据完整但外键关系和自增列对不上用工具导入临时库后发现表数据都有但外键校验全红子表数据关联不到主表自增列的值和原库冲突。原因是工具生成的 INSERT 语句顺序没有按表依赖关系排列先插了子表后插主表外键自然校验失败自增列冲突则是因为目标库已经存在同 ID 记录。解决方法是先导入主表再导入子表导入前清空目标表的数据并用SET IDENTITY_INSERT强制插入原自增值。我在实际操作中会写一段脚本按 sys.foreign_keys 视图的依赖层级排序再批量执行导入避免手工一个个调整顺序。5.5 现象五误删之后业务又写入新数据恢复后两边数据混合冲突误删发生后业务系统没有停又产生了大量新交易。第三方工具扫描日志时把误删之后的正常操作也当成待恢复数据混了进来导致恢复出的临时库里既有误删前的记录又有误删后的新记录行数比预期多出一截。原因是工具的 Search for deleted records 只认日志里被删除的记录无法区分这条删除是误删还是业务正常删除。解决方式是不要把工具恢复结果直接切到生产库而是恢复到临时库人工按主键剔除误删之后的新数据再把干净的历史记录通过 INSERT 语句回灌到原库。整个过程相当于把日志恢复和业务补偿合并处理切勿一键切换。6. 恢复后的验证与加固让误删事故到此为止6.1 恢复结果的验证方法数据恢复完成不等于事情结束上线前至少要做三样核对第一比对关键表的行数是否与业务侧确认的预期一致第二抽查几天前的数据明细确认字段没有乱码、数字没有溢出第三检查约束和外键确保恢复出的数据能支撑业务继续运行。如果恢复产物是临时库中的脚本回灌前把IDENTITY_INSERT关掉再确认最大自增值已经更新到合适位置否则后续插入新纪录时主键冲突会立刻爆出来。6.2 一条懒人可用的加固底线经历了这一次之后我给所有经手的 SQL Server 2008 库都定了一条最低底线恢复模式必须设成完全且至少保留最近一轮完整备份和连续的日志备份链。落地配置很简单ALTER DATABASE [YourDatabase] SET RECOVERY FULL; GO SELECT name, recovery_model_desc FROM sys.databases WHERE name YourDatabase;恢复模式切到完全后日常备份作业按完整每周、日志每 15 分钟的节奏跑日志文件需要定期收缩或备份后截断否则磁盘会被撑爆。如果你管理的库用的是简单模式趁没出事赶紧改过来这可能是你将来唯一的后悔药。从那以后我每次接手新库的第一件事就是检查恢复模式和备份链每次执行可能改动数据的脚本前也会强制先备份一次日志。这条习惯看起来机械但真正救过我两次。希望这份经验能帮你在误删发生时少走弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

STM32与PJ85718DM协同实现本地及RS485远程温度监测系统

STM32与PJ85718DM协同实现本地及RS485远程温度监测系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:47:11
基于STM32F412RE与PJ85718DM的HVAC双点测温方案

基于STM32F412RE与PJ85718DM的HVAC双点测温方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:47:11
基于PJ85718DM与R7FA6M3AH3CFC的嵌入式温度监测系统设计

基于PJ85718DM与R7FA6M3AH3CFC的嵌入式温度监测系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:42:11
MORE NEWS

更多资讯

📰

OpenCore Legacy Patcher 3.0.0 上手指南:老 Intel Mac 安装最新 macOS 全流程

OpenCore Legacy Patcher 3.0.0 上手指南:老 Intel Mac 安装最新 macOS 全流程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy P…

📰

RevokeMsgPatcher 微信防撤回补丁:改几个字节,撤回消息本地留底

RevokeMsgPatcher 微信防撤回补丁:改几个字节,撤回消息本地留底 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址…

📰

10 分钟上手 AxisRL:从 Docker 环境到第一条 GRPO 训练命令的完整新手指南

【免费下载链接】axrl AxisRL is an agentic RL post-training framework built on SGLang rollout, Megatron training, and real-world agent workflows. 项目地址: https://gitcode.com/gh_mirrors/ax/axrl 点击查看 免费下载 AxisRL 是一个面向 agentic RL 的 …

📰

焊盘掉了别直接扔板:这招飞线修复,省了几千换板成本

干修板这行,谁没碰过掉焊盘的糟心事?拆芯片没等锡化透就敢硬撬,老板子常年高温烤得铜皮发脆,稍微用点力,“啪”一下焊盘连带表层走线掀起来一小块。新手一瞅直接慌神,完了,板废了,要…

📰

免费换回Win10任务栏:ExplorerPatcher教程

免费换回Win10任务栏:ExplorerPatcher教程 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher是免费开源(…

📰

浏览器相关工具推荐:别再只会装一个 Chrome,真正好用的是这些插件和增强玩法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬