个人理解
监听器先“开门”:
在 127.0.0.1:1521 或 0.0.0.0:1521 上启动并监听,等待任何指向它的请求。同时读取静态配置listener.ora
lsnrctl status #查看
lsnrctl start [监听器名称] # 启动
lsnrctl stop [监听器名称] # 停止
lsnrctl reload [监听器名称] # 重新加载配置(不中断服务)
监听器 → 饭店的大门和前台,开门迎客。
服务(SERVICE_NAME) → 菜单上的“口味”,比如“川菜”“粤菜”。
实例(INSTANCE_NAME / SID) → 具体的一道菜,只有“已出锅(READY)”才能端上桌。
客户端请求 → 顾客进门说“我要吃川菜”,前台先看本店有没有“川菜”这个口味,再看该口味下有没有已出锅的菜。
如果该口味下没有 READY 的菜,就告诉顾客“对不起,这道菜暂时做不了”。
所以,想吃哪一种口味,必须确认那一口味下确实“有菜且已出锅(READY)”。
net Configuration Assistant 傻瓜式重装且重启
实例再“报到”:
数据库实例启动后,PMON 把实例名/服务名注册到监听器(动态或静态),监听器才知道“有人可接客”。
SHOW PARAMETER local_listener
数据库实例启动后,PMON 进程就是读取 local_listener 参数里的地址(主机+端口)去向对应的监听器注册。
如果 local_listener 为空,就默认去 localhost:1521 注册。
分为两种方式:
间接:
到客户端连接文件 (`tnsnames.ora`)中查询是否存在这个**监听器名称**(**逻辑名称**),从而找到HOST和PORT
LISTENER_ORCL = (<-----监听器名称/逻辑名称)
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
或
LISTENER_ORCL =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
直接:
ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))';
只有两步都完成,客户端请求才能:
“先找到门(监听器)→ 再被领到正确房间(实例)→ 开始执行 SQL”。
快速定位tnsnames.ora
tnsping dummy 执行后大概显示目录位置
直接查看SHOW PARAMETER local_listener值
sqlplus / as sysdba
SQL> SHOW PARAMETER local_listener;
简洁流程
监听器开通道且读静态配置listener.ora,
lsnrctl status #查看
lsnrctl start [监听器名称] # 启动
lsnrctl stop [监听器名称] # 停止
lsnrctl reload [监听器名称] # 重新加载配置(不中断服务)
net Configuration Assistant 傻瓜式重装且重启
数据库启动读local_listener值动态注册
间接:查文件tnsnames.ora
找目录:tnsping dummy
分析:tnsnames.ora,去库中把值改为监听器的名称。
直接:ALTER SYSTEM SET local_listener=‘(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))’;
ALTER SYSTEM REGISTER;
sqlplus / as sysdba
SQL> SHOW PARAMETER local_listener;
SQL> -- 改为空值的方式,自动连接(没有成功过)
ALTER SYSTEM RESET local_listener SCOPE=BOTH;
ALTER SYSTEM RESET local_listener SCOPE=SPFILE;
ALTER SYSTEM SET local_listener='' SCOPE=BOTH;
SQL> SHUTDOWN IMMEDIATE -- 重启
SQL> STARTUP -- 重启
SQL> SHOW PARAMETER service_names; 查询注册的动态服务名
SQL> ALTER SYSTEM REGISTER; -- 强制 PMON 立即向监听器注册
常见问题:
- 无法在cmd直接执行sqlplus / as sysdba
- 数据库或实例启动失败
卸载
备份数据
C:\Windows\System32>expdp his/his@orcl full=y directory=DATA_PUMP_DIR dumpfile=full_orcl_backup.dmp logfile=expdp_orcl.log
停服务
net stop OracleServiceORCL
启服务
net start OracleServiceORCLcmd
管理员运行
D:\app\54411\product\11.2.0\dbhome_1\deinstall\deinstall.bat
按提示一直执行
三条检查注册表是否干净的命令(以管理员身份运行)
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Oracle"
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Oracle"
sc query | find /I "oracle"
如果不干净,用“管理员”重新打开 PowerShell
# 管理员 PowerShell
# 1. 停止并删除服务
Get-Service *oracle* | Stop-Service -Force -ErrorAction SilentlyContinue
Get-Service *oracle* | % { sc.exe stop $_.Name 2>$null; sc.exe delete $_.Name 2>$null }
# 2. 删除注册表
Remove-Item -Path "HKLM:\SOFTWARE\Oracle" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\SOFTWARE\Wow6432Node\Oracle" -Recurse -Force -ErrorAction SilentlyContinue
# 3. 清理 PATH
$p = [Environment]::GetEnvironmentVariable('PATH','Machine')
$p = ($p -split ';' | Where-Object { $_ -notmatch 'oracle' }) -join ';'
[Environment]::SetEnvironmentVariable('PATH',$p,'Machine')
Write-Host "清理完成,请重启电脑后再运行 setup.exe"
安装
安装时候,注意修改一下安装目录,一直点点点
安装好后,开启服务
配置一个监听器
启动数据库,并修改连接地址使用直接寻址连到监听器
检查实例是否注册到监听器中
自己测试cmd能否连接
用工具是否能连接,不能连接记得改一下oci.dll 路径
顺便配置一下环境变量
无法直接连接数据库解决方案
通过挂载 Mount 但不启动的方式修改数据
set ORACLE_SID=<ORCL> #设置orcl
sqlplus / as sysdba #直接登录数据库
如果登录失败,则需要将本机用户添加到ORA_DBA组
###### **添加用户到 `ORA_DBA`**
命令提示符(管理员权限)
```cmd
net localgroup ORA_DBA
```
检查输出中是否包含当前用户名
```
别名 ORA_DBA
注释 Oracle 数据库管理员组
成员
-------------------------------------------------------------------------------
54411
Administrator
```
- **如果未列出**:需手动添加用户到 `ORA_DBA` 组(见方法 2)。
- **如果已列出**:继续下一步排查。
手动添加用户到 `ORA_DBA` 组
```cmd
cmd
net localgroup ORA_DBA 54411 /add
```
**重启系统**(或注销并重新登录)使组权限生效。
ALTER SYSTEM SET db_domain='' SCOPE=SPFILE;
ALTER SYSTEM SET service_names='orcl' SCOPE=SPFILE;
ALTER SYSTEM SET local_listener='' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE; #关闭数据库
STARTUP; #启动数据库
ALTER SYSTEM REGISTER; #强制重新注册
数据库参数
SHOW PARAMETER local_listener; -- 应为空(默认动态注册)或指向监听器
SHOW PARAMETER service_names; -- 应包含 "orcl"
SHOW PARAMETER db_domain; -- 检查域名(如存在需拼接)
db_name 和 db_domain 的关系
服务名组成:
若 service_names 未显式设置,Oracle默认使用 DB_NAME.DB_DOMAIN 作为服务名。
若 db_domain 为空,则服务名仅为 DB_NAME。
优先级:
service_names 的显式配置优先级高于默认组合(DB_NAME.DB_DOMAIN)。
| 参数 | 值 | 作用 |
|---|---|---|
local_listener |
LISTENER_ORCL |
数据库尝试向名为 LISTENER_ORCL 的监听器注册(默认监听器通常是 LISTENER)。 |
service_names |
orcl.168.1.48 |
数据库注册的服务名 = service_names + db_domain(即 orcl + 168.1.48)。 |
db_domain |
168.1.48 |
附加到服务名的域名,可能导致客户端解析失败。 |
实例无法启动解决方案
出现的问题
OR

最低0.47元/天 解锁文章
14万+

被折叠的 条评论
为什么被折叠?



