Oracle 11g实例脚本实践:从安装排错到迁移避坑指南
2026/9/7 8:33:48 网站建设 项目流程

简介:这份《Oracle 11g从入门到精通(第二版)》实例源程序压缩包,是配合书籍学习的实操代码合集,面向数据库初学者、开发工程师及备考DBA的读者,通过19个章节的程序实例帮助理解Oracle 11g从基础到进阶的完整知识链。包体内共包含495个文件,体量仅1.21MB,主要以txt文档、class编译类、java源码和xml配置文件为主,同时包含少量jpg示意图、bak备份文件、doc/xls辅助资料及数据导入文件,各类文件分别对应示例说明、可直接运行的类、可研读的源代码与项目配置。实例主题覆盖安装配置与SQL查询、表与索引构建、视图/存储过程/触发器/游标等高级对象,再到用户权限、数据安全、物理备份恢复,以及SQL调优、分区表和并行执行等性能优化场景。目前已有403人学习下载,将书中理论对照源码逐行调试,可有效加深对Oracle 11g运行机制和数据库管理策略的掌握,尤其适合边学边练的入门与进阶者。 这些年经常有新人问我:学Oracle到底该从哪里下手?我基本都会先反问一句——你有没有把《Oracle 11g从入门到精通(第二版)》那本绿皮书的配套实例源程序跑一遍。那本书排版确实不洋气,内容也有点老派的啰嗦,但它附带的那个rar压缩包,其实是几百个能直接执行的SQL和PL/SQL脚本,从最简单的SELECT到备份恢复、性能调优全都覆盖了。不过实话实说,我第一次拿到这个实例源程序的时候,光是让环境跑起来就折腾了好几天,中间踩的坑比书里的知识点还多。

这篇文章就把我从下载Oracle 11g安装包、装好数据库、跑通书里实例,到后来卸载、搬去Linux服务器、甚至把数据迁到SQL Server的完整过程捋一遍。适合刚接触Oracle、手里有这本书的实例源程序但跑不起来的读者,也适合那些已经被ORA-12505折磨过的同行。文章不聊虚的,全是实际动手时遇到的问题和解决办法。

1. 先搞清楚这个rar里装的到底是什么

1.1 解压后的目录结构和脚本构成

这个实例源程序解压出来后,第一眼看上去就是一个按章节组织的脚本集合。我手里这份解压后大概是十几个文件夹,分别对应书里的章节:前几章是SQL基础,包括单表查询、多表连接、常用函数和子查询;中间几章是PL/SQL编程、存储过程、函数、包和触发器;后面则是表空间管理、备份恢复、性能监控这些偏管理向的内容。每个文件夹里是一堆.sql脚本,个别章节还带了Java JDBC和.NET调用Oracle的示例工程。

这种编排对初学者来说其实很友好,你可以一边看书,一边把对应的脚本在SQL*Plus里面执行,直接对比书上的输出结果。但要注意,脚本之间是有依赖关系的,很多查询例子是基于某几张演示表去跑的,比如经典的scott用户下的emp、dept表。如果直接一上来就执行后面的查询脚本,很容易报“表或视图不存在”,这不代表书错了,而是你漏掉了最开始的建表脚本。

1.2 哪些例子值得认真跑,哪些可以略过

以我自己的经验,前四章的SQL查询脚本值得逐个敲一遍,这些是基本功,多写几遍没坏处。第五到第七章的PL/SQL、存储过程和触发器例子是最有含金量的部分,工作中用得最多,值得花时间去理解每段代码的执行逻辑。至于备份恢复和性能监控那几章的脚本,涉及exp/imp和RMAN,执行时需要DBA权限,新手在自己的实验机上跑时要格外小心。实验库搞坏了还能重装,要是哪天在公司的生产环境上试这些命令,后果就不是重装能解决的了。

而那些Java、C#调用数据库的示例代码,除非你正好要做应用集成,不然大概扫一眼连接字符串的写法就够了,不用每个工程都编译运行一遍,性价比不高。说到底,这个rar的真正价值在于SQL和PL/SQL那一部分,先把这些吃透,远比折腾运行环境里的花架子有意义。

