和oracle19c的容器数据库相爱(不是)相sha的一周
2022-04-06 13:01阅读:
为了重装19c,整个清明节都远程连在了服务器上,终于在上班第一天搞定,非常不容易! 根据百度出来的教程,基本步骤是一致的:
1 停止oracle服务,在搜索栏输入services,打卡“服务”,停止所有oracle开头的服务

2 在开始-程序中找到oracle下的
Universal
Installer,运行它,除了根不卸载,其余全部画勾卸载
3
清除注册表,此项操作最为不稳定,根据删除的力度会有不同的结果。
3.1
经典删除内容
HKEY_LOCAL_MACHINE\SOFTWARE下oracle目录整体删除
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services删除所有oracle开头的项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\S
ervices\Eventlog\Application,删除所有oracle开头的项
3.2
附加删除内容
根据19c的卸载看,只删除三个经典内容,重装到42%会卡住,所以多删除以下内容:
在HKEY_CLASSES_ROOT删除以Ora、Oracle、Orcl或EnumOra为前缀的键
实际上在第三次重装时,删除了HKEY_CLASSES_ROOT中的oracle内容后还是失败,因此在整个注册表中搜索oracle,除了公司名是oracle或者是.net中的oracle。其余可疑的注册项均删除,此操作异常危险!不要模仿!
4
删除oracle环境变量,Path中的带oracle安装目录的以及oracle_home
5
重启计算机
6
删除oracle的安装目录和app目录
7 删除Program
Files下oracle目录
8
删除C:\Users下oracle目录
9
删除ProgramData下oracle内容,此操作应该不需要
****开始重装*****
以上操作完成后,重新解压安装包,将home文件夹放到oracle目录下,双击setup.exe开始重装。各种选项不再赘述,但是最后一次安装中,在42%时报错:Oracle
Net Services
配置失败。退出代码是1。Oracle
Net Configuration Assistant
失败。,重试后过去了,在70多的时候再次报错:Oracle Database
Configuration Assistant 失败。再次重试加跳过后完成了安装。
安装完成后打开服务,里面只有一个oracle服务。不要灰心,在cmd窗口里输入sqlplus
/ as sysdba,登录成功,说明oracle库数安装成功了,只是实例和监听都没有。
在开始中找到oracle-DBCA,创建一个数据库,选择创建为容器数据库,在43%和51%会卡住很久,耐心等待,最终创建成功。成功后依然没有监听,此时在cmd窗口手工执行lsnrctl
start,监听启动。
在本地使用navicat连接数据库,连接成功。安装完成。
此时启动并连接的实例是CDB,也就是容器,容器内的PDB还没有连接成功,需要修改listener和tnsnames.ora文件,修改后重启TNS服务,就可以使用PDB的实例名连接数据库。

**************我是oracle没有坑是不可能的分割线********************
在创建成功oracle的cdb和pdb后,使用navicat连接成功,但是应用程序连接时pdb报错,提示是根据SID找不到:ORA-12505,
TNS:listener does not currently know of SID given in connect
descriptor
用navicat选择SID果然也是不通,问题就变成了pdb用服务名连接正常,SID失败。实例本身肯定是ok,问题判断是出在监听的配置上,被坑久了已经坑出了经验。
经过一系列的搜索和尝试,最终解决了此问题,记录一下。
首先在网上找到了一位网友记录的英文解释,在此拷贝一下:
cause:
PDB is not an instance, so using SID in the connection string will
not work unless the following listener.ora file setting is in
place:
USE_SID_AS_SERVICE_
listener name=ON When
the database is an Oracle Database 12 container database, the
client must specify a service name in order to connect to it.
拙劣的翻译一下:
PDB不是一个实例,所以除非listener.ora文件中设置USE_SID_AS_SERVICE_listener
name=ON,否则无法使用SID连接。当数据库是一个oracle12c的容器数据库,客户端必须使用一个服务名来连接它。
solution:
Use USE_SID_AS_SERVICE_listener_name=on in listener.ora and restart
the listener . This will enable the system identifier (SID) in the
connect descriptor to be interpreted as a service name when a user
attempts a database connection. Database clients with earlier
releases of Oracle Database that have hard-coded connect
descriptors can use this parameter to connect to a container or
pluggable database.
解决方法:
将USE_SID_AS_SERVICE_listener=on增加到listener.ora,然后重启监听。当用户连接数据库时,这个配置允许使用SID连接时转换为使用服务名。当数据库连接客户端的早些版本硬编码了连接放啊是,可以用此配置来连接可插拔数据库(pdb)。