教材这一节是一整套图形界面截图:点下一步、选目录、设口令、等先决条件检查跑完。 本篇不照抄步骤,改做两件更有用的事:把安装程序要检查的东西自己量一遍, 再说清卸载为什么不能只删目录。
前两篇讲的是理论和历史,这一篇开始接触真东西——不过沙箱里装不了 Oracle:要几 GB、 要注册系统服务、要开端口。所以它是个「看别人装」的章节,我把能测的都测了。 这一篇真正的价值不在安装,在卸载。 装错了大不了重装,卸不干净会让下次安装直接失败——这是无数人踩过的坑。
一、装之前先想清楚三件事
第一件:装服务端还是客户端。服务端带实例和监听,能存数据;
客户端只有 sqlplus 和网络组件,只能连别人。
只想连远程库的话,装客户端就够了,几百 MB 而不是几 GB。
第二件:字符集。 建库时定,建完再改要重建库。中文环境选 AL32UTF8(UTF-8),
别选 ZHS16GBK——GBK 存不下 emoji 和一些生僻字,将来导数据会在这里炸。
第三件:装在哪。 路径不要带空格、不要带中文。
不是 Oracle 娇气,是它的脚本用命令行拼接路径,空格会把一个参数拆成两个。
这条规矩对所有要跑脚本的软件都成立。
二、安装程序到底检查什么
点「下一步」之前,安装程序会跑一遍先决条件检查。它查的东西不多,但每一条不过都直接拦下来:
| 检查项 | 大致门槛 | 不过会怎样 |
|---|---|---|
| 物理内存 | ≥ 2 GB,推荐 8 GB | 警告,仍可继续 |
| 磁盘可用空间 | ≥ 10 GB | 直接拦下 |
| 操作系统版本 | Windows 10 x64 以上 | 直接拦下 |
| 管理员权限 | 必须有 | 直接拦下 |
| 1521 端口 | 没被占用 | 警告,可换端口 |
| TEMP 目录权限 | 可写 | 直接拦下 |
这六项里只有一项是「装完还能改」的:端口。其余五项装完就定死了,所以检查放在最前面。
装完之后要验三件事,别急着庆祝:sqlplus / as sysdba 能不能进、lsnrctl status 监听起没起、
Windows 服务里那两个 Oracle 服务是不是 Running。三件都对,才算装好了。
三、卸载为什么不能只删目录
因为 Oracle 装的不只是一个目录。 它往系统里塞了至少五样东西:
| 塞进去的 | 具体是什么 | 只删目录的后果 |
|---|---|---|
| 注册表 | 服务项、环境变量、ODBC 驱动 | 下次安装报「已存在」 |
| 系统服务 | OracleServiceORCL、监听服务 | 服务残留,端口被占 |
| 环境变量 | ORACLE_HOME、PATH、TNS_ADMIN | 命令行找不到 sqlplus,或找到旧的 |
| 全局组 | ora_dba、ora_oper | 权限判断混乱 |
| 开始菜单与计划任务 | 快捷方式、自动启动项 | 点了打不开 |
官方给的卸载方式是跑它自带的卸载程序:Windows 上是 setup.exe -deinstall,
或者用 deinstall.bat 走静默卸载。它会按清单反向清理,包括注册表和服务。
这条经验不只对 Oracle 成立。
凡是要注册服务的软件(数据库、消息队列、虚拟网卡、加密狗驱动),卸载都得走卸载程序。
「删目录 + 清注册表」是最后手段,不是首选。
四、沙箱这边怎么处理
沙箱里不装。 三个理由,按重要性排: 一是这台机器是工作机(跑 CAD 画图),装一个常驻服务、占几个 GB 内存的实例, 为了一门课不值得; 二是安装是交互式向导,命令行里走不完; 静默安装要一份 response 文件,那等于替他做系统变更决定; 三是装了也没法学完这本书——第 7、8、11、16、18 章要改控制文件、建表空间、做 RMAN 备份、 闪回数据库,这些操作在真库上做错就是数据没了。 所以本课的定位是: SQL 语法和查询逻辑用 SQLite 真跑,运维命令看原码加机制图。 等你手上真有一台测试库,再照着第 7 章往后练。
五、动手 Demo:把安装程序的检查项自己量一遍
这一段全是真测量:磁盘、内存、系统版本、管理员身份,还有本沙箱的「安装」到底有多简单。 量完你会发现:前三项这台机器全过,第四项也过。 那为什么不装?Demo 里给了理由。
import platform, shutil, os, ctypes
# 一、磁盘:安装程序第一条就查这个
for d in ('C:/', 'D:/', 'I:/'):
u = shutil.disk_usage(d)
print(d, u.total / 2**30, u.free / 2**30)
# 二、内存
class MEM(ctypes.Structure):
_fields_ = [('dwLength', ctypes.c_ulong), ('dwMemoryLoad', ctypes.c_ulong),
('ullTotalPhys', ctypes.c_ulonglong),
('ullAvailPhys', ctypes.c_ulonglong),
('ullTotalPageFile', ctypes.c_ulonglong),
('ullAvailPageFile', ctypes.c_ulonglong),
('ullTotalVirtual', ctypes.c_ulonglong),
('ullAvailVirtual', ctypes.c_ulonglong),
('ullAvailExtendedVirtual', ctypes.c_ulonglong)]
m = MEM(); m.dwLength = ctypes.sizeof(MEM)
ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(m))
# 三、系统与管理员身份
platform.system(), platform.release(), os.cpu_count()
ctypes.windll.shell32.IsUserAnAdmin()
# 四、本沙箱的「安装」:SQLite 是标准库自带的
import sqlite3; sqlite3.sqlite_version
实跑输出:
--------------------------------------------------------------------
第三课:安装与卸载——先量一量这台机器够不够
--------------------------------------------------------------------
**教材这一节是图形界面截图:**
**点下一步、选目录、设口令、等先决条件检查跑完。**
**沙箱里没有图形界面,也装不了(要几 GB、要改系统配置、要建实例)。**
**能做的是一件更有用的事:**
**把「安装程序会检查什么」自己量一遍。**
先量磁盘
--------------------------------------------------------------------
C:/ **总 300 GB,可用 169.8 GB**
D:/ **总 631 GB,可用 572.4 GB**
I:/ **总 382 GB,可用 246.2 GB**
再量内存与系统
--------------------------------------------------------------------
系统:**Windows 10**
机器:**AMD64**
处理器:**8 个逻辑核**
物理内存:**总 15.9 GB,可用 7.0 GB**
当前进程是管理员:**是**
对照安装程序的门槛
--------------------------------------------------------------------
**Oracle 19c 的服务端安装,公开的硬门槛大致是:**
- 磁盘 **至少 10 GB**(软件 7 GB 上下,加上数据库文件)
- 内存 **至少 2 GB**,推荐 8 GB 以上
- 系统 **Windows 10 x64 / Windows Server 2016 以上**
- **要有管理员权限**(要注册服务、要开 1521 端口)
**对照上面量到的:**
- 磁盘与内存:**够**(内存 15.9 GB,磁盘三个盘都在百 GB 以上)
- 系统版本:**够**
- 管理员权限:**有**(`IsUserAnAdmin` 当场返回 True)
**四项全过。那为什么不装?**
**因为这机器不是我的实验台。**
**装 Oracle 19c 要注册两个常驻系统服务、要开 1521 端口、要占掉几个 GB 内存,静默安装还得替他填一份 response 文件。**
**这是波仔画图的工作机,为了一门课去动系统层,不划算也不该。**
**所以本课不装,改用 SQLite 跑等价演示。**
卸载为什么不能只删目录
--------------------------------------------------------------------
[Oracle 原码 · 本沙箱不执行]
| # Windows 上要用 Oracle 自带的卸载程序
| setup.exe -deinstall
| # 或者命令行
| deinstall.bat -silent -paramfile deinstall.rsp
**因为 Oracle 装的不只是一个目录:**
- **注册表**里有一堆键(服务、环境变量、ODBC)
- **系统服务**(OracleServiceORCL、OracleOraDB19Home1TNSListener)
- **环境变量**(ORACLE_HOME、PATH、TNS_ADMIN)
- **开始菜单项、全局组 ora_dba**
**只删目录的后果是:**
**再装一次会报「服务已存在」,而新装又没有这些服务,两头都不是。**
**这条规矩不只 Oracle 适用:**
**凡是要注册服务的软件(数据库、消息队列、虚拟网卡),卸载都得走卸载程序。**
本沙箱的「安装」:一条命令都没有
--------------------------------------------------------------------
**SQLite 是 Python 自带的模块**,`import sqlite3` 就完事:
`sqlite3.sqlite_version` → **3.53.1**
`sqlite3.version` → **2.6.0**(这是模块的版本,不是引擎的)
**一个文件就是一个库,不需要服务、不需要端口、不需要账号。**
**这也正是它演不了 Oracle 那些运维章节的原因**——**它压根没有「实例」这层东西。**
shutil.disk_usage 给的是「总容量、已用、可用」三个数,单位是字节,
除以 1024*1024*1024(一千零二十四的三次方)换成 GB。
它量的是分区,不是目录——所以 C:/ 和 C:/Windows 会给出一样的数。
内存那段用了 ctypes 调 Windows 的 GlobalMemoryStatusEx。
这不是「必须这么写」,是因为标准库里没有直接读物理内存的函数。
这段代码只在 Windows 上有效,换 Linux 要读 /proc/meminfo。
IsUserAnAdmin() 返回 True/False,是当场测的,不是猜的。
注意它测的是「当前进程有没有提升权限」,不是「这个账号是不是管理员」——同一个账号,
普通启动和管理员启动,结果不一样。
最后一行是这一篇的重点:sqlite3.sqlite_version 给 3.53.1,sqlite3.version 给 2.6.0。
前者是引擎版本,后者是 Python 模块的版本——很多人把这两个搞混,然后在文档里写错版本号。
30 秒实验
- 把
shutil.disk_usage换成shutil.disk_usage('C:/Windows'),看结果是不是和C:/一样。 一样就说明它量的是分区。 - 查一下本机 1521 端口有没有被占用(
socket.connect_ex), 再查 3306(MySQL)和 5432(PostgreSQL)。三个都不通,说明这台机器上没有任何数据库在跑。 - 在注册表里搜一下
ORACLE_HOME(reg query HKCU\Environment)。 没有任何结果,就是「这机器从没装过 Oracle」的证据。
常见误区
- 把安装目录设在「Program Files」下。 带空格的路径会让 Oracle 的脚本出错,
而且出错信息通常和路径无关,很难查。规范做法是
C:\app\oracle\product\19c。 - 用中文路径或者中文计算机名。 建库时生成的文件名、监听配置里都会带主机名, 中文主机名是 TNS 连不上的经典原因。
- 卸载时直接删目录。 结果就是下次安装报「服务已存在」, 而新装又确实没有这个服务——两头都不是,只能手工清注册表。
自测三问(点开对答案)
1. 安装前那次检查里,哪一项装完还能改? —— **端口。** 监听端口写在 `listener.ora` 里,改完重启监听就行。 内存、磁盘、系统版本、权限,装完都定死了。 2. 为什么字符集要在建库时定? —— **字符集决定数据怎么存**,改字符集等于把所有字符重新编码一遍, **只能在建库时选,之后要改就是重建库加导数据。** 中文环境用 AL32UTF8。 3. 卸载 Oracle 的正确做法是什么? —— **跑它自带的卸载程序**(`setup.exe -deinstall` 或 `deinstall.bat`), 它会按清单反向清注册表、服务、环境变量。**只删目录会留下一堆残骸。**下一篇讲三个管理工具:SQL*Plus、EM、DBCA。 沙箱里三条路一条都不通, 所以那篇 Demo 是「三条路挨个测一遍,全部失败」—— 失败本身把「客户端/服务端/监听」这三层讲清楚了。
- ☐ (本篇完,下一篇 1.4 Oracle 19c 的管理工具)
相关笔记
- Oracle 19c 的管理工具
-
- 🗄️ 数据库基础/00-索引
- 🏺 Oracle从入门到精通 · 索引