2. 跑实例的第一道坎:Oracle 11g桌面类安装完整记录

2.1 安装包版本选择和下载注意点

想跑书里的例子,前提是先有一个能连的Oracle 11g。安装包我建议直接选11.2.0.4,这是11g最后的一个发行版,稳定性比11.2.0.1好很多。去Oracle官网下载需要注册一个账号,登录后在下载页面选择Database 11g,会看到两个zip包,数据库本身被拆成了两半,两个包都要下载,而且下载完必须解压到同一个文件夹,前缀目录要一致,否则setup.exe会报找不到文件。

很多新手在这一步就败了。常见问题包括:只下载了第一个zip,解压到一半就运行安装程序;或者是解压路径里有中文和空格,导致后续安装时找不到OUI组件。我的建议是解压到类似D:\oracle_install这种纯英文路径,同时把杀毒软件暂时退出,老版本安装程序在Windows下经常被拦截关键文件。

2.2 桌面类安装的正确姿势

双击setup.exe之后,安装程序会问你选“桌面类”还是“服务器类”。如果只是学习跑教材例子,直接选桌面类就够了。桌面类会把Oracle基础软件和数据库实例一次性装好,不用单独配置监听器参数,对新手来说省掉了一大堆细节。安装过程中需要设置的主要是两样:Oracle基目录和数据库的全局数据库名,也就是SID。这里记住一件事,默认的SID是orcl,后面连接数据库时要用到它,别改成一个自己都记不住的名字。

安装过程大约半小时到一小时,具体看机器性能。中间会有一些先决条件检查,如果报环境变量PATH过长,把系统PATH里没用的路径清一下再重试。如果报内存不足,检查虚拟机内存,至少给到2GB以上。这里多说一句,Oracle 11g虽然老,但挑环境的毛病一点不少,Windows用户名如果是中文,安装时可能直接报错,建议用英文账户操作。

2.3 装完之后必须做的初始化操作

安装完成后,别急着立刻执行书里的脚本。先做三件固定动作:第一,打开命令提示符,输入sqlplus / as sysdba,如果能进入SQL*Plus提示符,说明数据库实例已经起来了;第二,运行lsnrctl status,确认监听器处于运行状态,并且能看到orcl这个服务;第三,解锁scott用户,因为书里大量例子用的都是scott/tiger这个账号,解锁命令是ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK。

这三个动作花不了五分钟,但能把后面一系列连接问题提前消灭掉。很多读者后来问我为什么连不上数据库,我让他们先跑这三步,结果大半的人卡在第二步或第三步——监听器没启动,或者scott没解锁。数据库本身装好了,但这些初始化操作没人提醒的话,新手根本想不到。

3. ORA-12505连接失败:一次排错的完整链路

3.1 先搞清楚SID、服务名和监听器之间的关系

书里跑例子时必然会遇到连接数据库这一步,而ORA-12505这条报错,我见过太多人栽在上面。报错原文是TNS:listener does not currently know of SID given in connect descriptor,翻译成人话就是:监听器不认识你给的那个SID。很多人一看就懵,但其实理解起来并不复杂。SID是一个数据库实例的唯一标识,相当于一个人的身份证号;服务名是数据库对外提供的逻辑名称,相当于一个人在公司里的英文名;而监听器是数据库和应用之间的前台接待员,应用报上证件号,接待员核对之后才帮你转接。

问题就出在对不上号。连接数据库时,字符串里写的是SID还是服务名,监听器会拿着它去比对注册信息。如果名字对不上,自然就报ORA-12505。

3.2 一步一步剥开报错原因

我当时排查这个问题的顺序,现在分享给你们,可以照搬。

第一步,确认数据库实例是不是真的起来了。在命令行里执行sqlplus / as sysdba,能进说明实例在,如果数据库处于mount或nomount状态,服务不会注册到监听器,先执行ALTER DATABASE OPEN把它打开。

