Oracle19C如何为PDB新建service

发布时间 2023-06-21 15:41:52作者: PiscesCanon

 

Oracle19C如何为PDB新建service

 

在11g版本中,通常可以通过4种方式来新增service:

  1. 通过修改service_names参数来新增,这个是比较常用的
  2. 通过srvctl add service(只适用于RAC或Oracle Restart)
  3. 通过配置$ORACLE_HOME/network/admin/listener.ora静态监听
  4. 通过dbms_service

 

关于19C下的service_names

其中service_names(传送门)官方表明在19c中已经弃用了(保持兼容),并且再未来版本可能不在支持,不建议再使用。

在CDB/PDB模式中,默认的service_names值为CDB的名称,数据库实例会自动向监听注册CDB以及包括所有PDB的services。

但是如果在CDB下直接修改service_names为其他不包含PDB名称的字符串组,会导致所有其他PDB对应的默认services失效。

因此在19C下不要再使用service_names,即便是在非CDB/PDB模式。

14:45:59 SYS@oemdb(9)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 EMPDBREPOS                     READ WRITE NO
14:46:02 SYS@oemdb(9)> !lsnrctl stat | grep empdbrepos
Service "empdbrepos" has 1 instance(s).

14:46:10 SYS@oemdb(9)> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------------------------------------------------------------------------------------------
service_names                        string      oemdb
14:46:18 SYS@oemdb(9)> alter system set service_names='oemdb' sid='*';

System altered.

Elapsed: 00:00:00.01
14:46:22 SYS@oemdb(9)> !lsnrctl stat | grep empdbrepos
--没有了
14:46:27 SYS@oemdb(9)> 

 

而在PDB中无法设置防偷防爬

14:29:34 SYS@oemdb(9)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 EMPDBREPOS                     READ WRITE NO
14:29:35 SYS@oemdb(9)> alter system set service_names='empdbrepos' sid='*';
alter system set service_names='empdbrepos' sid='*'
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database


Elapsed: 00:00:00.05

 

 

 

至于srvctl需要RAC或者Oracle Restart下才能使用,这里给个语法样例:

srvctl add service -d oemdb -s empdbrepos_newsrv -pdb empdbrepos -r rac_node1 -a rac_node2

 

而静态监听使用场景比较少,这里都不去详细说了。

 

那么如何在19c下为PDB添加service呢?

根据service_names官网说明或者How to create new PDB service. (文档 ID 2649378.1),使用如下方式:

alter session set container=empdbrepos;

##其中empdbrepos_newsrv相当于service_names下设置的service
exec dbms_service.create_service('empdbrepos_srv1','empdbrepos_newsrv');   --或者 exec dbms_service.create_service(service_name=>'empdbrepos_srv1',network_name=>'empdbrepos_newsrv');
exec dbms_service.start_service('empdbrepos_srv1');
##向监听注册所有pdb的services
alter system register;

15:17:10 SYS@oemdb(9)> !lsnrctl status | grep empdbrepos_newsrv
Service "empdbrepos_newsrv" has 1 instance(s).

##保存PDB打开的状态,否则PDB重启需要手工启动新的service
alter pluggable database save state;


其他停止并删除:
exec dbms_service.stop_service('empdbrepos_srv1');
exec dbms_service.delete_service('empdbrepos_srv1');

更多详情desc dbms_service

 

 

 

此时通过cdb_services或者dba_services查看pdb的service信息。

15:24:35 SYS@oemdb(9)> col network_name for a50
15:24:36 SYS@oemdb(9)> col pdb for a15
15:24:44 SYS@oemdb(9)> select name,network_name,pdb from cdb_services where pdb='EMPDBREPOS';

NAME                      NETWORK_NAME                                       PDB
------------------------- -------------------------------------------------- ---------------
EMPDBREPOS                EMPDBREPOS                                         EMPDBREPOS
empdbrepos_srv1           empdbrepos_newsrv                                  EMPDBREPOS

Elapsed: 00:00:00.01

 

 

另外,也可以通过gds(Global Service Manager)的gdsctl命令来管理services,不过需要单独安装GSM软件,这块我不太了解,知道有这么个东西就行。