UDN-企业互联网技术人气社区

板块导航

浏览  : 1939
回复  : 0

[运维] 浅谈Oracle Service与运维误区

[复制链接]
呵呵燕的头像 楼主
发表于 2016-9-18 09:14:53 | 显示全部楼层 |阅读模式
  一、初识service

  通常我们在创建好一个数据库后会向用户提供与应的tns连接串,形如

  1.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.1)(PORT=1521))(CONNECT_DATA=(SID=mydb))) 或是(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.1)(PORT=1521))(CONNECT_DATA=(service_name=mydb)))
复制代码


  比较以上两个tns 连接串,不难发现他们之间的差别就是CONNECT_DATA值 一个是 sid ,一个是service_name,这两者间有什么差异呢?

  从数据库管理的角度看,service就是数据库的一个别名或代号,下图数据库mydb的service名分别为book.example.com,soft.example.com; 从用户的角度看service是数据库的一个逻辑表现,这种表现可以理解为一个接口,即客户端声明要连接到哪里。数据库在创建好后,默认会在数据库中创建一个service ,其名称与db_unique_name 相同,当然我们也可以手动创建额外的service。Oracle instance启动时,会将自己的一个或多个service注册到监听,当一个客户端发送连接请求到监听时,监听相当于一个中介或者路由,将该会话连接到与之请求声明所匹配的service上。

2.webp.jpg


  二、使用service的优势

  一个service 可标识多个数据库实例(如RAC环境),一个实例也可以属于多个service,这时监听扮演的角色就是相当于分发路由的作用,把连接请求映射到相应的service,这样使不同的连接在数据库中处于多个不相交的工作组,这使得service在无形中具有了以下功能:

  隔离业务,不同的应用使用不同的service来连接,甚至是同一个DB用户也能够使用不同的service连接,例如联机事物和批处理操作,这样可以从service这个维度区别各自的负载消耗;

  便于性能分析,awr记录了service的性能数据,包含执行时间,cpu使用情况,等待类型,资源消耗等,更加有利于数据库的性能问题诊断;

1.webp.jpg


  3. 基于service可以实现使用resource manager的资源隔离;

  4. 在RAC环境下,可以用service绑定dbms_scheduler运行的节点;

  5. 对应用透明,在Oracle 11g 及其以上版本中,使用service连接可以在主库与ADG(active dataguard)库之间实现透明故障切换(TAF)。

  因此,我们要尽量使用service来连接数据库,而非之前的instance_name或者sid。

  三、Service的日常维护与管理

  service 的管理工具有两种:

  一是使用srvctl 工具;

  二是在没有srvctl 工具的情况下(即非GI管理)使用dbms_service 包来管理。

  使用srvctl 工具:

  
  1. srvctl add service -d -s {-r"" [-a ""] [-P{BASIC | NONE | PRECONNECT}]
复制代码


  1)添加,启动

  > srvctl add service -d mydb -s srv_mydb --添加

  > srvctl start service -d mydb -s srv_mydb --启动

  > srvctl status service -d mydb --查看状态

  Service mydb is running on instance(s) t0mydb

  2)停止,删除

  一个正运行的service是不能够删除的,必须要stop 后才可以删除否则会报错:

  
  1. >srvctl remove service -d mydb -s srv_mydb
复制代码


  PRCR-1025 : Resource ora.t0mydb.mydb.svc isstill running

 
  1.  >srvctl stop service -d mydb -s srv_mydb

  2.   >srvctl remove service -d mydb -s srv_mydb
复制代码


  注意:

  若想要真正从数据库里面删除该service信息,还需要通过调用dbms_service包来删。

  3)改变属性

 
  1.  >srvctl modify service -d mydb -s srv_mydb -l primary -e SELECT -m BASIC
复制代码


  2.使用dbms_service 包来管理

 
  1.  SQL> execute dbms_service.create_service(service_name=> 'mydb',network_name => 'ora11g');

  2.   PL/SQL procedure successfully completed
复制代码


  1)启动service

 
  1.  SQL>exec dbms_service.START_SERVICE('mydb')

  2.   SQL>show parameter service;
复制代码


  NAME TYPE VALUE

  ----------------------------------------------- ------------------------------

  service_names string ora11

  2)停止删除

  同样在运行的状态下册service是不行的

 
  1.  SQL> exec dbms_service.delete_service(service_name=> 'mydb');
复制代码


  BEGIN dbms_service.delete_service(service_name=> 'mydb'); END;

  *

  ERROR at line 1:

  1.   ORA-44305: service mydb is running

  2.   SQL> exec dbms_service.stop_service('mydb');

  3.   PL/SQL procedure successfully completed

  4.   SQL> exec dbms_service.delete_service(service_name => 'mydb');

  5.   PL/SQL procedure successfully completed.

  6.   SQL>
