首页 > 数据库 >Oracle:谈谈service_names和dbms_service的一点问题

Oracle:谈谈service_names和dbms_service的一点问题

时间:2024-05-14 11:10:42浏览次数:26  
标签:zkm dbms testsrv name service SYS names services

 

Oracle:谈谈service_names和dbms_service的一点问题

 

services_name在在19C中官方明确提到已经弃用了,只保留兼容,且在未来版本中可能不再支持该初始化参数。传送门

其次,无论是在12C或者11G,官方都表明了Oracle RAC或者Oracle Restart环境下,不通过直接修改services_name参数,而除此之外的单点环境就可以直接修改。

详情可以看:11G 、 12C 、 12C services_name

PS:可惜官档11G我没搜到参数的说明

然而我发现即便是在除了上述说的两个环境下,直接修改services_name也存在一些问题。

以11G为例子,做个测试。

通过直接修改services_name参数添加testsrv服务。

09:32:28 SYS@zkm(235)> show parameter service

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- --------------------
service_names                        string                            pri_zkm, zkm
09:32:28 SYS@zkm(235)> select name from dba_services where name not in ('pri_zkm','zkm');  --排除上边两个,减少篇幅

NAME
-------------------------
SYS$BACKGROUND
SYS$USERS
zkmXDB

09:32:42 SYS@zkm(235)> alter system set service_names='zkm','pri_zkm','testsrv' sid='*' scope=both;

System altered.

09:33:12 SYS@zkm(235)> select name from dba_services where name not in ('SYS$USERS','SYS$BACKGROUND','zkmXDB','pri_zkm','zkm');

NAME
-------------------------
testsrv

 

 

到这里都没毛病,但是如果此时想取消删除testsrv服务的话,存在一点小问题。

依旧是通过直接修改services_name参数,但是修改之后的dba_services和v$services还是存在该服务,即便是重启dba_services依然留有testsrv记录,篇幅问题重启步骤略。

09:35:42 SYS@zkm(235)> alter system set service_names='zkm','pri_zkm' sid='*' scope=both;

System altered.

09:35:50 SYS@zkm(235)> select name from dba_services where name not in ('SYS$USERS','SYS$BACKGROUND','zkmXDB','pri_zkm','zkm');

NAME
-------------------------
testsrv

09:36:08 SYS@zkm(235)> select name from v$services where name not in ('SYS$USERS','SYS$BACKGROUND','zkmXDB','pri_zkm','zkm');

NAME
-------------------------
testsrv

09:36:14 SYS@zkm(235)> select name from v$active_services where name not in ('SYS$USERS','SYS$BACKGROUND','zkmXDB','pri_zkm','zkm');

no rows selected

 

 

为此我做了10046跟踪了下,发现修改services_name的时候,

如果是在services_name上追加新的服务名,则10046的trc文件中会有对表service$进行insert和update操作。

10046过程略,这里可以看看trc文件中的dml操作。

[oracle@oracle1 zkm]$ grep -E "insert|update|delete" zkm_ora_112482.trc
insert /*+ RULE */ into service$ (service_id, name, name_hash, network_name, creation_date, deletion_date, flags) values (:1, :2, :3, :4, sysdate, null, :5)
update /*+ RULE */ service$ set creation_date_hash = ora_hash(creation_date) where service_id = :1
insert into WRI$_ALERT_THRESHOLD_LOG (sequence_id, object_type, object_name, object_id, opcode) values (:1, :2, :3, :4, :5)

 

如果是在services_name上删减服务名,则并不会删除或修改表service$的条目。

而当你查询dba_services这个视图的时候,实际就是查询基表services$的数据(where DELETION_DATE is null)。

因此,即便是重启数据库,你依然能够发现能够查询到testsrv服务,

但是我们本意是从数据库中永久取消并删除testsrv服务名条目!

所以会显得有点奇怪。

PS:上诉还出现了视图v$services以及v$active_services,文档 ID 1496074.1提到了两者区别

DBA_SERVICES - 该视图列出了数据库中的所有服务。这包括启动和停止的服务。

V$SERVICES - 此视图仅列出自实例启动以来一段时间启动的服务。当您停止正在运行的服务时,该服务仍将在此视图中列出,直到下一个实例重新启动。

至于v$active_services则显示了当前正在活动的服务。

 

至于如何清除dba_services中testsrv的条目,可以通过dbms_service包来实现:

10:28:12 SYS@zkm(235)> exec dbms_service.delete_service('testsrv');

PL/SQL procedure successfully completed.

10:29:24 SYS@zkm(235)> select name from dba_services where name='testsrv';              

no rows selected

 

 

对于服务名的添加修改操作,可以通过dbms_service来实现,可以通过dbms_service来避免上述问题。

但实际上对于dbms_service本身也有自己的问题,使用dbms_service.create_service添加新服务名并dbms_service.start_service的时候,只在memory层修改了services_name导致重启数据库新的服务名并不会随之启动。。。

需要每次启动数据库的时候手工启动,感觉有点蠢。

09:27:48 SYS@zkm(235)> show parameter service

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ----------------------------------------------------------------------------------------------------
service_names                        string                            pri_zkm, zkm
09:27:51 SYS@zkm(235)> exec dbms_service.create_service('testsrv','testsrv');

