Oracle19C如何为PDB新建service

 

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模式。

15:57:57 SYS@oemdb(9)> show pdbs

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

15:58:00 SYS@oemdb(9)> select con_name,name,network_name from v$active_services where con_name='EMPDBREPOS';

CON_NAME                                           NAME                      NETWORK_NAME
-------------------------------------------------- ------------------------- --------------------------------------------------
EMPDBREPOS                                         empdbrepos                empdbrepos

Elapsed: 00:00:00.00
15:58:03 SYS@oemdb(9)> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------------------------------------------------------------------------------------------
service_names                        string      oemdb
15:58:09 SYS@oemdb(9)> alter system set service_names='oemdb' sid='*';

System altered.

Elapsed: 00:00:00.06
15:58:13 SYS@oemdb(9)> !lsnrctl stat | grep empdbrepos

15:58:20 SYS@oemdb(9)> select con_name,name,network_name from v$active_services where con_name='EMPDBREPOS';

no rows selected

Elapsed: 00:00:00.00

 

此时无法切换到pdb下:

15:50:36 SYS@oemdb(9)> alter session set container=empdbrepos;
ERROR:
ORA-44787: Service cannot be switched into.


Elapsed: 00:00:00.00

 

需要添加service子句:

16:01:13 SYS@oemdb(9)> alter session set container=empdbrepos service=oemdb;

Session altered.

Elapsed: 00:00:00.00
16:01:25 SYS@oemdb(9)> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 EMPDBREPOS                     READ WRITE NO

重新启动默认属于pdb的empdbrepos:
16:01:30 SYS@oemdb(9)> select con_name,name,network_name from v$active_services where con_name='EMPDBREPOS';

no rows selected

Elapsed: 00:00:00.01
16:02:25 SYS@oemdb(9)> exec dbms_service.start_service('empdbrepos');

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
16:03:15 SYS@oemdb(9)> select con_name,name,network_name from v$active_services where con_name='EMPDBREPOS';

CON_NAME                                           NAME                      NETWORK_NAME
-------------------------------------------------- ------------------------- --------------------------------------------------
EMPDBREPOS                                         empdbrepos                empdbrepos

Elapsed: 00:00:00.00

 

 

 

 

而在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软件,这块我不太了解,知道有这么个东西就行。

 

posted @ 2023-06-21 15:35  PiscesCanon  阅读(1251)  评论(0编辑  收藏  举报