ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SQL Server手动数据库完整备份还原实战指南

SQL Server手动数据库完整备份还原实战指南 SQLServer手动数据库完整备份还原听起来像是每个跟数据库打交道的人入职第一天就该掌握的技能但我实际见过不少写了几年代码的同事真到需要拿一个.bak文件去救数据的时候手还是抖的。右键菜单人人都会点真正的难点藏在细节里备份集是否完整、还原时该选哪个恢复状态、为什么明明选对了文件却提示“数据库正在使用”、备份文件放到另一台机器上为什么路径全变了。这些问题不翻一次车很难长记性。这篇分享适合刚接手SQLServer运维的开发、测试和初级DBA内容全部围绕SSMS图形化界面的手动完整备份与还原展开。完整备份是数据库保护体系的地基很多自动化备份方案背后的原理就是它把图形界面的手动流程彻底吃透后面接触差异备份、日志备份、AlwaysOn备份策略都会轻松很多。看完之后你至少能独立完成一次“把数据库备份到本地磁盘再换一个实例把数据还原回来”的完整闭环演练顺带学会排查最常见的几种翻车现场。1. 备份还原到底在解决什么问题1.1 三种备份类型怎么选SQLServer的备份类型看起来很多但手动操作时接触最多的是三种完整备份、差异备份、事务日志备份。很多人第一次点开“备份”对话框会懵因为备份类型下拉框里可选的东西不止一个到底选哪个完整备份备份的是整个数据库的全部数据页加上足够的事务日志让备份集能还原成一个一致性状态。简单理解就是给整个数据库拍一张高清快照这张快照里包含了所有数据文件和日志文件的关键信息。差异备份只备份自上次完整备份以来变化的数据页体积小、速度快但它本身不完整必须依赖上一次完整备份才能还原。事务日志备份只备份日志里记录的事务单独拿出来没有任何意义必须配合完整备份差异备份按时间点逐步还原。手动应急场景下优先做完整备份这是最稳妥、最不容易出错的方案。差异备份和日志备份更多用于自动化备份策略和高频备份场景手动情况下如果备份频率不高直接每周甚至每天做一次完整备份反而更省心。我的习惯是手动操作一律完整备份不玩花的。1.2 完整备份的原理为什么它是“地基”完整备份在工作原理上并不神秘。SQLServer在备份启动时会先记录当前数据库的LSN起点然后扫描数据库中的数据页把需要备份的区全部读出来写入备份文件同时备份过程中发生的新事务日志也会被纳入这个备份集写入文件的日志尾部。所以完整备份不只是一个数据页的简单复制它把“数据快照”和“日志截止点”绑定在了一起这就保证了还原之后的数据是内部一致的。用生活里的例子来说这就好比房间里有一堆书你不仅把所有书的内容拍照存档还记录了拍照过程中新送进来那几本书的编号。这样未来任何时候拿这套照片和记录去“还原”房间里的书就是某一个时间点上完整、可信的样子。明白这个原理之后你就能理解为什么还原时会有“恢复状态”这么一说因为备份文件里除了数据还有日志尾巴还原的时候SQLServer需要决定这个日志尾巴要不要继续应用、数据库要不要立刻对外提供访问。这也是很多新手卡住的地方后面我会专门展开。1.3 什么时候该手动做完整备份手动完整备份不是每天都要做的事但有几种场景特别适合它。第一个场景是数据库迁移比如从旧服务器迁到新服务器很多人用分离附加但分离附加需要停业务、还可能把文件弄丢而备份还原全程在线业务不受影响迁完后比对数据行数就能收工。第二个场景是版本升级从SQLServer 2016升到2019建议先在测试环境做备份还原验证确认无兼容性问题后再动生产。第三个场景是危险操作前比如要批量改数据、删大表、重跑存储过程先手动备份一份出了事能原地回滚。还有一个经常被忽略的场景上线演练。每次项目发布前把生产库备份到预发环境做全链路的数据验证这种事我建议形成固定习惯。手动备份虽然听起来简单但“敢不敢在关键时刻点下还原”这个胆量是靠平时一次一次演练喂出来的。2. 动手之前的准备工作2.1 先检查环境版本、服务、权限别着急点右键先花两分钟确认环境这一步能免掉后面80%的报错。打开SSMS连上实例之后先看一眼对象资源管理器顶部显示的版本号是SQLServer 2016还是2019顺手确认一下实例名是不是默认实例。版本信息很关键因为高版本备份文件不能还原到低版本实例这是铁律后面我会详细说。接着确认服务正常。如果连不上实例常见原因有两个一是SQL Server服务没启动可以去Windows服务管理器里看服务名叫“SQL Server (实例名)”或者打开“SQLServer配置管理器”查看二是SQL Server Browser服务没开、端口不通。手动备份还原都是在SSMS里操作但底层依赖服务正常这一步别省。权限方面窗口登录用户至少要有数据库的备份权限和还原权限。通常db_owner就能备份自己的库sysadmin可以备份还原所有库。如果公司权限控制比较严格你用的账号没有备份权限那还没开始就会撞红灯。可以先执行一条最简单的语句看看有没有读权限右键数据库选择“属性”能打开就说明基本权限没问题。2.2 规划备份文件的存放位置备份文件放哪儿是个看似不起眼但非常影响后续操作的问题。如果备份到C盘系统盘空间一满SQLServer写文件会直接报错如果备份到网络共享盘服务账户没有共享目录写权限又会失败。我建议备份目录统一规划在独立的数据磁盘比如D盘或E盘单独建一个Backup目录清清楚楚。还原操作也是一样要确认目标实例的数据目录权限。默认情况下SQLServer的数据文件和日志文件装在C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA目录下如果你把一份备份还原成新库SQLServer会按备份内的物理文件路径去放置文件如果那个路径在当前机器上不存在还原就会报错需要手动在“选项”页改路径。这个操作后面会细说但提前知道“路径是还原环节最容易出问题的地方”心里就有底了。2.3 一个推荐的命名规范备份文件命名不规范时间一长就变成了灾难。我第一次管库时用的命名是“数据库名_日期_类型.bak”比如OrderDB_FULL_20250501.bak能一眼看出是哪个库、哪天做的、什么备份类型。手动操作时这个文件多半是一个人临时备份命名随意一点问题不大但如果是公司级的备份目录建议统一以下规则数据库名放在最前面方便按库检索日期用年月日连写排序时自然按时间排列备份类型显式标记完整备份写FULL或Full同一个库的多个备份不要反复追加到同一个文件建议每次单独生成。另外备份文件加不加后缀名都行SSMS默认生成的.bak文件就是通用备份文件不要纠结扩展名关键是备份集内容要清晰。3. 图解完整备份操作全流程3.1 发起备份右键“任务”里的备份入口打开SSMS连上目标实例在“对象资源管理器”里展开“数据库”找到你要备份的库右键它展开“任务(T)”点击“备份(B)…”。这一步之后会弹出一个非常经典的“备份数据库”对话框界面整体分为左侧“常规”、“选项”两个页面右侧是大片的配置区域。有两点值得提一下。第一有些人在“数据库”这个根节点上右键也会看到“还原数据库”等选项但备份操作必须针对具体库来右键。第二如果你连的是Azure SQL或托管实例界面上会多出“备份到URL”的选择本地环境不需要考虑这个默认就是“磁盘”介质。进入“备份数据库”对话框之后顶部有一行小字写着“脚本”可以点开查看或保存背后的T-SQL脚本这对想学命令行的人来说是个不错的免费资源。平时操作完我偶尔会把脚本存下来用自动化工具重新执行也很方便。3.2 “常规”选项卡怎么填常规页的核心配置项如下数据库下拉框默认当前选中的库别手滑改成其他库。备份类型选择“完整(F)”如果当前恢复模式不允许日志备份这里会直接置灰不用奇怪。备份组件选“数据库(D)”。另一项“文件和文件组”通常用于超大库做分段备份日常手动操作几乎用不上。备份集名称可以自己改默认会填成“库名-完整 数据库 备份”其实不用动过期时间默认0天表示永不过期生产环境建议设置一个合理天数避免备份文件堆积成灾。目标默认是一个备份设备或一条文件路径需要点击“添加”来设置新的备份文件。选中列表里已有的路径点“删除”去掉点“添加”之后弹出一个“选择备份目标”的小窗口选择“文件名(F)”左侧的输入框手动输入一个带路径的文件名比如“D:\Backup\OrderDB_FULL_20250501.bak”确认后回到主界面。这里有一个非常容易踩的坑很多人会习惯性地点一下“确定”就想完事结果发现文件写到了默认目录下甚至因为默认路径不存在而失败。手动备份时务必在目标列表里确认你写的目录真实存在SQLServer不会帮你自动创建目录。3.3 “选项”选项卡里的关键设置常规页设置完点左侧“选项”进入下半个关键页面。这里有几个选项需要逐一说清楚。最上方是“覆盖介质”部分。第一项“备份到现有介质集”下有两个单选“追加到现有备份集”表示把本次备份追加写进同一个文件不破坏这个文件里的旧备份第二项“覆盖所有现有备份集”表示覆盖新的备份集替换文件里已有内容。第二个大项是“备份到新介质集并清除所有现有备份集”等于每次都在一个全新的介质集上写入。手动单次备份我通常选“追加到现有备份集”但如果一个文件里已经积累了太多旧备份下次还原容易选错所以更推荐每次单独建新文件无需纠结旧文件里的残留备份集。中间的“可靠性”区域有两个选项“完成后验证备份(Verify backup after finishing)”和“执行校验和(Perform checksum before writing)”。我强烈建议手动备份时把这两项都勾上因为验证成本极低却能提前发现备份文件写入损坏的问题尤其是跨磁盘、跨机器、网络存储环境下特别有用。少了这一步备份容易生成一个“表面成功、实际无法还原”的空壳文件。往下是“压缩”设置SSMS里通常显示“压缩备份/不压缩备份/使用默认服务器设置”。备份压缩能大幅缩小文件体积但会增加CPU开销。一般生产库内存和CPU都比较充足我会选择“压缩备份”如果服务器CPU常年很高就“使用默认服务器设置”。不用太纠结压缩失败时会回退成不压缩备份过程本身不受影响。最后如果看到“加密”区域除非你事先创建过数据库主密钥和证书否则保持默认不要勾选。加密备份功能必须配合证书或非对称密钥使用这些密钥一旦丢失加密备份等于废掉新手别轻易碰。3.4 备份成功之后一定要做的检查点下“确定”之后进度窗口出现在SSMS右下角显示“正在执行备份”。等进度条走完显示“备份已成功完成”恭喜你第一步走完了但别急着关窗口还得做三个检查。第一个检查是去文件系统看一眼确认刚才的.bak文件真实存在且文件大小合理。空库可能才几MB有数据的大库肯定几十MB起跳如果文件只有0KB或突然小得离谱备份多半没写对路径或目标空间不够。第二个检查是重新打开“备份数据库”对话框在“常规→目标”里点“内容”或直接通过还原向导来选择备份集看能不能识别到刚才产生的备份集。能识别说明这个文件至少没有严重损坏。识别出的信息包括备份集名称、备份类型、数据库、备份日期、大小、到期时间等这些信息在还原时还会用到。第三个检查是我个人比较坚持的一步用“还原数据库”向导把数据库名改成“库名_Test”然后把备份文件还原成一个临时测试库。等还原成功后快速查一下几个核心表的行数和源库做比对。这个测试不需要保留验证完直接删掉即可。很多人省掉这一步结果到真的出事故时才发现备份文件根本打不开那时候再想办法就太被动了。4. 图解还原操作全流程4.1 还原入口与选择备份集还原操作的入口在SSMS左侧“数据库”根节点上。右键“数据库”这个根节点点“还原(R)…”再点“数据库(D)…”会弹出“还原数据库”对话框。注意如果你想还原的库名和现有某个库重名这里的操作方式会不一样后面会说明。打开对话框后左侧是“常规”、“选项”两个页面右侧配置源和目标。首先看“源”区域默认选中的是“源数据库(S)”它会列出实例上所有做过完整备份的数据库。但手动操作时更需要用的是“源设备(D)”方式因为我们手里的备份文件可能不在当前实例的备份历史里尤其跨机器还原时必须用源设备。点“源设备”右侧的“…”按钮在“选择备份设备”对话框里选“文件”后点“添加”找到你的.bak文件并确定回到还原列表后下方会展示一个“备份集”表格列出该文件包含的所有备份集。每个备份集会显示类型、位置、名称、服务器、数据库、日期等字段最新的备份集通常在最上面。选择你需要的那个备份集即可一般选日期最新的那一条。很多人在这一步会遇到自己备份的文件明明选进来了但备份集列表里一片空白。这种情况八成是文件路径不对或者文件损坏了要么就是备份集内容不是SQLServer标准格式可以重新选文件、选介质类型再试一次。4.2 目标数据库命名技巧再看“目标”区域默认目标数据库名是备份集里记录的原始数据库名。如果你想还原成原库名并且原库已经存在需要结合选项页的“覆盖现有数据库”来操作否则会因目标库已存在而直接失败。如果你想保留原库又想把这份备份恢复成一个新的测试副本就在目标数据库输入框里写一个新的库名比如“OrderDB_Test”。SQLServer会自动为这个新库分配新的逻辑名称吗并不会逻辑文件名还是原库名但物理文件名还原时默认沿用原库路径和文件名如果当前实例的数据目录里已经存在同名文件就会提示冲突。在测试环境我经常改库名一定要到选项页里把数据文件路径那两行改掉否则大概率还原失败或覆盖到别的库文件上。还有一种更稳妥的玩法先用“还原数据库”向导把备份集信息导入不立即执行点“脚本”按钮生成还原脚本在脚本里明确指定新的逻辑名称和物理路径再去执行。这样每个细节都可控适合需要反复还原的测试场景。4.3 选项页面的三个关键抉择还原对话框左侧切到“选项”这里才是决定成败的地方我遇到的新手报错大半都出在这三项上。第一个是“覆盖现有数据库(WITH REPLACE)”。如果你要还原的目标库名在实例上已经存在必须勾选它否则还原几乎必然报错因为现有数据库正在使用SQLServer无法独占地访问它。这个勾的本质是告诉SQLServer强制替换现有库文件。它会关闭现有库的连接并覆盖同名数据文件危害性比较大生产环境要谨慎。第二个是“维护现有连接”。这里很容易理解反了勾选它反而意味着“保留现有连接不踢掉”那些连接持续占用数据库还原会因为拿不到独占锁而停滞或失败。通常我们不要勾这个选项让它帮我们关闭现有连接。如果确实有业务正在使用请选业务低峰期再执行还原。第三个是“恢复状态”三个单选这里需要好好理解一下RESTORE WITH RECOVERY默认选项。还原完成后数据库在线可供读写后续不能再继续还原其他备份集。适用于最终交付数据的场景。RESTORE WITH NO RECOVERY数据库保持“正在还原”状态不可访问后续还能继续应用差异备份或日志备份。适合做链式还原。RESTORE WITH STANDBY数据库处于只读备用状态客户端能查询但不能修改后续还可以继续还原日志。常与日志传送场景搭配手动场景用得不多。绝大多数手动还原场景选第一个“RESTORE WITH RECOVERY”就行。只有当你明确要进行“完整备份差异备份日志备份”的链式还原时才需要先选NO RECOVERY一路还原到最后一步再改成RECOVERY。这个逻辑用一句话记住中间几步选NO RECOVERY最后一步选RECOVERYSTANDBY是给持续可查但允许补日志的场景用的。4.4 还原成功后的验证与善后选项页还需要关注“将数据库文件还原为”表格。这个表格里列出了备份集中的每一个逻辑数据文件和日志文件以及还原目标位置的完整路径。默认情况下它会把路径指到原备份时的物理路径。跨机器还原时这个路径大概率不可用。例如备份机上数据文件在D:\Data\OrderDB.mdf目标机器没有D盘或没有Data目录此时必须双击那一行或者点右侧的“…”按钮把路径改成目标实例的数据目录比如C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\。我见过太多人在这里忽略了路径然后报错“目录查找失败”或者“无法打开物理文件”。实际上只要路径改成当前机器的有效目录还原立刻就能继续。这也解释了为什么新库名和原库名一致时突然会覆盖文件本质就是物理路径没改。等还原执行完毕显示“已成功还原”你的工作还没完。建议立刻做三件事打开新库展开“表”确认表结构都在跑几条统计查询比如SELECT COUNT(*) FROM 关键表和备份时的数字比对右键库→属性→查看“状态”是否“在线”恢复模式是否符合预期。如果还原的是一个生产备用库还要注意把恢复模式改成你期望的模式。因为备份集里记录的是源库的恢复模式还原出来的库默认会和源库保持一致。比如你从“完整恢复模式”的生产库备份还原出一个用于测试的库测试库不需要频繁日志备份改成“简单恢复模式”可以防止日志文件无限膨胀。5. 常见问题与排查速查5.1 还原失败的一线排查手动备份还原最常见的报错就那么几条我按出现频率整理成一张表后续再遇到时可以直接对照。报错现象大概率原因处理方法备份完成但.bak文件只有0KB或极小目标目录权限不足、磁盘满、路径写错检查目录权限、磁盘空间换有效路径重新备份还原时报“数据库正在使用”目标库有连接占用未勾选覆盖勾选“覆盖现有数据库”关闭“保留现有连接”还原时报“目录查找失败”备份内物理路径在目标实例不存在在“选项→将数据库文件还原为”改成本机有效路径还原时报“无法覆盖文件”目标物理文件已存在且被占用先确认是否真的要覆盖必要时手动备份现有文件还原时报“版本不兼容”备份来自更高版本的SQLServer找同版本或更高版本实例还原无法向低版本降级备份时报“拒绝了访问”SQLServer服务账户无目录写权限给服务账户授权NTFS权限或改到可写目录备份集列表识别不到任何备份集文件损坏或非标准备份文件用“校验和”备份验证或检查文件来源这里重点展开两个细节。第一是“版本不兼容”SQLServer的备份文件只能向上兼容、不能向下兼容。比如2019实例上生成的.bak拿到2016实例上还原一定会报版本号不匹配有人管这个叫“高版本备份不能还原到低版本”。实操层面没有特别好的绕过方案最靠谱的办法就是把目标实例升级到和源库同等或更高版本。第二个是权限问题SQLServer服务账户和你的Windows登录账户往往不是同一个身份你用管理员账号能访问的文件夹服务账户未必有权限。备份失败时要记得去查SQL Server服务在哪个账户下运行一般是在服务管理里看“SQL Server (MSSQLSERVER)”服务的登录身份。5.2 备份文件能不能跑到别的实例上还原这个问题的答案是肯定的跨实例还原本身是完整备份最常用的价值之一。但有几个前提条件必须满足。第一两个实例的排序规则最好保持一致否则字符串比较、排序行为可能不同虽然不影响还原成功但业务行为会变。第二实例版本不能低于备份来源版本。第三目标实例的数据目录路径要可写服务账户要有权限。第四如果源库依赖自定义程序集、扩展存储过程等目标实例也要准备好对应组件否则业务查询到特定功能时会报“找不到程序集”或对象名无效。另外提醒一句从生产库备份还原到测试库属于数据导出行为如果涉及个人信息或敏感数据注意脱敏和合规授权。不要拿生产全量数据随便丢到不安全的测试环境里。5.3 几项实用建议分享几个我反复用到的小技巧。第一善用“脚本”按钮。SSMS图形界面做的每一步操作几乎都能在按钮旁边找到“脚本”生成对应的T-SQL代码把这些脚本攒下来以后写自动化备份任务就有现成参考。第二手动备份完成后把备份文件压缩打包加密存档建议用7-Zip或系统自带压缩工具进一步减小归档体积。第三如果数据库很大完整备份时间很长先观察磁盘性能如果备份很慢大概率是IO瓶颈而非SQLServer配置问题。还有一个容易被忽略的点完整备份不等于万无一失如果在最后一次完整备份之后数据库发生了大量事务变更还原回来会丢失这些新数据。业务核心库建议配合事务日志备份或差异备份使用手动操作时至少要做到“高危操作前先做完整备份操作完成后间隔一定周期再做下一次备份”。有不少公司走极端的“每天完整备份一次”这在小库上是没问题的大库则建议“每周完整备份每天差异备份高频日志备份”具体节奏要按数据重要性和恢复时间目标去设计。5.4 一个真实翻车现场复盘最后用一个实际案例来把前面所有内容串起来。之前有位同事接手一台旧服务器磁盘空间报警需要把一套老库迁移到新实例他直接用分离附加的方式结果在附加时提示文件已经损坏数据库一度无法访问。我帮他止损的流程是这样做的先在不影响业务的前提下对老实例做了一次手动完整备份生成到D盘新目录然后再拿这份备份还原到新实例整个过程约二十分钟期间业务在线只有最后切流量那一下短暂停写。备份还原完再做数据一致性核对发现行数一致遂恢复业务。这个案例里最关键的判断是分离附加依赖物理文件本身完好而备份还原是SQLServer自己管理的一致性快照即使数据页内部有逻辑损坏备份过程也可以读到可用部分并提供校验机制提前发现风险。从这以后我养成了一个习惯在没有足够把握的情况下任何数据搬迁、版本升级、环境更换能走备份还原就绝不走分离附加。手动备份还原虽然看起来操作步骤多但每一步都有检查点风险可控。最后再分享一个小技巧如果你手头要还原的备份文件比较重要建议每次动手前先把这个.bak复制一份出来放到另一个磁盘分区哪怕源文件临时损坏至少还有个后备副本。平时也建议养成习惯不要只盯着“备份成功”这个提示多花两分钟去测试还原很多隐患在当时就能被拦下来。
返回列表