Oracle19C如何为PDB新建service
Oracle19C如何为PDB新建service
在11g版本中,通常可以通过4种方式来新增service:
- 通过修改service_names参数来新增,这个是比较常用的
- 通过srvctl add service(只适用于RAC或Oracle Restart)
- 通过配置$ORACLE_HOME/network/admin/listener.ora静态监听
- 通过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软件,这块我不太了解,知道有这么个东西就行。