第二步,执行lsnrctl status,看监听器当前的注册情况。正常情况下能看到类似Instance "orcl", status READY的条目。如果这里压根没有orcl,说明实例还没注册到监听器。Oracle 11g默认是靠PMON进程动态注册的,数据库刚启动时可能要等几十秒甚至一分钟,别慌,等一会儿再执行lsnrctl status。

如果等了很久还是没有,就在SQL*Plus里手动触发一次注册,执行ALTER SYSTEM REGISTER。我之前遇到过虚拟机里时间不对,导致动态注册失败的情况,手动注册一下就好了。

第三步,对比你的连接字符串。常见的错误写法是把service_name和sid混用,比如在tnsnames.ora里写了SERVICE_NAME = orcl,但连接时却用@localhost:1521/orcl这种方式,而监听器配置文件里恰好又只注册了别的SID。最简单有效的验证方式是用lsnrctl services,它能列出监听器知道的所有服务名和SID,拿它和你的连接串比对,问题一眼就能看出来。

3.3 一套不会出错的tnsnames.ora和listener.ora写法

这里给出我自己一直在用的模板。tnsnames.ora里这样写:

ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

连接时用sqlplus scott/tiger@localhost:1521/orcl,或者直接sqlplus scott/tiger@ORCL,都可以正常走通。如果还是报ORA-12505,通常情况下是因为监听器配置里手工指定了SID_LIST,但里面没有orcl这个SID。检查一下listener.ora,理想状态下让动态注册生效就行,不用在listener.ora里写死SID。只有当动态注册确实不可用,比如实例异常退出过,才考虑手工添加:

SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = D:\app\oracle\product\11.2.0\dbhome_1) (SID_NAME = orcl) ) )

改完listener.ora后记得重启监听器,否则配置不生效。

经验之谈:ORA-12505和ORA-12514这两条报错经常被混为一谈。12505是监听器不知道这个SID,12514是监听器不知道这个服务名,两者排查思路类似,但一个查SID一个查SERVICE_NAME,别搞混。

4. 装完后悔了?Oracle 11g卸载的完整自救指南

4.1 为什么Oracle卸载总是“卸不干净”

书跑完了,或者装完发现这个库用不上想腾出空间,卸载Oracle就成了新的难题。Windows上Oracle难卸载是出了名的,因为它不像普通软件那样一个卸载程序就清干净。Oracle在系统里留下的东西无处不在:系统服务、注册表项、环境变量、安装目录,尤其是那个C:\app目录,里面既有数据库文件又有日志,动不动就要占好几个G的空间。

另外还有一个很容易被忽略的地方,Oracle会在系统里注册一个叫OracleOraDb11g_home1TNSListener的服务,以及对应的数据库实例服务。正常卸载流程走完,这些服务可能还会残留在系统里。如果直接删除目录而不清理服务,下次装其他数据库软件时可能会出现端口占用冲突,因为你以为卸干净的Oracle还在偷偷监听1521端口。

4.2 正确的卸载顺序和手动清理步骤

我重新整理过自己的卸载流程,按照这个顺序基本不会留下烂摊子。

第一步,停掉所有Oracle相关服务。在Windows服务管理器里找到所有名称以Oracle开头的服务,全部停止。

第二步,用DBCA删除数据库实例。命令行里执行dbca,选择删除数据库,这一步会把数据库的数据文件和控制文件清理掉。

第三步,运行OUI的卸载功能。在开始菜单里找到Oracle安装目录下的Universal Installer,选择卸载产品,把所有Oracle组件勾选后卸载。

第四步,运行deinstall工具。11.2.0.4在ORACLE_HOME下自带deinstall目录,运行其中的deinstall.bat,它会自动分析已安装的组件并清理。这一步比传统的OUI卸载更彻底,会清理网络配置和环境变量。

第五步,手动清理遗留。打开注册表编辑器regedit,删除HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE整个键。然后清理系统环境变量里的ORACLE_HOME、ORACLE_SID、TNS_ADMIN,以及PATH里包含Oracle路径的条目。最后把Oracle安装目录和C:\app目录整个删掉,如果提示文件被占用,检查还有没有Oracle服务在跑,或者干脆重启后再删。

