1 service 说明
在11g中,service_names 是一个非常重要的参数,用来指定通过监听连接的数据库实例。 改参数默认值是DB_UNIQUE_NAME.DB_DOMAIN,在没有指定DB_DOMAIN的情况下,默认就等于DB_UNIQUE_NAME。
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
service_names string cdb19c
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_unique_name string cdb19c
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_domain string
19c 官网对该参数的说明:
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/SERVICE_NAMES.html
因为该参数有默认值,监听在没有配置静态注册的情况,Listener Registration (LREG) 进程会自动进行动态注册(只能注册1521 端口),将service names 的信息注册到listener中,当客户端连接service name时,监听再根据对应的service 转发到对应的实例上。 只不过一般实例名和service name 是一样的,所以很多人忽略这个问题。实际上,是可以对同一个实例配置多个不同的service name的。 并且新添加的service name并不会覆盖默认的参数值,新加的名称和默认都可以连接到实例。
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
service_names string cdb19c
SQL> select con_name,name,network_name from v$active_services;
CON_NAME NAME NETWORK_NAME
------------------------- -------------------- -------------------------
CDB$ROOT cdb19cXDB cdb19cXDB
DAVE dave dave
CDB$ROOT SYS$BACKGROUND
CDB$ROOT SYS$USERS
CDB$ROOT cdb19c cdb19c
写本篇博客的目的,主要是在19c 中已经废弃该参数了,后续可能不在支持该参数了,所以不建议在使用改参数,如果想添加service name,可以通过SRVCTL ,GDSCTL 或者DBMS_SERVICE PL/SQL 包。 19c中修改service name可能会遇到ORA-44787的错误:
SQL> alter session set container=dave;
ERROR:
ORA-44787: Service cannot be switched into.
Oracle 19c 切换 PDB ORA-44787 错误解决方法
https://www.cndba.cn/dave/article/131669The SERVICE_NAMES initialization parameter is deprecated in Oracle Database 19c and may be desupported in a future release.
Use of the SERVICE_NAMES parameter is no longer actively supported. It must not be used for high availability (HA) deployments and it is not supported for HA operations. This restriction includes FAN, load balancing, FAILOVER_TYPE, FAILOVER_RESTORE, SESSION_STATE_CONSISTENCY, and any other uses.
To manage your services, Oracle recommends that you instead use the SRVCTL command-line utility, the GDSCTL command-line utility, or the DBMS_SERVICE PL/SQL package.
2 19c 中管理service
如果是RAC 集群,可以直接通过SRVCTL 来管理服务,这个和11g的没有区别,我们这里看下19c 单实例环境如何通过DBMS_SERVICE 包来管理service name。
How to create new PDB service. (Doc ID 2649378.1)
NON-CDB to CDB Migration – Service ID Issue (Doc ID 2732537.1)
2.1 切换到pdb
SQL> alter session set container=dave;
Session altered.
2.2 创建pdb service
这里可以先查看一下当前存在的service:
SQL> col pdb for a15
SQL> select name,network_name,pdb,enabled from dba_services;
NAME NETWORK_NAME PDB ENABLE
-------------------- ------------------------- --------------- ------
orclXDB orclXDB DAVE NO
dave dave DAVE NO
SQL> select name,con_name from v$active_services;
no rows selected
否则创建会报如下错误:
SQL> exec dbms_service.create_service('dave','dave_new');
BEGIN dbms_service.create_service('dave','dave_new'); END;
*
ERROR at line 1:
ORA-44303: service name exists
ORA-06512: at "SYS.DBMS_SERVICE_ERR", line 21
ORA-06512: at "SYS.DBMS_SERVICE", line 316
ORA-06512: at line 1
创建pdb service:
SQL> exec dbms_service.create_service('dave1','dave_new1');
PL/SQL procedure successfully completed.
SQL> exec dbms_service.create_service(service_name=>'dave2',network_name=>'dave_new2');
PL/SQL procedure successfully completed.
注意:
这里的dave_new1和dave_new2相当于service_names下设置的service,dave1和dave2 只是服务名,当然这里也可以配置成一样的,这里是演示一下区别。
SQL> select name,network_name,pdb,enabled from dba_services;
NAME NETWORK_NAME PDB ENABLE
-------------------- ------------------------- --------------- ------
dave1 dave_new1 DAVE NO
dave2 dave_new2 DAVE NO
orclXDB orclXDB DAVE NO
dave dave DAVE NO
2.3 启动service
SQL> select name,con_name from v$active_services;
no rows selected
SQL> exec dbms_service.start_service('dave');
PL/SQL procedure successfully completed.
SQL> exec dbms_service.start_service('dave1');
PL/SQL procedure successfully completed.
SQL> exec dbms_service.start_service('dave2');
PL/SQL procedure successfully completed.
SQL> select name,con_name from v$active_services;
NAME CON_NAME
-------------------- -------------------------
dave2 DAVE
dave DAVE
dave1 DAVE
2.4 向监听注册所有pdb的services
SQL> alter system register;
System altered.
2.5 验证
[dave@cndba.cn admin]$ cat tnsnames.ora
DAVE1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora11g)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dave1)
)
)
[dave@cndba.cn admin]$ tnsping dave1
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 01-JUL-2025 16:27:58
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/u02/app/oracle/product/19.0.0/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ora11g)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = dave1)))
OK (0 msec)
[dave@cndba.cn admin]$ sqlplus cndba/cndba@dave1
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 1 16:28:00 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-28002: the password will expire within 6 days
Last Successful login time: Tue Jul 01 2025 16:27:10 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
这里如果遇到静态注册的问题,参考如下博客:
Oracle 19c 连接PDB ORA-01034 错误说明
https://www.cndba.cn/dave/article/131665
2.6 保存PDB状态
保存PDB打开的状态,否则PDB重启需要手工启动新的service
SQL> alter pluggable database save state;
Pluggable database altered.
2.7 停止service
SQL> exec dbms_service.stop_service('dave2');
PL/SQL procedure successfully completed.
SQL> select name,con_name from v$active_services;
NAME CON_NAME
-------------------- -------------------------
dave DAVE
dave1 DAVE
2.8 删除service
SQL> exec dbms_service.delete_service('dave2');
PL/SQL procedure successfully completed.
SQL> select name,network_name,pdb,enabled from dba_services;
NAME NETWORK_NAME PDB ENABLE
-------------------- ------------------------- --------------- ------
dave1 dave_new1 DAVE NO
orclXDB orclXDB DAVE NO
dave dave DAVE NO
版权声明:本文为博主原创文章,未经博主允许不得转载。