PL/SQL procedure successfully completed.

09:28:29 SYS@zkm(235)> exec dbms_service.start_service('testsrv');

PL/SQL procedure successfully completed.

此时警告日志:
ALTER SYSTEM SET service_names='pri_zkm','zkm','testsrv' SCOPE=MEMORY SID='zkm';

09:28:35 SYS@zkm(235)> show parameter service

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ----------------------------
service_names                        string                            pri_zkm, zkm, testsrv
09:28:52 SYS@zkm(235)> select name from dba_services where name not in ('SYS$BACKGROUND','SYS$USERS','zkmXDB','zkm','pri_zkm');

NAME
-------------------------
testsrv
重启失效,略。

 

 

如果是在12c以上的pdb环境中,还能保存pdb状态实现重启pdb带上service启动。

11g想要启动数据库的时候启动服务名,要么在services_name参数追加服务名(有点蠢,我一开始直接修改services_name不就好了),要么就是通过创建触发器(增加了些许复杂度和管理成本,比如迁移要考虑这类对象,比如删除testsrv服务要同步记得先删除触发器)。

触发器模板:

create or replace trigger startsrv
  after startup on database
begin
  dbms_service.start_service('testsrv');
end startsrv;
/

 

PS:再次强调啊,本文讨论的是在非Oracle RAC和非Oracle Restart环境下。

 

标签:zkm,dbms,testsrv,name,service,SYS,names,services
From: https://www.cnblogs.com/PiscesCanon/p/18190895

相关文章

  • 【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux
    问题描述PythonFlash应用上云,本地Git部署(https://docs.azure.cn/zh-cn/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Clocal-git-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli),遇见两类问题。1: srcrefspec......
  • oracle 性能优化查看(DBMS_SQLTUNE.REPORT_SQL_MONITOR)
    参照查看:Oracle调优之看懂Oracle执行计划-smileNicky-博客园(cnblogs.com) 临时查看监控需添加 /*+MONITOR*/注意空格,不然监控不了select/*+MONITOR*/temp2.*from(selectrownumasrn,temp1.*from(selectBATCH_ID,PARENT_BATCH_ID......
  • cilium Service Mesh
    ServiceMesh介绍ServiceMesh关注于集群内部的微服务通信、控制和监控。它提供诸如负载均衡、故障恢复、安全性增强、监控和跟踪等功能。ServiceMesh可以帮助管理复杂的微服务架构,实现服务之间的可靠通信,并提供各种附加功能来增强系统的可观测性和安全性。随着分布式应用程......
  • ROS服务通讯创建服务节点(service)与客户端节点(client)
    学习参考:ROS/Tutorials/WritingServiceClient(python)-ROSWiki  首先需要一个工作空间,进入工作空间下的src文件夹下再创建一个功能包,进入功能包后创建scripts放置.py源码文件  服务节点源码创建格式:老样子还是剖析源码 首先导入包这里的_future_包中的print_func......
  • dremio CatalogMaintenanceService 服务简单说明
    说明此服务是从25.0开始包含的,同时在releasenote中也有说明,以下主要说明下内部实现release信息如下,具体就不翻译了,主要是添加了一个每个任务进行每个view最大保留50个历史信息Addeddailycatalogmaintenancetaskstotrimhistoryofviewstoamaximumof50......
  • 博客园商业化之路:融资做与众不同的众包平台,让开发能力成为一种服务(Coding as a Servi
    园子的诞生,与商业无关,是一位编程爱好者业余时间的偶然。园子的坚持,也与商业无关,是来自服务于成千上万开发者的成就感。当十多年前业余时间无法支撑园子的进一步发展时,初生牛犊不怕虎地毅然辞职从江苏扬州来到上海开始为园子的发展而创业,当时心里知道,只有商业化,才有未来。但那时......
  • dremio UserService 简单说明
    以前是简单说明过dremio的UserService,dremio实际上支持内部以及外部用户的玩法类图可以看到,包含了simple以及executor两个,同时实现了UserServiceEvents支持发布订阅能力的接口(订阅是25.0版本的)executor的实现实际上是为空的,核心是方便执行节点bindUserService,实际内......
  • ORA-04063: Package Body “SYS.DBMS_CUBE_EXP” While Expdp
    1.场景数据库版本:11.2.0.4当执行@?/rdbms/admin/awrextr.sql进行awr性能分析数据导出时,报错:ORA-20115:datapumpexportencounterederror:ORA-39127:unexpectederrorfromcalltoexport_string:=SYS.DBMS_CUBE_EXP.INSTANCE_EXTENDED_INFO_EXP('AW$EXPRESS','SYS',......
  • android Service和activity通信
     在Android中,Service和Activity可以通过多种方式进行通信。以下是一个简单的例子,展示了如何使用Intent、Binder和Interface来实现Service和Activity之间的通信。首先,定义一个Service并创建一个绑定器类(Binder): publicclassMyServiceextendsService{privatefinal......
  • Field registration in org.springframework.cloud.client.serviceregistry.ServiceRe
    Fieldregistrationinorg.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration$ServiceRegistryEndpointConfigurationrequiredasinglebean,but2werefound: -nacosRegistration:definedbymethod'nacosRegistration'in......