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模式。
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软件,这块我不太了解,知道有这么个东西就行。
标签:Oracle19C,service,SYS,names,oemdb,PDB,empdbrepos From: https://www.cnblogs.com/PiscesCanon/p/17496366.html