🏺 第1章 Oracle 19c 概述
📄 一句话概括

教材这一节是一整套图形界面截图:点下一步、选目录、设口令、等先决条件检查跑完。 本篇不照抄步骤,改做两件更有用的事:把安装程序要检查的东西自己量一遍, 再说清卸载为什么不能只删目录。

📝 本章和前面几章的关系

前两篇讲的是理论和历史,这一篇开始接触真东西——不过沙箱里装不了 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 秒实验

  1. 把 shutil.disk_usage 换成 shutil.disk_usage('C:/Windows'),看结果是不是和 C:/ 一样。 一样就说明它量的是分区。
  2. 查一下本机 1521 端口有没有被占用(socket.connect_ex), 再查 3306(MySQL)和 5432(PostgreSQL)。三个都不通,说明这台机器上没有任何数据库在跑。
  3. 在注册表里搜一下 ORACLE_HOME(reg query HKCU\Environment)。 没有任何结果,就是「这机器从没装过 Oracle」的证据。

常见误区

  1. 把安装目录设在「Program Files」下。 带空格的路径会让 Oracle 的脚本出错, 而且出错信息通常和路径无关,很难查。规范做法是 C:\app\oracle\product\19c。
  2. 用中文路径或者中文计算机名。 建库时生成的文件名、监听配置里都会带主机名, 中文主机名是 TNS 连不上的经典原因。
  3. 卸载时直接删目录。 结果就是下次安装报「服务已存在」, 而新装又确实没有这个服务——两头都不是,只能手工清注册表。
自测三问(点开对答案) 1. 安装前那次检查里,哪一项装完还能改? —— **端口。** 监听端口写在 `listener.ora` 里,改完重启监听就行。 内存、磁盘、系统版本、权限,装完都定死了。 2. 为什么字符集要在建库时定? —— **字符集决定数据怎么存**,改字符集等于把所有字符重新编码一遍, **只能在建库时选,之后要改就是重建库加导数据。** 中文环境用 AL32UTF8。 3. 卸载 Oracle 的正确做法是什么? —— **跑它自带的卸载程序**(`setup.exe -deinstall` 或 `deinstall.bat`), 它会按清单反向清注册表、服务、环境变量。**只删目录会留下一堆残骸。**

下一篇讲三个管理工具:SQL*Plus、EM、DBCA。 沙箱里三条路一条都不通, 所以那篇 Demo 是「三条路挨个测一遍,全部失败」—— 失败本身把「客户端/服务端/监听」这三层讲清楚了。

相关笔记