尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SQL Server 2000数据库备份与还原:从实战到迁移

SQL Server 2000数据库备份与还原:从实战到迁移 简介面向数据库初学者与MSSQL管理员这份图文教程系统讲解SQL Server 2000中数据库备份、还原与附加的核心操作解决因硬件故障、误操作或路径权限导致的数据丢失与恢复问题。资源以清晰截图配合步骤指引覆盖完整备份、差异备份及事务日志备份的区分并演示通过企业管理器完成还原、从设备导入.bak文件、强制还原及检查恢复路径等关键细节针对已有.MDF与.LDF文件的情况也给出附加数据库及为mssqluser设置完全控制权限的注意事项可有效避免还原失败。包体为单个PDF文档约327KB内容精简但要点齐全适合随时查阅。目前已有302人学习下载对正在维护老版本SQL Server环境或备考数据库运维的读者颇具参考价值。1. 还在维护 2000 的库备份还原是第一道保险sql server 2000 数据库备份还原听起来像考古但在老机房里这是每天都要面对的现实。医保接口、老 HIS、制造业 MES一堆跑在 Windows Server 2003 上的业务系统数据库还稳稳停在 SQL Server 2000。机器一旦亮黄灯、磁盘开始异响第一反应不是换新机而是先做一次完整备份。备份还原和分离附加不一样它把整个库封装成一个 .bak 文件跨机器恢复时不依赖源盘符也不用背 mdf 路径。对老库来说这是最稳妥的兜底手段。这篇笔记适合两类人——刚接手的网管员库在但不知道怎么下手还有做迁移的工程师要把 2000 的数据搬到新实例。下面按企业管理器和 osql 两条线走把参数、边界和坑都摆出来。2. 备份操作的两条路企业管理器图形界面与 osql 命令行2000 时代的备份没有后来的 SSMS 那么花哨但逻辑是一样的在界面上点一次完整备份本质就是执行一条BACKUP DATABASE。图形界面的价值是把选项摊开命令行则适合那些不让你随便碰界面的机器以及需要被计划任务定时调用的场景。两条路日常都要会下面分开讲。2.1 企业管理器里做完整备份菜单路径一步步走完如果服务器还能远程桌面打开 SQL Server 企业管理器Enterprise Manager左侧树依次展开Microsoft SQL Servers → SQL Server 组 →本机实例名→ 数据库右键目标库 → 所有任务 → 备份数据库。弹出的窗口有四个标签页绝大多数场景只用两个。“常规”页里备份名称默认是一长串中文比如“订单库 完整 数据库 备份”建议直接改成mydb_full_20240501这样一眼能看懂的名字。备份类型下拉框有三个选项完全、差异、事务日志。这里先选“完全”。目标区选“磁盘”点“添加”输入路径D:\bak\mydb_20240501.bak。添加后如果列表里有一条遗留的空设备条目选中它点删除不然备份会尝试写进一个不存在的设备弹“设备激活错误”。“选项”页里两个关键勾选“验证读取备份媒体”备份完成后把媒体上的数据重读校验一遍相当于给 .bak 文件做了一次体检。缺点是多花时间老机械硬盘上尤其明显。小库无所谓大库会慢不少但第一次手工备份值得开。“初始化媒体集”和“追加到媒体集”首次备份或想清掉旧备份时选初始化日常按日期建新文件就用追加。如果你每天生成一个新的 .bak 文件名初始化与否其实无关紧要路径本身就是隔离。备份完成后先看文件时间和大小。文件大小接近数据库 mdf 的体量才正常。如果只有几 KB多半是备份集没写进去常见原因是路径不存在或者 SQL Server 服务账户没有那个目录的写权限。提示备份文件的路径和文件名尽量不要用中文、空格和括号。2000 对中文路径的支持时好时坏出了问题很难查。这里有个新手常弄混的概念备份设备和备份文件。备份设备是企业管理器里“管理 → 备份”下注册的对象对应一个物理路径之后备份时可以直接选设备名。设备一旦换了机器或路径失效还原反而麻烦。我日常更推荐直接用“磁盘文件”也就是写死物理路径少一层间接排查更直观。2.2 osql 命令行备份不依赖界面的可靠通道维护老实例最烦的就是远程桌面断线刚点好的下一步按钮全没了。命令行备份不受界面卡死影响还能被计划任务直接调用。SQL Server 2000 自带的是 osql.exe位置在安装目录的Tools\Binn下面它取代了老版本的 isql。osql -S 192.168.1.10 -U sa -P Sql2000Pass -Q BACKUP DATABASE mydb TO DISKD:\bak\mydb_20240501.bak WITH INIT逐参数拆开-S实例地址本机可以直接写127.0.0.1。命名实例写成“服务器名\实例名”。-U/-P登录账号和密码。生产环境别用 sa 裸奔但老系统里 sa 往往还挂着空密码这里至少先保证能登。-Q后面跟一段 T-SQL执行完就退出。想跑多行脚本改用-i 脚本路径.sql。WITH INIT覆盖目标媒体如果 .bak 文件已存在会清掉旧内容重写。默认是NOINIT追加多个备份集堆在一个文件里还原时要再选一次备份集多一步操作。手工备份我反而更倾向追加只要记得选对应备份集。如果想交互式操作直接运行osql -S ... -U ... -P ...回车然后输入BACKUP DATABASE ...最后敲GO提交。跟界面操作效果完全一样。还有一条经常被拿来当日志清理工具的命令BACKUP LOG mydb WITH TRUNCATE_ONLY这条命令把日志空间释放掉但不会产生可用于还原的日志备份。它只适合完整备份为主、不追求时间点还原的库。如果业务要求还原到分钟级日志备份必须走BACKUP LOG mydb TO DISK...\xxx.trn。两条命令用途天差地别别混用。2.3 三种备份类型怎么选完整、差异、事务日志的搭配备份类型不深奥但选择直接决定灾难时的数据损失窗口。备份类型还原到什么时刻依赖条件常用后缀完整备份备份完成时刻无.bak差异备份最后一次差异备份完成时刻至少一次完整备份.dif / .bak事务日志备份日志序列内任意时间点恢复模式为“完全”.trn / .log组合的还原顺序是固定套路完整备份 → 最近一次差异备份 → 按时间排序的日志备份序列。举例周日凌晨 2 点做完整备份每天凌晨 2 点做差异备份工作日每 2 小时做日志备份。周三下午 3 点 40 分库坏了还原时先拿周日完整备份再拿周三凌晨的差异备份然后依次还原周三 2:00 到 3:40 之间的日志备份最终把库恢复到 3:40 那个时间点。恢复模式怎么确认企业管理器里右键库 → 属性 → 选项恢复模型有三项简单、完全、大容量日志。只有“完全”模型下才能连续做日志备份。“简单”模式不保留事务日志做差异和日志备份会失败或无效。给老库定策略时我一般这样安排小库几十 GB 内每天一次完整备份再加每小时日志备份大库每周完整 每日差异 每两小时日志。备份文件按“库名_类型_日期”命名例如mydb_full_20240501.bak、mydb_diff_20240502.bak、mydb_log_20240502_1400.trn。名字有意义排错时才不会像在拆黑匣子。3. 还原数据库的三种场景同机、异机与覆盖备份做完了真正见真章的是还原。很多维护过 2000 的人都经历过备份文件躺在那里真到还原那天反而不敢点。下面按同机、异机、覆盖三种场景拆开对应不同的操作难点。3.1 同机还原从 .bak 恢复到原库的完整操作同机还原通常发生在服务器换盘、数据库被误删的时候。打开企业管理器在“数据库”节点上右键 → 所有任务 → 还原数据库。这里有个细节2000 的还原对话框里没有“新建数据库”按钮想还原成一个新库名直接在“还原为数据库”下拉框里敲一个名字SQL Server 会把它当成新库处理。在还原方式里选“从数据库备份还原”接着“选择设备” → “添加”定位到D:\bak\mydb_20240501.bak确认后左侧“备份号”列表会显示这个媒体里的所有备份集。默认只会列出一条完整备份如果是差异加日志的多级备份需要分别把完整、差异、日志勾进还原队列并按时间顺序排列。先别急着点确定“选项”页至少要过一遍“在还原备份集时强制恢复”对应 T-SQL 里的RESTORE WITH REPLACE。勾选后即使目标库做不了日志尾部备份也强制用备份集内容覆盖后面 3.3 会细说。“将数据库文件还原为”列表会显示目标物理路径。同机还原路径通常不用改。还原完成状态选“使数据库处于可操作状态”也就是RESTORE WITH RECOVERY接上应用立即可用。如果后面还要继续还原差异或日志备份就选“使数据库处于非操作状态”对应WITH NORECOVERY。同机还原最常遇到的问题是目标库还在被别人占着整个还原卡住不动。这时候先跟业务确认窗口把库切成单用户再还原具体手法放在第 4 章避坑清单里。3.2 异机还原逻辑文件名与物理路径的映射异机还原就是 .bak 转移到另一台服务器上恢复常见于整机迁移和灾备演练。SQL Server 2000 的备份文件会把源实例的数据文件绝对路径记录进去比如D:\Program Files\Microsoft SQL Server\MSSQL\Data\mydb_Data.MDF。目标机器路径如果不一样不处理的话还原会报错提示某个文件无法还原到指定位置请用 WITH MOVE 选项。图形式界面里的后悔药就在“还原数据库”对话框的“选项”页。下方“将数据库文件还原为”表格里左边是备份中的逻辑文件名右边是还原到目标机的物理文件名。把右边的物理文件名改成目标实例的数据目录问题就解决了。用 T-SQL 表达就是RESTORE DATABASE mydb FROM DISK ND:\bak\mydb_20240501.bak WITH MOVE Nmydb_Data TO ND:\SQL2000\MSSQL\Data\mydb_Data.MDF, MOVE Nmydb_Log TO ND:\SQL2000\MSSQL\Data\mydb_Log.LDF逻辑文件名从哪来不用真正还原执行RESTORE FILELISTONLY就能看到备份里的文件清单RESTORE FILELISTONLY FROM DISK ND:\bak\mydb_20240501.bak输出至少两行第一行是 Data 文件第二行是 Log 文件。拿这两行的 LogicalName 去填 MOVE 子句。这样即使源库改过名字或路径特殊也不会漏掉 mdf 和 ldf。异机还原还有一个隐藏前提SQL Server 服务账户对目标数据目录要有写权限。2000 的默认服务账户是本地系统一般问题不大如果换过服务账户先确认数据目录和 .bak 所在目录对该账户可见否则还原到一半才报权限错误白等半小时。3.3 覆盖还原与 REPLACE覆盖前要做的一件事覆盖还原是用备份集内容直接顶掉现有数据库。它的 T-SQL 语法就是在普通还原命令最后加一个REPLACERESTORE DATABASE mydb FROM DISK ND:\bak\mydb_20240501.bak WITH REPLACEREPLACE的语义是跳过大多数预检查目标库即使处在未恢复完成状态或没做日志尾部备份也允许强制覆盖目标库的数据文件不管当前叫什么名字都会被备份集带回来的物理文件名替换目标库是否正在被使用这个选项不会直接检查但底层拿不到文件独占锁照样失败。安全边界必须说清楚REPLACE会让目标库完全回到备份时刻备份集之后写入的任何数据还原后都不存在。所以我在替换前一定先做一次完整备份哪怕只是BACKUP DATABASE ... WITH INIT也要把当前状态落到磁盘。这样 REPLACE 出问题比如还原后发现业务端连的还是旧逻辑还能靠刚才那份备份救回来。如果目标库数据已经不需要了只是残留文件占着磁盘最干净的做法是先把库删掉再还原而不是用 REPLACE。删库后还原等于从零创建不存在覆盖时乱七八糟的中间状态。4. SQL Server 2000 备份还原避坑清单五个高频翻车现场这五个问题不是从书上看来的是维护老库时被逼出来的血泪经验。按“现象 → 原因 → 解决”写清楚遇到能直接对号入座。4.1 现象一2000 的 .bak 拿到 SQL Server 2012 以上还原直接失败现象在 SQL Server 2019 里点还原界面报错“备份集保存的是 539 版本的数据库当前服务器支持 6xx 及以上版本”还原无法继续。原因SQL Server 2000 的数据库文件版本号是 539。从 SQL Server 2012 开始微软移除了对 539 版本文件的直接附加和还原支持2016、2019 也没恢复。解决绕一条路先在一台 SQL Server 2008 R2 上把 .bak 还原再分离或做二次备份把新备份集带到 2019 上还原。2008 R2 是最后一个能原生还原 2000 备份集的版本这条完整链路在第五章展开。提示把 2000 的 .bak 和 2019 的实例放一起尝试还原最容易踩这个版本错位。做迁移前先确认目标版本别等拖到夜里才发现路径走不通。4.2 现象二还原时报“数据库正在使用无法获得独占访问权”现象点还原后很快弹错提示无法获得独占访问权错误日志里有时附一个 SPID 号。原因SQL Server 2000 还原要求目标数据库在当前实例上没有任何活动连接。最常见的是业务程序连接池没释放或者 SQL 代理的作业正好在跑。解决还原前把库切成单用户模式并回滚未完成事务。2000 里最稳的是sp_dboptionEXEC sp_dboption mydb, single user, true执行完立即做RESTORE。如果切单用户时提示有阻塞先用sp_who找出占用连接的 SPID再KILL 54这样的方式清掉会话然后重试。还原结束后切回多用户EXEC sp_dboption mydb, single user, false注意企业管理器里“右键库 → 所有任务 → 分离数据库”也能强制断开连接但代价是库暂时从列表消失还得再附加回来不如上面的命令干净也不会让业务端看到数据库消失。4.3 现象三异机还原成功应用却报“无法登录请求的数据库”现象.bak 在新服务器上还原顺利数据也在但业务系统连接时报错提示用户登录失败或无法打开所请求的数据库。原因备份还原只带走数据库本身不带走实例级的登录账号。新实例上即使重新建了同名的登录登录名对应的 SID 和数据库里用户记录的 SID 对不上。SQL Server 登录时会用实例登录的 SID 去对照库里 user 的 SID不一致就拒绝访问。解决重建登录与数据库用户的映射关系。2000 里用sp_change_users_loginEXEC sp_change_users_login Auto_Fix, myuserAuto_Fix会把库内用户连接到同名的登录账号上。如果登录账号本身不存在先建好登录再执行。新版本 SQL Server 里这个存储过程仍存在只是标记为过期功能照用。4.4 现象四备份文件复制到另一台机器后变成 0 字节或媒体集不正确现象源服务器上D:\bak里的 .bak 大小正常复制到目标服务器后却变成 0 字节或者还原时报“媒体集不正确”。原因复制动作被中断。共享文件夹传输断网、U 盘拔得太快、杀毒软件把大型 .bak 文件当作可疑内容拦截都可能让文件只复制了一半。解决复制完成后做三层验证。第一层对比文件大小精确到字节第二层在目标机器上执行RESTORE FILELISTONLY FROM DISK N路径能读出逻辑文件名说明备份头完整第三层是最狠的——在目标机器上真正做一次还原演练。文件大小对但媒体头读不出来基本就是复制中断重传一次即可。备份大文件时我习惯先在源站算一个 MD5目标站再算一遍一致了才删源文件。4.5 现象五master 库损坏整个实例起不来现象SQL Server 服务启动失败错误日志指向 master.mdf 打开失败企业管理器根本进不去。原因master 库是所有元数据的中枢2000 里只要 master 损坏实例就整体瘫痪。断电、磁盘坏道、误删文件都可能是诱因。解决如果之前备份过 master可以从命令行以单用户模式启动并恢复。第一步停止 SQL Server 服务找到安装目录下的sqlservr.exe。第二步执行sqlservr.exe -m以单用户模式拉起服务。-m参数让实例以最小配置启动只允许一个管理员连接避免其他客户端干扰。第三步另开一个命令行窗口用 osql 连接并恢复osql -S 127.0.0.1 -U sa -P password -Q RESTORE DATABASE master FROM DISKD:\bak\master.bak恢复完成后重启服务。master 备份必须提前准备我接手一个 2000 实例的第一天就会把 master、msdb、model 三个系统库各备份一份单独放在不会被日常清理脚本扫掉的目录里。这一步在 2000 时代是保命操作别省。5. 从 2000 迁到新版三种跨版本迁移路径的取舍老库迟早要迁移。迁之前先回答一个问题目标版本能不能直接吃 2000 的 .bak。答案很明确SQL Server 2005、2008、2008 R2 可以2012 开始官方不再支持2016、2019 也不行。所以跨版本迁移要选路径下面三条我都用过各有利弊。5.1 最短路径2000 的 .bak 先还原到 2008 R2 再升级最短的合法路径是这样一条链路2000 备份 → 2008 R2 还原 → 再备份 → 更高版本还原在 2008 R2 上还原 2000 的 .bak操作跟第 3 章完全一样只是多一步确认兼容级别。还原完成后右键库 → 属性 → 选项兼容级别默认是“SQL Server 2000 (80)”。这个状态不影响 2008 R2 日常查询但下一步迁到 2019 之前要先把兼容级别升上来ALTER DATABASE mydb SET COMPATIBILITY_LEVEL 100 GO几个注意点必须说清兼容级别只是行为开关改变它不会改变数据库内部文件版本。只有把库做一次完整备份再还原或者分离附加文件版本才会真正升到当前实例的版本。升级完成后不要立刻删掉中间那台 2008 R2。先在新版本上跑一遍核心业务查询确认结果一致再清理中间环境。2000 里留下的一些老语法我见过比较典型的是*这种老式外连接在 SQL Server 2008 的 100 兼容级别下已经不生效。升级后逐个编译存储过程报错的地方改写成标准LEFT JOIN。这活儿没有捷径属于迁移里最花时间的部分。5.2 分离附加与生成脚本慢但稳的搬家路线如果备份文件路径有问题比如实例上根本没有可用的 .bak或者备份集里的数据已经读不出来还有一条路直接把数据文件拿过来附加。SQL Server 2000 的数据文件是 mdf/ldf分离后复制到新服务器在 2008 R2 里附加即可。注意附加的上限和还原一样2012 以上不直接支持。EXEC sp_attach_db mydb, D:\sql2008\data\mydb_Data.MDF, D:\sql2008\data\mydb_Log.LDFsp_attach_db是 2000 时代的老接口2008 R2 里仍有效适合快速附加。mdf 和 ldf 要同时给全只给 mdf 会提示找不到日志文件。大库的取舍备份还原通常比附加快因为附加要重建和校验索引备份还原则一次性读取文件还能自动调整文件布局。小库几百 MB 内两边差不多附加少敲一条命令大库我推荐备份还原路径。如果库结构特别乱比如外键缺失、自增列到处都有、表名带空格可以考虑“生成脚本 导数据”的方式。用 2008 R2 的“生成脚本”工具把结构导出成 .sql再通过导入导出工具搬数据。这条路慢但对老库非常稳能从源头清洗掉那些乱七八糟的历史包袱。5.3 导入导出向导的边界数据能过去这几样过不去SQL Server 2000 自带的 DTS 导入导出向导能搬表数据和视图数据但它的边界非常明确索引、触发器、约束、存储过程、作业、用户权限都不在向导任务清单里。结果往往是数据到新库了应用一跑就报存储过程找不到索引要重建、外键要补建够折腾一整晚。我通常把导入导出向导当最后一招备份还原和附加都失败或者目标端确实只想要一张大表的明细数据时才用它。要导全库正确姿势是“生成脚本 导数据 执行脚本建对象”三步走先导结构再导数据最后建约束和作业。大表别想着一次导完按时间范围分批导出避免超时或内存溢出。三条路径放到一起对比迁移路径速度能带走什么带不走什么适合场景2008 R2 中转还原快表、索引、约束、存储过程、权限作业、维护计划、实例级配置完整迁移整个库分离附加中同备份还原同备份还原备份文件缺失或损坏生成脚本 导入导出慢表结构、数据索引、触发器要重做作业和登录另建库结构特别乱需要清洗6. 把备份做成习惯自动化与恢复演练的一点经验6.1 数据库维护计划向导固定备份节奏接手 2000 实例的第一天我会在企业管理器里进入“管理 → 数据库维护计划”向导把自动备份节奏定下来。完整备份每周日凌晨 2 点差异备份每天凌晨 2 点工作日事务日志每 2 小时一次文件输出到D:\bak按“库名_类型_日期”自动生成。特别提醒维护计划向导生成的备份任务最终是放在 SQL Server 代理的作业里执行的。确认代理服务处于启动状态否则计划不会自己跑这是最容易被忽略的一环。6.2 每月还原演练验证比备份本身更值钱备份自动化只解决一半问题另一半是恢复演练。我的习惯是每月挑一个周五晚上用最新备份在测试库上还原一遍命令是固定的osql -S 127.0.0.1 -U sa -P password -Q RESTORE DATABASE mydb_test FROM DISKD:\bak\mydb_20240501.bak WITH MOVE mydb_Data TO D:\SQL2000\MSSQL\Data\mydb_test.mdf, MOVE mydb_Log TO D:\SQL2000\MSSQL\Data\mydb_test_log.ldf, REPLACE还原完不要直接删库先用一个简单查询确认数据真的落地了SELECT COUNT(*) AS total_count FROM mydb_test.dbo.[订单表]跟上次备份时记录的总行数对比数量级差太多说明备份集可能不完整回头查源库的备份日志。演练结束后把 mydb_test 删掉不占生产磁盘空间。早年间我也只做备份不做恢复演练。有一次磁盘故障拿回来才发现 .bak 文件早就坏成 0 字节整个实例只剩最后一份系统备份差点丢了两天业务数据。从那以后备份和还原演练在我这儿绑定成一条不能拆开的命令。备份文件的有效性从来不是玄学它就在这一次次还原操作里被验证。希望帮到你。本文还有配套的精品资源点击获取
返回列表