这套流程走完,系统里基本不会留下和Oracle相关的东西。我自己第一次卸载时图省事,直接删目录,结果后来装其他数据库软件时发现1521端口被一个残留的TNSListener服务占用,折腾半天才找到原因。所以这一步别嫌麻烦,按流程来才是最省时间的。

5. 实例源程序搬到Linux:CentOS上部署Oracle 11g的实操记录

5.1 先补齐依赖包和内核参数

书里的例子在Windows上跑通之后,很快就有人会遇到另一个需求:把同样的脚本搬到Linux服务器上执行。这里最大的坑不在于脚本本身,而在于Oracle 11g在Linux上的前置条件极其繁琐。我第一次在CentOS 7上装Oracle 11g时,先决条件检查挂了五次,不是缺这个包就是少那个库。

在CentOS上安装Oracle 11g,依赖包大致包括binutils、compat-libcap1、compat-libstdc++-33、gcc、gcc-c++、glibc、glibc-devel、ksh、libaio、libaio-devel、libgcc、libstdc++、libstdc++-devel、libXext、libXtst、libX11、make、sysstat、unixODBC、unixODBC-devel。CentOS 7里还需要额外装libnsl。用yum一次性装齐:

yum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst libX11 make sysstat unixODBC unixODBC-devel libnsl

装完依赖包,还要建oracle用户和用户组,然后调整内核参数。核心的几个参数包括kernel.sem信号量、fs.file-max文件句柄上限、net.ipv4.ip_local_port_range端口范围,还有内存相关的kernel.shmmax和kernel.shmall。这些参数要写进/etc/sysctl.conf,执行sysctl -p生效。另外还得在/etc/security/limits.conf里给oracle用户设置nofile和nproc的上限,不然安装或运行时会报权限错误。

这套操作倒是和书的章节无关,纯粹是环境工程的活儿。但如果你想在Linux上跑书里的备份恢复实例,这些准备工作绕不开。还有一类常见需求是在某些非主流Linux发行版上离线部署,这类系统默认源里不一定有Oracle要的兼容库,需要先把依赖rpm包下载好,配置本地yum源再安装,提前把离线依赖包备齐能省大量排障时间。

5.2 字符集、脚本编码和SQL*Plus跑批

Linux环境跑通后,第二个坑是字符集。书里的脚本很多是在Windows环境下用GBK编码保存的,直接拷贝到Linux下用SQL*Plus执行,中文注释和中文数据会乱码。解决办法有两个:要么在安装数据库时把字符集选成ZHS16GBK,要么在执行脚本前设置好NLS_LANG环境变量。我个人建议把NLS_LANG设置为AMERICAN_AMERICA.AL32UTF8,然后把脚本文件通过iconv转成UTF-8编码:

iconv -f GBK -t UTF-8 chapter5.sql > chapter5_utf8.sql

转码之后再执行,就不会出现中文乱码的问题了。

至于跑批,Linux服务器上一般没有图形界面,不必因此放弃书里的PL/SQL例子。SQL*Plus本身就是命令行工具,执行脚本的方式很简单:

sqlplus scott/tiger@orcl

进入SQL*Plus后执行@/home/oracle/scripts/chapter5.sql,脚本就会逐条执行。想要把执行结果保存下来分析,用SPOOL命令即可:

SPOOL /tmp/example_output.txt @/home/oracle/scripts/chapter5.sql SPOOL OFF

这个组合我到现在还在用,比任何图形化工具都稳定,尤其适合在远程服务器上跑批量脚本。

6. 数据要搬家:Oracle 11g迁移到SQL Server 2016的实操记录

6.1 两种迁移路线怎么选

书里的实验数据积累到一定程度,或者你正在做一个从Oracle到SQL Server的系统替换项目,就会碰到跨数据库迁移的问题。我自己做过几次从Oracle 11g迁到SQL Server 2016的迁移,流程不算复杂,但细节非常考验人。

