我正在尝试更改 Windows 2003 服务器上安装的 Oracle 11.2.0.3 的服务名称。
在安装期间,服务名称是使用默认域定义的,但我们想摆脱它。
到目前为止我所做的(以及之前所做的)将服务名称更改mydb.foo.bar
为mydb
:
alter system set service_names = 'mydb' scope = both;
alter database rename global_name to mydb;
这似乎奏效了:
SQL> 显示参数名称 名称类型值 ------------------------------------ ----------- --- -------------------------- db_name 字符串 mydb db_unique_name 字符串 mydb global_names 布尔值 FALSE instance_name 字符串 mydb service_names 字符串 mydb SQL>
(我从上述输出中删除了一些不相关的属性)
然后用于alter system register
向监听器重新注册。
这没有任何效果,所以我重新启动了数据库和监听器,仍然没有运气。
目前的情况如下:
select name from v$active_services
返回:
SERVICE_ID | 姓名 | 网络名字 -----------+-----------------+-------- 1 | 系统$背景 | 2 | SYS$用户 | 3 | 数据库 | 数据库 5 | mydbXDB | mydbXDB 6 | mydb.foo.bar | mydb.foo.bar
所以由于某种原因,旧的服务名称仍然存在并正在运行。
尝试使用停止服务时
SQL> exec dbms_service.stop_service('mydb.foo.bar'); PL/SQL 过程成功完成。
没有报错,但是在尝试删除服务时,Oracle 不让我:
SQL> exec dbms_service.delete_service('mydb.foo.bar'); 开始 dbms_service.delete_service('mydb.foo.bar'); 结尾; * 第 1 行的错误: ORA-44305: 服务 mydb.foo.bar 正在运行 ORA-06512: 在“SYS.DBMS_SYS_ERROR”,第 86 行 ORA-06512:在“SYS.DBMS_SERVICE”,第 454 行 ORA-06512:在“SYS.DBMS_SERVICE”,第 343 行 ORA-06512: 在第 1 行
我确认我没有使用该服务的打开连接:
select count(*)
FROM v$session
where service_name = 'mydb.foo.bar';
返回0
(零)
我还使用 oradim 重新创建了 Windows 服务,但无济于事。
有一次我跑了
alter system set service_names = 'mydb,mydb.foo.bar' scope = both;
这可能是我现在拥有两者的原因吗?
但是在将 service_names 更改为只有一个名称之后,第二个应该已经消失了,不是吗?
如果我不能让第二个服务消失,那么使用短服务名称而不是长服务名称使实例向侦听器注册就足够了。
我确定我错过了一些非常明显的东西,但我无法弄清楚它是什么。
是的,这是非常明显的……
该参数
DB_DOMAIN
仍然包含foo.bar
,因此该实例使用mydb.foo.bar
.做了一个之后
并弹回数据库现在一切都按预期工作。