复制代码


  3.改变service属性

  1.   SQL> execute dbms_service.modify_service(service_name=> 'mydb'

  2.   ,goal=> dbms_service.goal_throughput

  3.   ,failover_method=> dbms_service.failover_method_basic

  4.   ,failover_type=> dbms_service.failover_type_select

  5.   ,failover_retries=> 10

  6.   ,failover_delay=> 1

  7.   ,clb_goal=> dbms_service.clb_goal_long);
复制代码


  4.相应的管理视图:

  DBA_SERVICES ---查看所有的service

  ALL_SERVICES or V$SERVICES

  V$ACTIVE_SERVICES --查看正在运行的service

  V$SERVICE_STATS

  V$SERVICE_EVENT

  V$SERVICE_WAIT_CLASSES

  V$SERV_MOD_ACT_STATS

  V$SERVICE_METRICS

  V$SERVICE_METRICS_HISTORY

  四、Service使用中的常见小误区:

  误区1:

  在两节点的RAC中需要维护其中的1台主机,这台主机上run运行着有相应的serivce ,使用以下命令停止service ,是不能自动failover 到另一个节点的。

 
  1.  >srvctl stop service -d t0mydb–s srv_mydb
复制代码


  【原因】

  在GI的管理下service 是一种资源,使用以上命令GI视为是正常的维护操作,不会relocate 到另一个节点,只有在非正常停止实例,或是意外中断时才会切换到另一节点,比如在数据库下sqlplus 下使用 shutdown immediate命令。

  【处理办法】

  1)使用srvctl relocate service

 
  1.  srvctl relocate service -d -s {-i -t | -c -n } [-f]

  2.   eg:srvctlrelocate service -d mydb-s srv_mydb -i node1 -t node2
复制代码


  2)停止servcie 时带上 -f 参数选项

 
  1.  eg: srvctl stop service -d mydb-s srv_mydb -f
复制代码

  3)关闭数据库实例时带上-f参数

 
  1.  eg:srvctl stop database -d mydb -i srv_mydb -f
复制代码

  误区2、

  当我们重启RAC数据库时,数据库的service不会在preferred instance上启动。

  【原因】

  在非基于策略管理的数据库,默认情况下service是自动启动的,因此在数据库启动的时候,service会在(preferred or available实例中)最先启动的实例上启动,而不是在perferred实例上启动。

 
  1.  > srvctl config service -d mydb -s srv_mydb

  2.   Service name: srv_mydb

  3.   Service is enabled

  4.   Server pool: srv_mydb

  5.   Cardinality: 1

  6.   Disconnect: false

  7.   Service role: PRIMARY

  8.   Managementpolicy: AUTOMATIC

  9.   DTP transaction: false

  10.   AQ HA notifications: false

  11.   Failover type: SELECT

  12.   Failover method: BASIC

  13.   TAF failover retries: 200

  14.   TAF failover delay: 10

  15.   Connection Load Balancing Goal: LONG

  16.   Runtime Load Balancing Goal: NONE

  17.   TAF policy specification: BASIC

  18.   Edition:

  19.   Preferred instances: mydb2

  20.   Available instances: mydb1
复制代码


  【解决方法】

  如果想把service 在实例启动时在指定的实例上启动,需要把Management policy的值 AUTOMATIC 修改为MANUAL,但是这种情况下,service 不会自动随着instance启动,除非手动启动。

  误区3、

  RAC环境中serice所在的preferred 节点执行srvctl stop service -d mydb -s srv_mydb ,已经连接进来的会话不会中断。

  【原因】

  一样的原理:停止listener之后,已有的会话连接不会受影响。

  【解决方法】

  如果想要让已有会话中断,加上-f参数,即

 
  1.  srvctl stop service -d mydb -s srv_mydb -f
复制代码

  误区4、

  12c中 services 不会随着pdb的启动自动重启。

  【原因】

  Clusterware并没有注册pdb资源,也就是说pdb在GI资源中没有相应的资源依赖,我们不能使用srvctl 工具去启动或关闭pdb,而是要使用 alter pluggable 命令来启动。

  【解决办法】

  在启动service的时候 open 相应的service,eg:

 
  1.  alter pluggable database pdborcl open services=('pdborcl_srv');

  2.   alterpluggable database pdborcl open services=All;
复制代码


  小结:

  本节简单的介绍了service的基本概念及其优点,并对日常维护命令进行了举例说明,同时还对service运维管理的常见问题进行了简单的分析与处理。

  但是,为负载管理而生的service,单凭它一已之力是远远不够的,还须要结合resource manager的精妙布控,才能发挥其强大的功力,达到资源隔离,业务互不影响的效果。更进一步,应用连接配合在primary和standby database之间使用service并设计一定的策略,可以实现当primary database存储故障时的TAF。

原文作者:何志勇  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部