Oracle-CDB容器数据库修改service_names踩坑

前言:

        最近在对一套Oracle容器数据库进行迁移测试时,为了保持新环境与旧环境的服务名一致,需要在新环境添加旧环境的服务名,在CDB的根容器通过service_name参数添加旧环境的服务名之后,发现数据库PDB的服务名全部被注销,pdb容器也无法再正常的切换过去,因此,对容器数据库的服务名设置进行了测试,以下为测试的过程以及结果​

测试环境信息:

        测试环境为12.2版本,数据库唯一名为ora12,一个pdb为pdb12

SQL> show parameter unique
​
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      ora12
​
SQL> show pdbs;
​
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB12                          READ WRITE NO
SQL>

        没有手动设置过的service_names默认的服务名为ora12跟数据库的唯一名一致

SQL> show parameter service_name
​
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      ora12
​
​
select NAME,DISPLAY_VALUE,DEFAULT_VALUE,ISMODIFIED
from v$parameter
where name='service_names'
​
NAME                           DISPLAY_VALUE                  DEFAULT_VALUE                  ISMODIFIED
------------------------------ ------------------------------ ------------------------------ ----------
service_names                  ora12                          NULL                           FALSE

        此时,我们可以看到当前数据库的注册到监听的活跃服务名为cdb容器数据库的的ora12、ora12XDB以及pdb的pdb12服务

--当前我们可以看到注册的服务包括cdb的ora12以及pdb的pdb12
SQL> select con_name,name,network_name from v$active_services where NETWORK_NAME is not null;
​
CON_NAME                       NAME                           NETWORK_NAME
------------------------------ ------------------------------ --------------------------------------------------
CDB$ROOT                       ora12                          ora12
CDB$ROOT                       ora12XDB                       ora12XDB
PDB12                          pdb12                          pdb12
[oracle@rac19a ~]$ lsnrctl  status 
​
Service "ora12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "ora12XDB" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "pdb12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
The command completed successfully

        在容器数据库的根容器下手动设置service_names参数为ora12服务名

SQL> alter system set service_names=ora12 scope=both;
​
System altered.
​
SQL> show parameter service_names
​
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      ORA12
SQL> 
​
SQL> select NAME,DISPLAY_VALUE,DEFAULT_VALUE,ISMODIFIED
  2  from v$parameter
  3  where name='service_names';
​
NAME                           DISPLAY_VALUE                  DEFAULT_VALUE                  ISMODIFIED
------------------------------ ------------------------------ ------------------------------ ----------
service_names                  ORA12                          NULL                           SYSTEM_MOD

        再次查看监听注册的服务,可以发现pdb下的pdb12服务被注销了

SQL> select con_name,name,network_name from v$active_services where NETWORK_NAME is not null;
​
CON_NAME                       NAME                           NETWORK_NAME
------------------------------ ------------------------------ --------------------------------------------------
CDB$ROOT                       ora12                          ora12
CDB$ROOT                       ora12XDB                       ora12XDB
​
[oracle@rac19a ~]$ lsnrctl  status 
​
Service "ora12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "ora12XDB" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
The command completed successfully

        这种情况下,会话手动切换到容器pdb12会出现报错ORA-44787: Service cannot be switched into,因为默认的服务为pdb容器,但由于pdb现在的默认服务pdb12被注销,所以无法正常切换过去

SQL> alter session set container=pdb12;
ERROR:ORA-44787: Service cannot be switched into.

        可以通过指定CDB的根容器服务名切换过去

SQL> alter session set container=pdb12 service=ora12;
​
Session altered.
​
SQL> 
SQL> show con_name
​
CON_NAME
------------------------------
PDB12
SQL>

        那么,由于手动设置了service_names导致被注销的pdb服务名怎么恢复呢?

        可以尝试通过以下四种方法进行恢复

        方法一:通过在cdb根容器里面进行注册,需要将pdb12的服务名写入参数service_names进行服务注册

--在根容器下设置参数service_names,将pdb的服务名pdb12写入
SQL> alter system set service_names=ora12,pdb12 scope=both;
​
System altered.
--手动触发服务注册
​
SQL> alter system register;
​
System altered.
--可以看到pdb服务名重新被注册
​
SQL> select con_name,name,network_name from v$active_services where NETWORK_NAME is not null;
​
CON_NAME                       NAME                           NETWORK_NAME
------------------------------ ------------------------------ --------------------------------------------------
CDB$ROOT                       ora12                          ora12
CDB$ROOT                       ora12XDB                       ora12XDB
PDB12                          pdb12                          pdb12
​
[oracle@rac19a ~]$ lsnrctl  status 
​
Service "ora12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "ora12XDB" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "pdb12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
The command completed successfully

        方法二:通过dbms_service包进行pdb服务名的启动,手动开启指定的pdb服务

        注:dbms_service包是Oracle服务名的管理工具,可以创建,开启,关闭指定的服务名,断开或者终止指定服务名下的连接

