简介:MSDE2000RelA2017.rar 是一份面向旧版数据库开发与运维场景的轻量级部署包,对应 Microsoft SQL Server Desktop Engine 2000 Release A,适合在个人计算机或小型系统中搭建 SQL Server 2000 的精简运行环境,也便于维护早期业务系统、复现教学实验和验证兼容性。压缩包共 87 个文件,约 74.59MB,以 msi 安装包、msm 合并模块和 msp 补丁为主,辅以 dll、exe 运行组件及 txt、htm、ini 等说明与配置文件,整体覆盖安装、更新和部署说明等环节。已有 600 人学习。对于需要离线部署轻量数据库的读者,可借助其中的安装组件与补丁快速搭起测试环境;结合说明文档,还能梳理 MSDE 与完整 SQL Server 2000 的差异,理解关系型数据管理、权限控制、备份恢复等基础能力,适合旧项目维护、课程实验和兼容性验证时参考。
1. 一台老机器重装,卡在 MSDE2000RelA 这个包上
给一台老工控机重装进销存,装到最后一步提示连不上数据库,翻出 U 盘里那个MSDE2000RelA2017.rar才发现,这玩意儿双击之后连个欢迎界面都没有。MSDE 2000 是给应用程序做嵌入式后端的桌面数据库引擎,天生没有图形管理界面、默认关闭网络协议、sa 密码还得靠安装参数指定,三个条件缺一个,客户端就只回你一句“SQL Server 不存在或访问被拒绝”。这类包现在多半出现在老系统重装、单机版管理软件续命、教学实验环境复现这几类场景里。下面按我实际装机的顺序走一遍:先钉死宿主环境,再命令行静默安装,最后把验证和回滚的路留好。
2. 装之前把宿主环境钉死:位数、账户与 MDAC 版本
这个包最容易背锅的地方不在安装参数,而在宿主系统。很多人拿到压缩包直接在身边的 Win10 笔记本上解压双击,折腾一下午得出“包坏了”的结论,其实 MSDE 2000 根本没有机会在那种环境里跑起来。把宿主条件确认清楚,后面所有步骤才有意义。
2.1 64 位系统上不要硬装:引导程序和 MDAC 检查都在拦你
MSDE 2000 RelA 是 32 位时代的产物,安装引导程序setup.exe里带了一段对 MDAC(数据访问组件)版本的检查,它读取的是HKLM\Software\Microsoft\DataAccess下的FullInstallVer。64 位 Windows 上这套组件早被系统自带的 Windows DAC 取代,注册表结构不一样,检查大概率直接判不通过;即便强行过了这一关,后面注册 32 位服务、写Program Files (x86)路径、绑定网络协议这几步还会陆续出问题。
我一般按下面这张表选宿主,不冒险:
| 宿主平台 | 可行性 | 说明 |
|---|---|---|
| Windows XP SP3 32 位 | 推荐 | 自带的 MDAC 2.8 SP1 满足要求,一次装通概率最高 |
| Windows Server 2003 SP2 32 位 | 推荐 | 服务器场景常用,服务账户权限干净 |
| Windows 7 32 位 | 可试 | 需管理员运行并在兼容模式下执行安装程序 |
| Windows 7 64 位 | 大概率失败 | MDAC 检查、服务注册两步都会卡 |
| Windows 10 / 11 | 不建议 | 缺少 16 位组件与旧版 MDAC,装上也起不来 |
提示:包名里的
2017更像整理打包的年份,不是版本号。真正决定行为的,是解压后setup.exe的版本和它有没有夹带 SP3a / SP4 补丁,这个判断放到下一章细说。
2.2 账户权限与 MDAC:安装失败一半出在这两件事上
安装账户必须是目标机器的本地管理员组成员,而且要从“以管理员身份运行”的上下文里启动,不要用双击。原因很实在:安装过程要创建MSSQL$APP01这样的系统服务、写HKLM下的实例键、给数据目录授SYSTEM和SQLServer2000MSSQLServer服务账户的权限,任何一步被拦,安装程序都会整体回滚并把错误码丢进事件日志。
装之前先确认 MDAC 版本,一条注册表命令就够:
rem 读取本机 MDAC 完整版本号,2.6 SP1 及以上才满足 MSDE 2000 RelA 要求 reg query "HKLM\Software\Microsoft\DataAccess" /v FullInstallVer输出形如REG_SZ 2.81.1132.0就没问题,前面的2.8是主版本,后面的长串是内部构建号,两者都要看。如果返回“系统找不到指定的注册表项”,说明系统被清理过或者本身是精简版,常见做法是先装一遍 MDAC 2.8 SP1 再继续,别指望安装程序自己补。
注意:装完 MDAC 要重启一次再装数据库。不重启的话,安装引导程序读到的还是旧的组件注册状态,一样会失败。
2.3 解压路径和临时目录:中文名、桌面、网络盘三个雷
路径这件事看着小,实际翻车率不低。MSDE 的安装程序内部会把当前目录的部分文件复制到临时目录,再用长路径拼接执行,路径里带中文、空格、括号都可能让某一步静默失败——表现就是进度条走到一半窗口消失,什么都没留下。
我固定的做法是把压缩包解到D:\msde2k\,目录层级不超过两层,解压工具不要用“解压到当前文件夹”那种生成一堆同名子目录的模式。TARGETDIR(程序文件)和DATADIR(数据文件)也在安装参数里分开指定,都放在短路径下,例如D:\MSDE2000和D:\MSDE2000\Data。数据目录单独分出来是有实际意义的:以后整机重装、备份、迁移盘符,只要这一个目录不动,库就在。
另外两条:不要把安装源放在映射的网络盘上,安装账户和服务账户看到的盘符上下文不一样;也不要把临时目录指到只剩几百兆的系统盘,安装过程中要展开组件、写日志,空间不够时回滚得很干净,干净到你以为自己什么都没做过。
3. 命令行安装:把 setup.exe 的参数写全再回车
MSDE 2000 的图形安装界面是可以调出来的,但我不建议用。界面上没有地方填实例名、没有地方选验证模式、更没有地方指定数据目录,装完还得回头改一堆注册表。命令行一次写全,装错了改参数重来,日志还留在手上。
3.1 先弄清手里这份是什么:RTM、SP3a 还是 SP4
同一个MSDE2000RelA名字下,实际打过补丁的版本行为差异很大,最直接的影响是网络协议默认开不开。RTM 版本的DISABLENETWORKPROTOCOLS默认值是 1,也就是安装完成时 TCP/IP 和命名管道全关;打过后面的补丁之后才允许在安装时用参数打开。
对照关系记一下:RTM 的ProductVersion是8.00.194,SP3a 是8.00.760,SP4 是8.00.2039。装之前可以先看看包里的补丁目录名,或者干脆装完立刻查一次版本号,别靠猜。
-- 装在实例上的引擎版本,8.00.194/760/2039 分别对应 RTM/SP3a/SP4 SELECT @@VERSION AS EngineVersion, SERVERPROPERTY('ProductVersion') AS ProductVersion, SERVERPROPERTY('Edition') AS Edition;Edition这一列对 MSDE 会返回Desktop Engine,如果它返回别的东西,说明装上的不是这份包,或者本机早就有另一个实例在跑。
3.2 一条完整的静默安装命令
下面这条是我现在还在用的模板,实例名、密码、路径三处按项目改,其余原样保留:
rem 切到解压出来的安装源目录,路径不要带中文和空格 cd /d D:\msde2k\MSDE rem 静默安装命名实例 APP01,SQL 验证模式,指定 sa 密码、程序目录与数据目录 setup.exe INSTANCENAME="APP01" ^ SECURITYMODE=SQL ^ SAPWD="Sq!2000#db" ^ DISABLENETWORKPROTOCOLS=0 ^ TARGETDIR="D:\MSDE2000" ^ DATADIR="D:\MSDE2000\Data" ^ /L*v "D:\msde_install.log" ^ /qn逐段说明。cd /d是必须的,安装程序要在当前目录找同级的组件文件,路径不对会报“安装程序无法找到所需文件”。INSTANCENAME决定服务名和注册表键名,一旦定下就别随便改,后面的连接串、备份脚本全靠它;不写这个参数就装成默认实例,一个系统上只能有一个。SECURITYMODE=SQL打开混合验证,SAPWD给 sa 设密码,这两个必须成对出现,只写前者不写后者,安装程序会直接拒绝。
DISABLENETWORKPROTOCOLS=0是让安装完就开网络协议,值为 1 或者省略就是关闭,这是客户端连不上最常见的原因之一。TARGETDIR放程序文件,DATADIR放数据和日志,两个都写绝对路径。/L*v生成详细安装日志,/qn表示全程无界面。日志这个参数看着多余,真出事的时候它是唯一的黑匣子。
命令执行完不要看窗口关没关,直接去看日志尾部和事件查看器。日志最后出现Installation success or error status: 0才算过,出现1603就走第 4 章的排查。
3.3 参数逐个拆:哪几个改错会直接重装
| 参数 | 典型取值 | 改错的后果 |
|---|---|---|
INSTANCENAME | APP01 | 与已有实例重名会直接失败;装完再改要卸载重来 |
SECURITYMODE | SQL | 不写则只有 Windows 验证,客户端用 sa 永远登不上 |
SAPWD | 8 位以上、含符号 | 为空时部分版本拒绝安装;密码里有&^要转义 |
DISABLENETWORKPROTOCOLS | 0 | 写 1 或省略,装完只能本机命名管道连 |
TARGETDIR | D:\MSDE2000 | 落在中文路径下,服务启动可能失败 |
DATADIR | D:\MSDE2000\Data | 与程序目录混放,迁移时不好整体搬 |
/L*v | 绝对路径 | 不写日志,出 1603 只能靠猜 |
密码里带特殊字符在cmd下有坑,^是转义符,&会截断命令。稳妥做法是密码里只用字母、数字和!#%之外的符号,或者干脆把整条命令写进.bat文件再执行,省得一层层转义。
3.4 装完立刻做的两件事:确认协议、钉死端口
安装成功不等于能连。装完先进D:\MSDE2000\Binn看一眼有没有svrnetcn.exe,这是服务端的网络实用工具,双击打开,在“启用的协议”里确认TCP/IP和Named Pipes都是启用状态。命令行习惯的话直接读注册表:
rem 查看实例 APP01 的 TCP 是否启用,1 为启用 reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\APP01\MSSQLServer\SuperSocketNetLib\Tcp" /v Enabled命名实例默认走动态端口,每次服务重启端口都可能变,客户端写死端口就会时好时坏。固定端口的做法是写注册表主项下的TcpPort:
rem 把实例 APP01 的监听端口固定为 1433,改完必须重启服务 reg add "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\APP01\MSSQLServer\SuperSocketNetLib\Tcp" ^ /v TcpPort /t REG_SZ /d 1433 /f net stop "MSSQL$APP01" net start "MSSQL$APP01"如果 1433 已经被本机别的实例占用,换成 14330 之类的端口,客户端连接串里用逗号跟上端口号,形如主机名,14330。改完一定要重启服务,注册表是服务启动时读的,不重启等于没改。
补丁这一步别跳过。装完之后如果有 SP4 的补丁目录,按它自带的说明跑一遍升级,升完再用 3.1 的查询确认版本号确实变了。补丁打不上往往不是包的问题,是前面某一步留下了挂起重启动标记,第 4 章会讲怎么清。
4. 排查与避坑:五个最有代表性的翻车现场
下面这五条是我这些年在这份包上真实遇到次数最多的,按“现象 → 原因 → 解决”记,遇到对不上的情况先翻安装日志再动手。
4.1 双击一闪就没,事件日志里只有 1603
现象:双击setup.exe,窗口闪一下就消失,进度条都没出现。事件查看器“应用程序”里有一条来源MsiInstaller的记录,错误代码 1603。
原因:1603 是 MSI 的通用致命错误,本身不携带信息。实际触发点集中在三处——没有管理员权限、系统里有残留的同名实例注册信息、或者PendingFileRenameOperations里有待重启的文件操作,安装程序怕覆盖正在使用的文件就直接中止。
解决:先用命令行带日志重跑一次,拿到真正的失败点再看日志尾部:
rem 带详细日志重跑,装完不管成败都去读 d:\msde_install.log 最后 50 行 cd /d D:\msde2k\MSDE setup.exe INSTANCENAME="APP01" SECURITYMODE=SQL SAPWD="Sq!2000#db" /L*v "D:\msde_install.log"日志里如果出现Another version of this product is already installed,去控制面板卸载旧条目,或者用msiexec /x指定产品码强卸;如果出现文件重命名相关字样,清掉挂起标记再装:
rem 清空挂起重启动标记,清完建议重启一次再装 reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" /v PendingFileRenameOperations /f4.2 本机能连,别的机器一律连不上
现象:在服务器上用osql -S .\APP01 -E能进,客户端报“SQL Server 不存在或访问被拒绝”,换了三台机器都一样。
原因:三种可能按概率排——网络协议压根没开(安装时漏了DISABLENETWORKPROTOCOLS=0)、防火墙拦了端口、命名实例的端口解析没走通。MSDE 2000 的命名实例靠 UDP 1434 做实例名解析,只放行 TCP 端口是不够的。
解决:先在本机确认监听状态,再看防火墙。
rem 看实例实际监听的端口和进程号 netstat -ano | findstr :1433 netstat -anob | findstr sqlservr第一条有输出说明端口在听。第二条能看到是哪个进程在听、PID 是多少,用来确认不是别的程序占了端口。然后到客户端机器上直接指定端口连,绕过实例名解析:
rem 客户端测试:直接写端口,能连说明是解析问题不是网络问题 osql -S 192.168.1.20,1433 -U sa -P "Sq!2000#db" -Q "SELECT @@VERSION"能连就说明要把 UDP 1434 也放进防火墙例外,或者干脆在所有客户端连接串里都写死端口,省掉解析这一步。
4.3 sa 登录报“未与信任的 SQL Server 连接相关联”
现象:客户端用 sa 连接,报错原文是“用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。”
原因:这句话翻译过来就是“这个实例只接受 Windows 身份验证”。装的时候SECURITYMODE=SQL漏写,或者写成了别的值。
解决:用本机管理员账户通过 Windows 验证登进去,把验证模式改成混合,再重启服务:
-- 把实例的登录模式改为混合验证,2 表示混合,1 表示仅 Windows EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2;xp_instance_regwrite会自动映射到当前实例的注册表路径,所以这里写的是通用路径,不用手写实例名,写错了反而容易写进别的实例。执行完重启MSSQL$APP01服务,再用 sa 连一次。如果 sa 密码也忘了,用 Windows 验证登进去执行sp_password NULL, '新密码', 'sa'重设。
4.4 补丁装到一半退出,版本号纹丝不动
现象:跑 SP4 的安装程序,进度到“正在升级数据库”附近退出,用SELECT @@VERSION查还是8.00.194。
原因:常见三种——实例名没对上(补丁默认找默认实例)、系统有挂起重启动、或者补丁包的位数和引擎不匹配。还有一种不太常见但很坑的:先把引擎升了,再想装回低版本补丁,安装程序会判定版本降级直接拒绝。
解决:升级前先查当前版本存档,升级后立刻再查一次对比:
-- 升级前后各执行一次,ProductVersion 没变就是没升上去 SELECT SERVERPROPERTY('ProductVersion') AS Ver, SERVERPROPERTY('ProductLevel') AS Lvl;ProductLevel会返回RTM/SP3a/SP4这种可读标记,比记版本号直观。补丁装不上时先清PendingFileRenameOperations再重启,然后确认补丁程序指定的实例名和实际服务名一致。
4.5 连接串里.\APP01写成了.
现象:老程序换了一台机器部署,配置里Data Source写的是.,本机测试没问题,装成命名实例之后一直连不上。
原因:.和(local)都指向默认实例,命名实例必须写成主机名\实例名或.\实例名。这是部署环节最常见的低级错误,偏偏报错信息很难指向它。
解决:改连接串,两种写法都行,局域网内建议用主机名便于以后迁移:
; 命名实例的标准写法,两种取其一 Data Source=.\APP01;Initial Catalog=DemoDB;User ID=sa;Password=Sq!2000#db Data Source=192.168.1.20\APP01;Initial Catalog=DemoDB;User ID=sa;Password=Sq!2000#db如果程序是硬编码的、改不动配置,改注册表或者干脆按默认实例重装一份,比在连接层绕弯子省事。
5. 搬库与卸载:老数据怎么迁,装坏了怎么清干净
装好只是开始,真正费时间的是把旧库带过来,以及装砸了之后怎么不留下垃圾。
5.1 备份、还原、附加:三种搬库方式的取舍
整机迁移用备份还原最稳,跨盘符、跨实例都不挑:
-- 备份到文件,WITH INIT 覆盖同名文件,STATS 每 10% 打一次进度 BACKUP DATABASE [DemoDB] TO DISK = N'D:\bak\demo_20240101.bak' WITH INIT, STATS = 10;还原之前先看备份里有哪些逻辑文件名,这一步跳过会直接报“无法覆盖文件”:
-- 只读备份头,列出逻辑文件名和原路径,不写数据 RESTORE FILELISTONLY FROM DISK = N'D:\bak\demo_20240101.bak';拿到LogicalName之后指定新路径还原:
-- 逻辑文件名按上一步的结果替换,REPLACE 允许覆盖已有同名库 RESTORE DATABASE [DemoDB] FROM DISK = N'D:\bak\demo_20240101.bak' WITH MOVE N'demo_data' TO N'D:\MSDE2000\Data\demo.mdf', MOVE N'demo_log' TO N'D:\MSDE2000\Data\demo.ldf', REPLACE, STATS = 10;WITH MOVE后面跟的是上一步查到的逻辑名,不是物理文件名,两者混淆是还原失败的头号原因。REPLACE会覆盖同名库,生产环境先在测试实例上走一遍再动真库。
还有一条必须提前确认:MSDE 2000 的单库上限是 2GB。旧库接近这个数的时候,还原过程可能在中途报空间不足,先把历史数据归档清一轮再搬,别等还原到 90% 才发现。
5.2 迁到更新的 Express 版本:兼容级别是个坎
老机器实在跑不动的时候,把数据迁到 SQL Server 2008 Express 或 2012 Express 是常见选择。2000 的.bak文件可以直接在 2008 上还原,还原出来的库兼容级别是 80。2012 及以上不再支持 80 兼容级别,直接还原会失败,中间必须过一次 2008 或者用生成脚本的方式搬。
迁完查一次兼容级别并升级:
-- 查看当前兼容级别,80 表示 SQL Server 2000 SELECT name, compatibility_level FROM sys.databases WHERE name = 'DemoDB'; -- 升到 100(2008 级别),这一步不可逆,先在测试库验证 ALTER DATABASE [DemoDB] SET COMPATIBILITY_LEVEL = 100;升级前跑一轮业务 SQL 全量回归,特别是用了旧语法的地方,比如跨库三部分命名、*=这种外连接写法,兼容级别一升就会直接报错。
5.3 卸载与残留清理:服务、注册表、目录三处都要动
MSDE 2000 在控制面板里不一定有卸载条目,找不到就用命令行卸:
rem 先停服务,再走 msiexec 卸载,产品码在安装日志里能翻到 net stop "MSSQL$APP01" msiexec /x {产品码} /qn rem 卸完检查服务是否残留,有残留用 sc delete 清 sc query "MSSQL$APP01" sc delete "MSSQL$APP01"注册表这边的实例键在HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\APP01,卸载程序一般会删,删不掉的手动清。数据目录D:\MSDE2000\Data卸载时不会动,确认不需要再删。装砸了要重来时,这三处清完再重启一次,比在残留实例上硬修快得多。
6. 装完怎么验证跑通:一条 osql 加四项检查
装完那一刻的心情往往很放松,真正的问题都出在第二天业务上线的时候。我现在固定走一遍四项检查,四项全过才算交付。
第一项,服务状态。sc query "MSSQL$APP01"要看到STATE: 4 RUNNING,启动类型是自动。第二项,监听端口。netstat -ano | findstr :1433有输出,并且 PID 对应的是sqlservr.exe,不是别的程序。第三项,本机连接与版本,用安装目录下的 osql:
rem osql 在安装目录的 Binn 下,-Q 后跟一条查询,看完即走 cd /d D:\MSDE2000\Binn osql -S .\APP01 -U sa -P "Sq!2000#db" -Q "SELECT @@VERSION"第四项最关键,也是最容易被跳过的一项:从一台别的机器连过来,走真实的网络路径,把库建起来、表建出来、写一条数据再读回来。前三项都能在本机过,只有这一项能验证协议、端口、防火墙、实例名解析四件事同时成立。
-- 冒烟测试:建库、建表、写读一条,确认登录权限和磁盘写入都正常 CREATE DATABASE SmokeTest; GO USE SmokeTest; GO CREATE TABLE t_check (id INT IDENTITY PRIMARY KEY, note VARCHAR(50), ts DATETIME DEFAULT GETDATE()); GO INSERT INTO t_check(note) VALUES ('install-ok'); GO SELECT id, note, ts FROM t_check; GO -- 测试通过后清理,别在生产实例上留垃圾库 USE master; GO DROP DATABASE SmokeTest; GO能查出那一行install-ok并带上时间戳,说明身份验证、库文件写入、系统时间全部正常,这套环境就算真正跑通了。整条流程跑下来,从解压到冒烟测试通过,一次成功的情况下大概二十分钟,卡住的时间全部花在环境判断上,而不是安装本身。
从那以后我每次装这类老引擎,都强制走一遍“宿主对照表 → 命令行安装 → 四项检查 → 冒烟库”的固定流程,不管对方多急都不跳步。跳过的那一步,迟早会以“连不上数据库”的形式在半夜找回来,那时候排查成本是现在的十倍。希望帮到你。
本文还有配套的精品资源,点击获取