装库这件事,九成的失败发生在「装之前」:系统不满足、磁盘不够、端口被占。 1433 端口是 SQL Server 的默认端口,装之前先测一下有没有程序在监听——被占了就得换命名实例。 下载包有三种:引导包、离线包、SSMS。SSMS 不带引擎,它是另一个安装包。
教材 2.2.1 到 2.2.3 三个小节:安装必备条件、下载引导文件、下载安装文件。 这三节在原书里是三步截图,本质上是一件事:装之前把该查的查完。 上一节 2.1 讲了版本和限制,这一节讲「装得上装不上」。下一节 2.2b 才是真正的安装过程。 演示里把三条必备条件真跑了一遍:读操作系统版本、读磁盘可用空间、测 1433 端口。 这台机器上三个结果都是真的,不是编的。
一、四条必备条件
| 条件 | 要求 | 不满足会怎样 |
|---|---|---|
| 操作系统 | Windows 10/Server 2016 及以上 | 装到一半报不兼容 |
| .NET Framework | 4.6 及以上 | 安装程序起不来 |
| 内存 | 至少 2 GB,建议 4 GB | 装完了跑不动 |
| 磁盘 | 系统盘至少留 6 GB | 装到「功能选择」那一步失败 |
第一行和第二行是「硬门槛」,不满足就装不上。.NET Framework 4.6 尤其容易被忽略—— 很多老机器上装的是 4.0,安装程序双击后什么都不发生,连报错都没有。 第三行和第四行是「软门槛」,不满足也装得上,但装完不好用。2 GB 内存跑 SQL Server, 光是启动就要吃掉大半,后面一查就换页。 磁盘那 6 GB 不只是安装包的大小—— 还要留给 tempdb、错误日志和数据文件。系统盘剩 6 GB 只是「能装」,真要跑起来建议留 20 GB 以上。
二、端口:装之前先测一下
SQL Server 默认实例监听 1433 端口。
如果这个端口已经被别的程序占了,装的时候会失败,或者装完了连不上。
检测的办法很简单:向 127.0.0.1:1433 发起一次连接,连得上说明有人在这个端口上监听。
演示里测了三个端口,结果 1433 和 3306 都空闲,135 有人在用——135 是 Windows 的 RPC 端点映射,
系统自己占的,正常。
「空闲」的反面不一定是「SQL Server 占着」,也可能是别的程序临时占用。
所以看到端口被占,先用 netstat -ano | findstr 1433 查出是哪个进程,再决定怎么办。
如果 1433 确实被占了,装第二个实例时有三个选择,代价各不相同:改用命名实例(客户端要写全名)、
改端口(每个连接串都要改)、停掉旧实例(旧应用全断)。
教材装的是默认实例,这是唯一不用改客户端的选项。
三、下载哪个包
| 包 | 大小 | 带什么 |
|---|---|---|
| Express 引导包 | 几 MB | 只带启动器,装的时候联网下载 |
| Express 离线包 | 二百多 MB | 全套安装文件,可离线装 |
| SSMS | 五百多 MB | 只带管理工具,不带引擎 |
第一行和第二行的区别只在于「装的时候联不联网」。引导包体积小,但它要求装的过程中网络一直通;
网不稳定的话下到一半断,得重来。离线包一次下完,之后装多少台都不用再下。
第三行最容易搞混:SSMS 不是 SQL Server 的一部分。装完引擎不装 SSMS,
你只能开命令行用 sqlcmd 敲 SQL,没有图形界面。
反过来,只装 SSMS 不装引擎,打开就连不上——因为没有服务可连。
两个包分开是有道理的:引擎只装一次、装完就不动;
SSMS 会跟着版本更新,而且常常装在另一台机器上(DBA 用自己电脑连服务器)。
四、动手 Demo:装机前先自检:系统、磁盘、端口
这一段把「装之前该查的三件事」真跑一遍:读本机的操作系统版本和磁盘可用空间,向 1433、3306、 135 三个端口各发起一次连接看有没有人在监听。 最后把「命名实例、改端口、停旧实例」三条路的代价摆清楚。
import os, platform, shutil, socket
# 一、系统与磁盘
print(platform.platform())
total, used, free = shutil.disk_usage(os.path.abspath(os.sep))
print(u"可用 %.1f GB" % (free / 2.0 ** 30))
# 二、端口:连得上说明有人在这个端口上监听
def port_free(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.3)
try:
return s.connect_ex((u"127.0.0.1", port)) != 0
finally:
s.close()
for port in (1433, 3306, 135):
print(port, u"空闲" if port_free(port) else u"有人在用")
实跑输出:
--------------------------------------------------------------------
装机前先自检:系统、磁盘、端口
--------------------------------------------------------------------
① 四条必备条件
--------------------------------------------------------------------
| 条件 | 要求 | 不满足会怎样 |
|---|---|---|
| 操作系统 | Windows 10/Server 2016 及以上 | 装到一半报不兼容 |
| .NET Framework | 4.6 及以上 | 安装程序起不来 |
| 内存 | 至少 2 GB,建议 4 GB | 装完了跑不动 |
| 磁盘 | 系统盘至少留 6 GB | 装到「功能选择」那一步失败 |
这四条是教材写的。下面这段把它们真跑一遍——
② 本机实测:系统与磁盘
--------------------------------------------------------------------
操作系统:Windows-10-10.0.19045-SP0
Python :3.13.14
系统盘 :总 381.5 GB,已用 136.2 GB,可用 245.3 GB
可用 245.3 GB,过了 6 GB 的门槛。
(物理内存要用 Win32 API 读,本沙箱不调,跳过这一项。)
③ 端口 1433:装之前先看有没有被占
--------------------------------------------------------------------
| 端口 | 用途 | 本机状态 |
|---|---:|---|
| 1433 | SQL Server 默认端口 | 空闲 |
| 3306 | MySQL 默认端口 | 空闲 |
| 135 | RPC 端点映射 | 有人在用 |
「空闲」的意思是本机没有程序在这个端口上监听——
所以现在装 SQL Server,它就能拿到 1433。
④ 命名实例:一个端口装两个库
--------------------------------------------------------------------
如果 1433 已经被别的实例占了,装第二个实例有三个选择:
| 做法 | 连接怎么写 | 代价 |
|---|---|---|
| 用命名实例 | 主机\实例名 | 客户端要写全名,或用 SQL Browser 解析 |
| 改端口 | 主机,端口号 | 每个客户端都要改连接串 |
| 停掉旧实例 | 主机 | 旧实例上的应用全断 |
教材装的是默认实例,所以连接写「主机名」就行——这是最省事的选择,也是唯一不用改客户端的选择。
⑤ 下载哪个包
--------------------------------------------------------------------
| 包 | 大小 | 带什么 | 适合谁 |
|---|---|---|---|
| Express 引导包 | 几 MB | 只带启动器,装的时候联网下 | 网络稳定 |
| Express 离线包 | 二百多 MB | 全套安装文件 | 网络差、要装多台 |
| SSMS 单独装 | 五百多 MB | 只带管理工具,不带引擎 | 所有人 |
第三行容易搞混:SSMS 不是 SQL Server 的一部分,是另一个安装包。
装完引擎不装 SSMS,你只能用 sqlcmd 敲命令,没有图形界面。
**装库这件事,九成的失败都发生在「装之前」:系统不满足、磁盘不够、端口被占。**
**所以先跑一遍自检,比装到一半再回退省事得多。**
第一段的两行输出是这台机器上的真实值:Windows 10(内部版本 10.0.19045),系统盘可用两百多 GB。
可用空间这一项过了 6 GB 的门槛。
第二段测了三个端口:1433 和 3306 都空闲,
135 有人在用——那是 Windows 自己的 RPC 端点映射,不是异常。这个例子说明:
「端口被占」不等于「有冲突」,要看占它的是谁。
connect_ex 返回 0 表示连上了,也就是有人在监听;返回非 0 表示连不上,端口空闲。
这个判断方向和直觉相反——直觉上「连不上就是有问题」,这里「连不上」才是好消息。
第三段那张表的重点是「代价」这一列:三条路都能解决端口冲突,
但只有「用命名实例」这一条不用改客户端代码。
所以真正的选择标准不是「哪个方案好」,是「哪边的改动你承受得起」。
30 秒实验
- 在你自己机器上跑一遍
port_free(1433)。 如果返回「有人在用」,再跑netstat -ano | findstr 1433查出进程号,用任务管理器看它是谁。 - 查一下本机的 .NET Framework 版本:注册表进
HKLM\SOFTWARE\Microsoft\NET Framework Setup, 再往下是NDP、v4、Full,看Release这个值。 小于 394802 就是 4.6 以下,装 SQL Server 2019 会失败。 - 算一下:如果系统盘只剩 8 GB,装完 SQL Server 大概剩多少? 引擎本体两三 GB,加上 tempdb 初始 8 MB(会自己长)、错误日志、安装缓存, 实际占用通常 5 GB 上下。
常见误区
- 「先装,装不上再说」。装 SQL Server 装到一半失败, 回退过程比重装还慢—— 它会留下注册表项、服务项、文件夹,第二次装常常报「已存在实例」。 所以先查再装, 比装坏了再修省事。
- 「端口被占就改端口」。改端口意味着每一个客户端连接串都要改, 包括你没想到的那些(报表工具、定时任务、别人写的小脚本)。 改成命名实例只要客户端写全名,影响面反而小。
- 「SSMS 装好就能用了」。SSMS 只是客户端。 装完打开,服务器名那一栏填什么都不对——因为本机根本没有引擎。要先把 SQL Server 引擎装上, SSMS 才有东西可连。
自测三问(点开对答案)
1. `connect_ex` 返回 0 是什么意思? —— **返回 0 表示「连上了」,也就是这个端口上有程序在监听。**返回非 0 表示连不上,端口空闲。 **所以判断「端口能不能用」,看的是「连不上」——这个方向和直觉相反。** 2. 1433 被占了,三条路里哪条影响面最小? —— **用命名实例。** 它只要求客户端把连接写成「主机\实例名」,而改端口要求每个连接串都改, 停旧实例要求旧应用全断。**选方案的依据是「改动落在谁身上」,不是「哪个更优雅」。** 3. 为什么 SSMS 要单独下载? —— **因为它是客户端,不是引擎的一部分。** 引擎装一次就不动,SSMS 会跟着版本更新; 而且 DBA 常常在自己电脑上装 SSMS、 连远处的服务器——**如果绑在一起,就得为了一个客户端装一整套引擎。**下一篇进 2.2b,真正开始装。那一节的重量在排序规则:Chinese_PRC_CI_AS 这串东西拆开是七段,
每一段都影响「这两个字符串算不算相等」,演示里能实测到 1 行和 3 行的差别。
- ☐ (本篇完,下一篇 2.2b 安装 SQL Server 2019 与管理工具)