--首先通过指定根容器层的服务名进入到指定的pdb容器
SQL> alter session set container=pdb12 service=ora12;
​
Session altered.
​
--在pdb里面开启服务名即可
exec dbms_service.start_service('pdb12');
--可以看到pdb12被重新注册
SQL> set linesize 400
SQL> set pagesize 400
SQL> col name for a30
SQL> col CON_NAME for a30
SQL> col network_name for a50
SQL> select con_name,name,network_name from v$active_services where NETWORK_NAME is not null;
​
CON_NAME                       NAME                           NETWORK_NAME
------------------------------ ------------------------------ --------------------------------------------------
PDB12                          pdb12                          pdb12
​
​
[oracle@rac19a ~]$ lsnrctl  status 
​
Service "ora12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "ora12XDB" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
Service "pdb12" has 1 instance(s).
  Instance "ora121", status READY, has 1 handler(s) for this service...
The command completed successfully

        方法三,通过配置静态监听服务的方式,GLOBAL_DBNAME为pdb服务名,SID_NAME为容器数据库的实例名称,对于RAC集群要在GRID_HOME下的listener.ora配置

        注意:对于通过配置静态监听服务方式连接的,通过服务名可以正常的连接到数据库,但是由于不是动态注册的服务,所以如果不指定根容器的服务名依然无法通过alter session方式切换到pdb容器,还是会出现错误ORA-44787: Service cannot be switched into.

SID_LIST_listener=  
      (SID_LIST=  
        (SID_DESC=  
          (GLOBAL_DBNAME=pdb12)  
          (ORACLE_HOME=/u01/app/oracle/product/12.0.0/dbhome_1)  
          (SID_NAME=ora121)
                )
          )

方法四,通过命令alter system reset service_names scope=both重置回滚service_names参数,重新恢复默认配置,需要注意的是,执行命令reset之后,当前service_names显示的值会变为空并且数据库依然不会注册pdb服务到监听,需要重启pdb或者实例,数据库才会重新注册pdb服务到监听

总结

        通过上述手动设置service_names参数以及恢复方法测试,我们可以发现如果pdb的数量较多,需要同时去配置多个pdb 服务名,服务名的操作管理变得繁琐复杂,并且需要留意的是SERVICE_NAMES这个参数从Oracle 19c开始已经废弃后续版本将不再支持,也就是说Oracle官方对于19c版本后也开始不建议通过service_name去配置服务名

        所以对于后续12c,19c数据库新增服务名的方式特别是容器数据库下,通过设置SERVICE_NAMES参数去新增服务名的方式可能并不是一个最佳的选择

        那么,我们还可以通过选择哪种方式进行服务名的添加呢?

        如果是RAC集群,建议通过srvctl add service 的方式进行添加高可用服务,通过集群的高可用服务可以便捷的管理数据库的服务启动,关闭以及服务模式,实现集群的服务故障转移TAF以及19c的TAC功能,

        注意,无法可以通过srvctl add service方式配置跟pdb容器名称一样的服务名,会出现PRCD-1278 : The service name pdb12 cannot be same as the pluggable database default service name pdb12

--非pdb服务名的添加
srvctl add service -d db -s dbsrv -r db1 -a db2 -failovertype select -failovermethod BASIC -failoverdelay 1 -failoverretry 10
srvctl enable service -d db -s dbsrv 
srvctl start service -d db -s dbsrv 
--pdb服务名的添加
srvctl add service -d ora12 -s pdb12 -pdb pdb12 -r ora121 -a ora122 -failovertype select -failovermethod BASIC -failoverdelay 1 -failoverretry 10
srvctl enable service -d ora12 -s pdb12 
srvctl start service -d ora12 -s pdb12

        如果是单机实例,可以通过dbms_service方式进行添加,service_name表示服务名,network_name表示服务在存储在数据字典里面的网络名称,单个库里面service_name和network_name都是唯一的,不能创建重复的名称

        注意:

        1 非PDB的重启数据库之后,服务不会自己启动,需要手动开启

        2 RAC, Oracle Restart不建议通过dbms_services进行服务管理,在cdb下面测试通过dbms_services发生服务一直无法注册到监听,pdb下面测试可以创建服务成功,所以最好还是通过srvctl进行服务的创建管理

#非pdb方式添加
exec dbms_service.create_service(service_name=>'test',network_name=>'test');
exec dbms_service.start_service('test');
#pdb实例创建
--切换到pdb里面
alter session set container=testpdb;
--创建服务名
exec dbms_service.create_service(service_name=>'testpdb1',network_name=>'testpdb1');
--开启服务名
exec dbms_service.start_service('testpdb1');
alter system register;
--保存当前pdb的状态,这样在下次重启时,服务才能自己启动
alter pluggable database save state;

        最后一种方式就是通过通过配置静态监听服务的方式,GLOBAL_DBNAME为pdb服务名,SID_NAME为容器数据库的实例名称,对于RAC集群要在GRID_HOME下的listener.ora配置

