签到成功

知道了

CNDBA社区CNDBA社区

Oracle 19c 中管理 PDB service

2025-07-01 16:57 18 0 原创 Oracle 19c
作者: dave

1 service 说明

在11g中,service_names 是一个非常重要的参数,用来指定通过监听连接的数据库实例。 改参数默认值是DB_UNIQUE_NAME.DB_DOMAIN,在没有指定DB_DOMAIN的情况下,默认就等于DB_UNIQUE_NAME。http://www.cndba.cn/cndba/dave/article/131670http://www.cndba.cn/cndba/dave/article/131670

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

http://www.cndba.cn/cndba/dave/article/131670

因为该参数有默认值,监听在没有配置静态注册的情况,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的错误:http://www.cndba.cn/cndba/dave/article/131670

http://www.cndba.cn/cndba/dave/article/131670

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/131669

http://www.cndba.cn/cndba/dave/article/131670

The 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.http://www.cndba.cn/cndba/dave/article/131670

2 19c 中管理service

如果是RAC 集群,可以直接通过SRVCTL 来管理服务,这个和11g的没有区别,我们这里看下19c 单实例环境如何通过DBMS_SERVICE 包来管理service name。

http://www.cndba.cn/cndba/dave/article/131670

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:

http://www.cndba.cn/cndba/dave/article/131670

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

http://www.cndba.cn/cndba/dave/article/131670

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2279
    原创
  • 3
    翻译
  • 579
    转载
  • 196
    评论
  • 访问:8159917次
  • 积分:4413
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