迁移路线有两条。第一条是用微软官方的SSMA for Oracle工具,它是专门的迁移助手,可以自动完成表结构转换、数据类型映射、甚至部分存储过程和函数语法转换。这个工具对大量表的迁移效率很高,比如十几张表加几十个存储过程,用SSMA基本上一键转换,然后手动检查警告信息。

第二条路线是全手工方式,适合表数量少、结构简单的场景。先把Oracle里的数据导出成CSV或者通过expdp导出,再在SQL Server里建好对应的表,用SSIS或者BCP把数据导进去。这条路线的好处是可控性强,每步都能验证数据,坏处是工作量大,表一多就容易漏。我建议超过十张表就用SSMA,十张以下手工操作反而更快。

6.2 字段类型对照和三个最隐蔽的坑

不管走哪条路线,字段类型映射都是绕不开的。下面这张表是我整理过多次的实际映射规则:

Oracle类型SQL Server类型说明
VARCHAR2(n)NVARCHAR(n)有中文场景建议用NVARCHAR
NUMBERINT / DECIMAL(p,s) / FLOAT无小数用INT,有小数用DECIMAL
DATEDATETIME2(0)Oracle的DATE包含时分秒
TIMESTAMPDATETIME2注意秒以下精度
CLOBNVARCHAR(MAX)大文本
BLOBVARBINARY(MAX)二进制

类型映射看着简单,但实际迁移时还有三个很隐蔽的坑。

第一个坑是NUMBER类型不带精度。Oracle允许NUMBER裸用,表示任意精度数字,但SQL Server必须明确是INT还是DECIMAL(p,s)。如果不先做数据探查,直接把NUMBER映射成DECIMAL(38,0),小数位就丢了;映射成FLOAT,又可能出现精度漂移。我习惯先跑一条SQL统计每列的精度和小数位,再决定映射类型:

SELECT column_name, data_precision, data_scale FROM all_tab_columns WHERE table_name = 'EMP';

第二个坑是Oracle的空字符串和NULL处理。Oracle里空字符串会被当成NULL存储,但SQL Server里空字符串就是空字符串,NULL就是NULL,两者严格区分。数据迁过去之后,原本应该为NULL的字段可能成了空字符串,业务逻辑一判断就出错。迁移完成后必须做一轮空值清洗,统一Null和空串的规则。

第三个坑是序列和自增列的转换。Oracle没有自增列,靠SEQUENCE生成主键;SQL Server用IDENTITY实现自增。直接迁移数据时,如果把序列生成的既有主键插入IDENTITY列,需要先执行SET IDENTITY_INSERT 表名 ON,否则会报错。迁移完之后别忘了重置IDENTITY的种子值,不然下次插入数据时主键冲突只能你自己扛。

至于PL/SQL存储过程转换成T-SQL,工作量更大。游标写法、异常处理、隐式类型转换,两边语法差异不小。SSMA能转换大部分语法,但转换完必须逐个跑了验证,不要相信工具输出一定正确。我自己就吃过亏,一个转换后的存储过程看似正常,实际执行时报了类型转换错误,排查才发现是隐式转换规则不一致导致的。

7. 书里面的例子跑完了,接下来呢

说点个人习惯。我每次带新人学Oracle,都让他们先把书里的实例脚本从头到尾跑两遍,第一遍照着敲,第二遍脱稿自己写。这个做法看起来笨,但效果比看十篇教程都好。那些脚本里的SQL写法确实有年头了,但底层的表连接逻辑、子查询思路、PL/SQL的块结构,放到今天依然是基本功。

至于这个rar里我唯一觉得可惜的部分,是没有把性能调优的例子做得更贴近真实场景。书里的性能脚本基本是基于小数据量演示的,你在大表上跑的时候会发现执行计划完全不是那么回事。不过这是后话——等你能把书里的例子跑利索了,再去找些大表来做性能实验也不迟。到那一步,你已经不是需要这份rar的新手了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询