--RAC集群要在GRID_HOME下的listener.ora配置
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))            # line added by Agent
SID_LIST_listener=  
      (SID_LIST=  
        (SID_DESC=  
          (GLOBAL_DBNAME=pdb12)  
          (ORACLE_HOME=/u01/app/oracle/product/12.0.0/dbhome_1)  
          (SID_NAME=ora121)
                )
          )
--启动之后,静态监听的服务名状态为unknown,状态为ready是数据库动态注册的
Service "pdb12" has 2 instance(s).
  Instance "ora121", status UNKNOWN, has 1 handler(s) for this service...
  Instance "ora121", status READY, has 1 handler(s) for this service...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/215134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

今日思考 -- 创新领导力(CIO)读后感

收获3个观点: 1 ,IT DT 商业,才是未来IT人的出路之一 ! 2 ,在CXO中,CIO像CEO一样,具备了整个企业的业务全视角 ,同时也更具解决 ‘’系统性‘’问题的能力 ! 3 &…

go并发编程(中)

目录 一、并发安全性 1.1 变量并发安全性 1.2 容器并发安全性 二、多路复用 三、协程常见的面试题 3.1交替打印奇数偶数 一、并发安全性 1.1 变量并发安全性 这个和C中并发安全是一样的,主要是多个线程对临界资源的同时访问,最经典的就是 n操作…

网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

openmmlab环境搭建及模拟kitti数据集跑pointpillars模型

点云训练—openmmlab环境搭建及模拟kitti数据集跑pointpillars模型 1 环境搭建 在我的 linux 服务器上,基于ubuntu20.04 参见:开始你的第一步 — MMDetection3D 1.3.0 文档 1.1 本地环境已安装anaconda. anaconda的安装参见博文:DS6.1-Y…

Linux 基本语句_14_信号灯实验

原理: Send进程通过建立共享内存区域,并向其中写入数据,Recive通过与共享内存连接读取其中的数据。 但是如果进程进行读取操作的时候其他进程再次写入会产生数据丢失,产生竞态,为了确保在某段时间内只有一个操作&…

Leetcode—1038.从二叉搜索树到更大和树【中等】

2023每日刷题(四十九) Leetcode—1038.从二叉搜索树到更大和树 算法思想 二叉搜索树的中序遍历(左根右)结果是一个单调递增的有序序列,我们反序进行中序遍历(右根左),即可以得到一…

基于Java SSM框架实现母婴儿用品网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现母婴儿用品网站系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品网站,主要的模块包括管理员;主页、个人中心、用户管理、商品分…

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深,对于数据如何作用于经济发展,数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候,把眼镜拿给老板他几分钟就搞定眼镜清洗的,是的没有错,那个机器叫超声波清洗机,不需要自己动手就可把眼镜清洗干净的一款智能清洁工具,它的出现可以说是方便了我…

计算机网络扫盲(4)——时延

一、概述 在这里,我们考虑分组交换网的情况,因特网可以被看成是一种基础设施,该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下,我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

软信天成:数据泄露日趋严重 “资产”保护何去何从

随着数据应用的逐渐深入,越来越多的企业意识到:数据作为信息的载体,可以成为企业知识产权、收益流和具备竞争优势的基础资产。然而,当包含大量敏感信息的数据被视作资产时,亦将直面信息被“窃取”、“泄露”和“滥用”…

CrapApi部署手册( maven+tomcat+idea)

目录 一、本章节所用到的资源共享,嫌麻烦的可以直接下载本地配置好运行使用二、idea maven tomcat启动,我的maven和tomcat的配置三、遇到的问题四、项目运行后效果图转载请标明出处,写作不易如果有用请给个赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代,数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而,在数据流通的过程中,我们经常会遇到各种难题和挑战,尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

基于Java SSM框架实现人才小区公寓社区物业管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人才小区公寓社区物业管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人才公寓管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xff…

MySQL练习题,学生成绩查询练习题,附带答案

题目 (一) 新建以下几个表 student(学生表): snosnamesexdeptbirthagePhone 其中约束如下: (1) 学号不能存在相同的 sno int auto_increment primary key (2) 名字为非空 sname varchar(20) not nu…

Excel如何设置在未打印时显示虚线打印时不显示虚线

记得之前分享过一个BOM表模板,但是在我打印时,发现明明是留空白的地方却打印出来的虚线 后来,看了自己的页面布局,原来是网格线设置错误了 当我设置为查看时显示网格线,打印时不显示网格线,这样就正常了

二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

一、目的 在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后,发现HDFS文件中没问题,但是ODS层表中字段的数据却有问题,字段中的JSON数据不全 二、Hive处理JSON数据方式 (一)将Flume采集Kafka的JSON数据…

maven篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、什么是Maven的坐标?二、讲一下maven的生命周期三、说说你熟悉哪些maven命令?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的…

C# OpenVINO 模型信息查看工具

目录 效果 支持模型 项目 代码 下载 C# OpenVINO 模型信息查看工具 效果 支持模型 ONNX format (*.onnx) PDPD (*.pdmodel) TF (*.pb) TFLite (*.tflite) 项目 代码 using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Text; using…