




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、阿里巴巴数据库标准操作手册01-建表一、 目的明确建表操作的风险及标准流程,最大限度避免建表操作带来的故障。二、 适用范围l 项目预发布新建表l 项目正式发布新建表l 不包含数据订正所建临时表l 不包含导数据所建的中间表三、 风险评估l 登录到错误的schema下,导致表建到错误的schema里,而应用无法访问。l 忽略了tablespace参数,导致表建到了默认表空间,导致后续空间增长和维护困难。l 对于未来增量较快的表选择了一个空间规划不足的表空间,导致后续空间增长和维护困难。l 脚本末尾缺少分号,导致该表没有被创建上,而执行ddl的过程又不会报错。l 其他原因漏建了表,导致应用访问错误。
2、l 所建的表定义(表名、字段名、字段定义、字段个数、字段顺序)跟测试环境不一致,导致应用访问错误。l 同步库没有及时创建相应的表,或者没有更新同步配置,导致同步及应用出问题。四、 操作流程1. 准备工作a) 在项目需求分析阶段,跟数据库设计人员一起明确新表所存放的数据库。具体设计原则本文不繁述。b) 准备发布脚本时,检查tablespace定义,检查tablespace剩余空间,参考表空间自身负荷及新表的预期负荷,为每个新建的表选择合适的表空间,并在建表语句中添加tablespace的配置。c) 定发布计划时,跟开发接口人一起商定好建表操作的时间点。如小需求没有发布计划评审,则必须在提交测试时
3、(即表结构冻结时)即开始与开发接口人确定建表时间点。如果发生计划外的发布建表需求,则要追究项目跟进的应用dba沟通不力的责任。d) 以目前的认知,仅建表操作本身不会对数据库造成任何风险,故操作的时间点可以放宽:在变更时间窗口内,均可以执行建表操作。e) 建表操作属于预授权变更,在做之前必须在itil中提交相应的变更申请。2. 执行过程 a) 用应用账户登录数据库,show user检查是否连接到正确的schema。严禁使用sys、system等用户建表。b) 执行建表脚本。若一次建表个数超过三个以上,要求将脚本事先保存为文本文件,上传至数据库服务器,执行时使用 create_table_ddl
4、.sql的方式直接执行。c) 查看过程若无报错,退出当前登录。若有报错,找出报错的地方,修改确认再执行,直至全部执行通过,最后退出当前登录。3. 验证方案a) 常规检查:dbcheckb) 检查表定义是否与测试库一致:exec pkg_check.compareobject(user,table_name);c) 立即联系开发接口人进行应用测试,【建表】变更是否成功以应用测试结果为准。d) 同步库若建表,也需要执行 a) 和 b) 两个步骤。02-数据订正一、 目的明确【数据订正】操作的种类、风险,并根据各种类型的数据订正制定完善的步骤和回退方案,最大限度减少此类操作带来的故障。二、 适用范围
5、l 新建表数据初始化l 现有表新增数据l 现有表删除数据l 现有表上新增字段初始化l 现有表上现有字段值修改三、 风险评估l 业务风险:订正本身所包含的业务不正确,导致给客户给公司带来损失。l 程序风险:订正本身业务正确,但是应用程序无法兼容订正的数据,导致应用出错。l 数据库风险:订正本身业务正确,应用程序也可以兼容,但是订正速度过快、订正并发压力过大,导致数据库无法正常提供服务。通常会造成表空间耗尽、undo消耗过快、archive增长过快、备库恢复压力大等问题。l 沟通风险:在业务方-开发接口人-dba三方的沟通交流过程中,信息传递错误或者不及时,导致最终订正的数据没有达到预期的目的。l
6、 回滚风险:主要是因为业务方的原因,订正完成一段时间后要求回退,若在订正前没有备份原始数据,则可能导致无法顺利回退或者回退难度极大,给客户给公司带来损失。l 同步风险:各类同步架构下,数据订正可能导致同步堆积和同步延时,影响正常同步业务,所以有些大规模订正必须要正确屏蔽同步,并在多个库分别执行相同的订正脚本。l 缓存:有些表在应用层面做了缓存,制定订正计划的时候要考虑到订正后是否需要更新缓存。四、 操作流程1. 准备工作a) 需求分析阶段确认项目涉及的数据订正范围和数据量。b) 跟开发人员确定订正后是否涉及到对缓存的刷新和订正。c) 根据数据量评估对数据同步的影响,决定是否屏蔽同步。(应用db
7、a必须熟悉同步采用的技术、正常情况下的同步量和延时、可以容忍的同步延时、屏蔽同步的具体方法。)d) 注意规划订正速度,以防undo消耗殆尽。e) 订正脚本:i. 开发接口人直接提供可执行的sql脚本,dba只负责拷贝执行。ii. 开发接口人提供主键及更新字段新值列表,由dba导入数据库,写sql脚本关联原表批量订正。iii. 开发接口人提供订正逻辑,由dba翻译为批量提交sql脚本。iv. 订正脚本要求可断点续跑,可反复执行。v. 严禁仅用一个事务来处理大规模订正(影响的记录数超过1万笔)。超过一万笔的订正必须分段提交。vi. 确认订正脚本的执行计划正确。vii. 脚本中加入“进度报告”,即调
8、用如下包(但是对于trigger中判断client_info的不允许这样处理。):dbms_application_info.set_client_info(n | rows commit.);n为变量,累加,表示当前订正的总记录数。f) 开发阶段跟开发接口人确认数据订正逻辑,完成订正脚本,并跟开发接口人确认脚本是否正确,同时按照需求准备备份脚本。g) 测试阶段在测试库执行订正脚本,由开发接口人和测试人员验证订正的正确性,应用dba协助验证。h) 发布前确定订正速度和并发度,确定订正时间段,预估订正总时长,若涉及量较大,需要跨天做订正,则应规划好每日订正的数据量和时间段。i) 备份要求:i.
9、新建表初始化:无需备份,回退时直接truncate即可。ii. 现有表新增数据:新建备份表记录下新增记录的主键,或者在新增记录中特定字段标识区分出订正所新增的数据,回退时定向delete这些记录。iii. 现有表删除数据:新建备份表记录下删除数据的完整记录,回退时直接从备份表中取出数据insert到原表。iv. 现有表上新增字段初始化:无需备份,回退时将该字段update为null或者开发接口人要求的值。不得将删除字段作为回退手段。v. 现有表上现有字段值修改:新建备份表记录下所改动记录的主键及所改动字段的原始值,回退时将改动过的字段按照主键更新到原表(若应用程序在回滚前已经修改了记录,则要根
10、据具体业务具体分析回滚方案)。vi. 备份表:备份表统一命名为 table_name_bak_mmdd_operator,最后的operator为操作dba的姓名每个字的首字母,如果超长了,则将原表名缩减。创建人有责任定期删除创建时间超过一个月以上的备份表。2. 执行过程 a) 如果需要,按照备份脚本备份数据。b) 执行订正脚本。查看订正进度,使用如下脚本:select client_info from v$session where client_info is not null;这个脚本必须配合前面描述的“进度报告”脚本执行。c) 检查undo消耗: undod) 检查表空间消耗: tbs
11、e) 检查归档空间f) 检查同步延时是否异常。g) 如果需要刷新应用缓存,在订正结束后通知应用刷新缓存。3. 验证方案a) 以应用验证为主,数据库辅助做一些count等验证。以应用验证通过为操作成功标准。五、 核心对象风险l 考虑到对erosa和otter的影响,严禁数据订正更新主键值。六、 回退方案按照备份时所做的各种不同的回退方案进行回退,回退之后也要要求应用做验证。03-创建、删除、修改sequence一、 目的明确定义对于sequence对象的操作风险及步骤。二、 适用范围l 项目发布创建新sequence。l 以删除、重建的方式修改sequence的起始值。l 在线修改sequenc
12、e的cache值。三、 风险评估l sequence命名与应用程序中不一致,导致应用无法正常访问sequence。l 双向同步的库,多库创建同名sequence,起始值和步长值设置不合理,导致生成的值在表中对应主键值同步产生冲突。l 删除、重建sequence的过程中,应用无法访问sequence,高并发的应用可能会产生故障。l 删除、重建sequence之后没有对sequence的权限进行恢复,导致原本访问该sequence的其他schema无法正常访问。l sequence的cache设置不合理,设置过小会导致大量的系统相关等待,反之则导致sequence生成值断层过多浪费严重。l jav
13、a程序的int16数据类型只能容纳最大21亿,所以sequence不能超过这个值,如果有可能超过,需要跟开发确认。四、 操作流程1. 准备工作a) 默认使用变更系统生成的sequence名称,如果要修改,必须跟开发人员沟通一致。b) 与开发人员、项目发布负责人沟通变更时间点。对于删除、重建的操作必须明确告诉他们其间会有短暂的无法访问,如果是高并发的应用则选择在系统访问量最低的时候执行,规避风险。c) 根据并发数确定cache值,默认为100,如遇特殊需求,酌情调整。d) 删除、重建的操作,事先检查是否有其他schema拥有对于该sequence的访问权限:select grantee, own
14、er, table_name, privilegefrom dba_tab_privswhere table_name = upper(重建的对象名);e) 全面考虑同步的风险,确定同步环节中各个数据库的同名sequence起始值及步长,保证不会发生冲突,通常有如下两种做法:i. 起始值相差不大,步长值等于数据库个数。以双库同步为例,起始值分别设为1和2,步长均设为2。ii. 起始值相距较大,步长值相同。以双库同步为例,a库起始值设为1,b库起始值设为2亿,步长均设为1。相差的值可以根据增长预期进行调整。2. 执行过程 a) 标准新建脚本:create sequence seq_tablena
15、me start with 1 cache 100;命名规范: seq_tablename默认不指定recycle和max value。b) 标准重建脚本:drop sequence seq_tablename ;create sequence seq_tablename start with 1 cache 100;为了尽量缩短sequence不可用时间,这两个语句一起放在securecrt的chartwindow中一起执行。c) 标准修改cache脚本:alter sequence seq_tablename cache 200;d) 标准赋权脚本:grant select on seq_
16、tablename to username;3. 验证方案a) dbcheck 检查是否有失效对象b) 通知应用验证是否可以正常访问sequence五、 核心对象风险高并发对象重建时短暂不可访问;04_增加、删除唯一约束一、 目的明确增删唯一约束操作的风险及标准流程,最大限度避免增删唯一约束操作带来的故障。二、 适用范围l 项目发布新建表的增删唯一约束l 对于旧表的增删唯一约束三、 风险评估l 对现有表新增唯一约束的操作,会堵塞包括查询在内的所有操作,风险很大,请谨慎使用,尽量在新建表时和开发讨论后增加。l 没有指定index,系统自动创建了index,删除约束时,自动创建的index同时删除
17、了。l 在高峰期创建,导致大量的library cache lock/pin的等待l 有同步的应用,先要在源端加,后在目标端加。l 表里有重复的数据,导致操作失败。四、 操作流程1. 准备工作a) 检查唯一建字段上是否存在index。没有的话,需首先创建index( 步骤详见增加index手册)。 b) 检查唯一键上是否有重复数据,如有,需和开发讨论如何处理。c) 根据应用的需求和数据库的负载情况,确定操作的时间点。对于数据量和访问量较大的表,变更时间点要谨慎选择.d) 检查字段上是否已经有了约束。e) 增加和删除唯一约束属于标准变更,需要开发在itil中提交事件单,应用dba提交变更单,有技
18、术经理审批后执行。f) 对现有表新增约束,如果使用validate这个参数,会导致该表上连查询在内的所有操作都被锁住,风险非常大;如果使用novalidate参数,这个参数会导致数据字典不一致(及导致sqlldr的时候会导入重复数据)。两者相比,故通常情况下用validate的风险更大,默认必须使用novalidate参数。g) 约束名与所依赖索引名一致。2. 执行过程 a) 用应用账户登录数据库,show user检查是否连接到正确的schema。b) 执行增加或删除的命令。命令模板如下:alter table 表名 add constraint 表名_uk unique (字段名) usi
19、ng index 索引名 novalidate;alter table 表名 drop constraint 约束名 keep index;如有otter同步,要注意执行顺序:先在源数据库端加后在目标端增加。c) 查看过程若无报错,退出当前登录。若有报错,找出报错的地方,修改确认再执行,直至全部执行通过,最后退出当前登录。3. 验证方案a) 常规检查:dbcheckb) 检查表定义是否与测试库一致:exec pkg_check.compareobject(user,table_name);c) 检查约束是否加上或删除:select* fromdba_cons_columns wheretabl
20、e_name=upper(table_name)五、 核心对象风险1. 核心表访问量大,数据量大。增加唯一约束时会短暂出现library cache pin/lock。执行时间要订在核心表访问的低峰期。六、 回退方案1. 执行前需准备好回退的脚本。2. 回退时需得到开发的确认,并确认回退的时间点。05-加字段一、 目的阐述表变更的风险及其步骤,降低对应用的影响和避免故障。二、 适用范围l 所有在使用的表的加字段三、 风险评估l 新增字段的类型、长度(精度)是否合适解决方法:跟应用明确加字段和改字段的风险,确认新增字段类型正确、长度(精度)合适。以及跟应用明确老数据是否要订正?如何订正?新增列是
21、否非空?是否有默认值等等。l 新增字段的非空属性、默认值以及老数据问题。新增字段如果是not null的,则一定要有默认值,否则老应用的insert代码可能报错。表如果存在老数据,带上默认值的时候会导致oracle去订正老的数据行的新增列。如果老数据非常多,表的并发访问高,很有可能导致大面积的阻塞等待以及产生大事务,甚至有可能导致undo耗尽。倘若回滚,还会因为回滚产生的并发会话导致load飙升。解决方法:先不带not null不带默认值加上列,再更改列默认值,再批量订正老数据,然后再加上not null属性。如果是大表,并且并发访问很高的表,则新增列不允许为not null,以简化后面变更步
22、骤,降低风险!l 新增字段导致依赖对象失效、sql游标失效问题。表的dml并发很高的时候,如果表上面还有依赖对象,新增字段会导致依赖对象失效。默认其他dml会话会尝试去自动编译这个依赖对象,此时很可能会出现大面积的library cache pin。应用会话的连接时间会加长,进而导致出现后续应用报不能取得连接池错误。应用服务器load由此飙升。表新增字段也会导致跟该表有关的sql的游标失效,如果sql的并发很高(查询sql或者dml sql),失效后sql会重新解析,此时也可能会出现大量的library cache pin & library cache lock。解决方法:选择在业务
23、低峰期发布,同时在数据库级别开启trigger禁用客户端程序自动编译功能,字段加完后再禁用该trigger。l 表的依赖对象是否要相应调整。表上面的依赖对象如果有存储过程或触发器等,逻辑是否需要相应调整。l 是否涉及到同步。同步中的表需要两地都要变更。涉及到erosa的要更新一下数据字典。erosa需要重启一下。l 是否要通知其他关联的部门。如dw, asc或crm等等。有些表很多部门都用,需要沟通约定时间一起变更。如果有同步方案,同步方案的变更也要考虑。四、 操作流程1. 准备工作a) 该表的数据量以及大小,以及数据变更量(按日/时/分/秒等)b) 该表的并发访问数,以及频率最高的几种sql
24、的访问方式2. 执行过程以表t1 加字段 col2为例。t1的数据量非常大,访问频率很高。a) 在sysdba下开启trigger禁用客户端自动编译功能。(可选)alter trigger sys.ddl_trigger_for_database enable;b) 变更字段以下加字段同编译失效对象连着执行。编译时先编译trigger再编译存储过程或package等conn zzzzzz/aaaalter table t1 add col2 varchar2(20);alter trigger trg_t1_search compile;conn retl/rrralter trigger t
25、rg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzzzz/aaaalter procedure sp_test compile;后面3个trigger的编译可以开三个窗口同时进行。另开一个窗口,在admin用户下查看当前失效对象dbcheckc) 老数据订正如果需要默认值,加上默认值alter table t1 modify col2 default y;数据订正存储过程create or replace procedure sp_dml0214ascursor c1 is select
26、rowed rid, id, col2 from t1 where col2 is null;v_cnt number := 0;beginfor rec_c1 in c1 loopv_cnt := v_cnt + 1;update t1 set col2=y where rowed = rec_c1.rid and id=rec_c1.id;if mod(v_cnt,500)=0 thencommit;dbms_application_info.set_client_info(sp_dml0214 | v_cnt | rows!);end if;end loop;commit;dbms_ap
27、plication_info.set_client_info(sp_dml0214 | v_cnt | rows!);end;/exec sp_dml0214;另开一个窗口,查看订正进度col machine for a19col status for a12col client_info for a50select sid,serial#,status,machine,client_info,sql_hash_value from v$session where client_info is not null;d) 订正完后加上not null属性alter table t1 add col
28、2 not null;e) (国际站 可选)中美都变更,erosa重启更新erosa数据字典./getdict.sh erosa重启./erctl stop./erctl start3. 验证方案a) 验证sys下的trigger已经禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name= ddl_trigger_for_database enable;b) 验证结构正确desc zzzzzz.t1c) 验证无失效依赖对象dbcheck 五、 核心对象风险核心对象风险指
29、的是业务上重要的表,并且数据量很大或表大小很大或并发访问数很高时,变更的潜在风险。前面已经阐述。六、 回退方案1. 大表的新增字段不允许回滚。因为回滚即删掉字段,会导致锁表,持续时间很长进而导致一序列的严重问题。2. 普通表的新增字段如果是发布失败,后续还会有二次发布,也不考虑回滚。或者只是将not null属性拿掉,下次发布再加上。3. 普通表如果应用有足够的理由要求回滚,则回滚。06-加not null字段一、 目的阐述表变更的风险及其步骤,降低对应用的影响和避免故障。二、 适用范围l 所有在使用的表的加not null字段,但核心表(并发访问高的大表不允许加not null)。三、 风险
30、评估l 新增字段的类型、长度(精度)是否合适解决方法:跟应用明确加字段和改字段的风险,确认新增字段类型正确、长度(精度)合适。是否有默认值?以及跟应用明确老数据是否要订正?如何订正?l 新增字段的非空属性、默认值以及老数据问题。新增字段是not null的,则一定要有默认值,否则老应用的insert代码可能报错。表如果存在老数据,带上默认值的时候会导致oracle去订正老的数据行的新增列。如果老数据非常多,表的并发访问高,很有可能导致大面积的阻塞等待以及产生大事务,甚至有可能导致undo耗尽。倘若回滚,还会因为回滚产生的并发会话导致load飙升。解决方法:先不带not null不带默认值加上列
31、,再更改列默认值,再批量订正老数据,然后再加上not null属性。如果是大表,并且并发访问很高的表,则新增列不允许为not null,以简化后面变更步骤,降低风险!l 新增字段导致依赖对象失效、sql游标失效问题。表的dml并发很高的时候,如果表上面还有依赖对象,新增字段会导致依赖对象失效。默认访问这些依赖对象的会话(如dml会话,或者应用调存储过程等)会尝试去自动编译这个依赖对象(9i所有会话都会尝试去编译,10g以后只有一个会话去主动编译,其他等待),此时很可能会出现大面积的library cache pin。应用会话的连接时间会加长,进而导致出现后续应用报不能取得连接池错误。应用服务器
32、load由此飙升。表新增字段也会导致跟该表有关的sql的游标失效,如果sql的并发很高(查询sql或者dml sql),失效后sql会重新解析,此时也可能会出现大量的library cache pin & library cache lock。解决方法:选择在业务低峰期发布,同时在数据库级别开启trigger禁用客户端程序自动编译功能,字段加完后再禁用该trigger。l 表的依赖对象是否要相应调整。表上面的依赖对象如果有存储过程或触发器等,逻辑是否需要相应调整。l 是否涉及到同步。同步中的表需要两地都要变更。涉及到erosa的要更新一下数据字典。erosa需要重启一下。l 是否要通知
33、其他关联的部门。如dw, asc或crm等等。有些表很多部门都用,需要沟通约定时间一起变更。如果有同步方案,同步方案的变更也要考虑。l 表结构变更后应用需要重启。应用端缓存的表结构跟实际结构有冲突报错。四、 操作流程1. 准备工作a) 该表的数据量以及大小,以及数据变更量(按日/时/分/秒等)b) 该表的并发访问数,以及频率最高的几种sql的访问方式2. 执行过程以表t1 加字段 col2为例。t1的数据量非常大,访问频率很高。a) 在sysdba下开启trigger禁用客户端自动编译功能。(可选)alter trigger sys.ddl_trigger_for_database enabl
34、e;b) 变更字段以下加字段同编译失效对象连着执行。编译时先编译trigger再编译存储过程或package等conn zzzzzz/aaaalter table t1 add col2 varchar2(20);如果需要默认值,加上默认值alter table t1 modify col2 default y;alter trigger trg_t1_search compile;conn retl/rrralter trigger trg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzz
35、zz/aaaalter procedure sp_test compile;另开一个窗口,在admin用户下查看当前失效对象dbcheckc) 禁用ddl triggeralter trigger sys.ddl_trigger_for_database disable;d) 老数据订正数据订正存储过程create or replace procedure sp_dml0214ascursor c1 is select rowed rid, id, col2 from t1 where col2 is null;v_cnt number := 0;beginfor rec_c1 in c1 l
36、oopv_cnt := v_cnt + 1;update t1 set col2=y where rowid = rec_c1.rid and id=rec_c1.id;if mod(v_cnt,500)=0 thencommit;end if;end loop;commit;end;/exec sp_dml0214;另开一个窗口,用sqlinfo脚本查看订正进度e) 订正完后加上not null属性(核心表不要做了),风险和步骤详情参见文档:4.增加、删除唯一约束alter table t1 modify col2 not null;f) 表涉及到同步后,再多个节点变更,erosa是否重启取
37、决于erosa版本。更新erosa数据字典./getdict.sh erosa重启./erctl stop./erctl start3. 验证方案a) 验证sys下的trigger已经禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name=upper( ddl_trigger_for_database);b) 验证结构正确desc zzzzzz.t1c) 验证无失效依赖对象dbcheck d) 跟测试库比对。五、 核心对象风险核心对象风险指的是业务上重要的表,并且数据量
38、很大或表大小很大或并发访问数很高时,变更的潜在风险。前面已经阐述。六、 回退方案1. 大表的新增字段不允许回滚。因为回滚即删掉字段,会导致锁表,持续时间很长进而导致一序列的严重问题。2. 普通表的新增字段如果是发布失败,后续还会有二次发布,也不考虑回滚。或者只是将not null属性拿掉,下次发布再加上。3. 普通表如果应用有足够的理由要求回滚,则回滚07-赋权一、 目的明确常用赋权操作标准流程,以及赋权过程中可能产生的风险,最大限度避免赋权操作带来的系统故障。二、 适用范围l 对数据库对象的授权操作,数据库对象包括表、存储过程、同义词、视图和序列等。授权类型包括查询、增删改、执行。l 对数据
39、库用户的系统授权操作。三、 风险评估l 对数据库用户进行系统授权时,需要根据实际情况进行,避免因对用户授予过高的系统权限或角色,进而使该用户存在误操作引发数据库或应用故障的风险。l 对于存储机密数据的表的授权,需要慎重。以免泄露机密数据。l 对于涉及同步的数据库,需要分别在同步的两端数据库执行相同的授权操作。l 10g之前版本,grant操作需要获得exclusive级别的library cache lock/pin。其风险主要针对于procedure、function等,对table基本无影响。若procedure正在执行时,对其本身或者其依赖的procedure、function进行授权,
40、将阻塞其他要执行此procedure或其依赖procedure、function的会话,直到授权前正在执行的procedure结束。l 对数据库对象授权时,不会引起依赖对象失效,但会导致library cache中与授权对象有依赖关系的游标失效,进而产生硬解析。如果对象的依赖游标过多,或执行频率较高,可能会对系统造成较大的冲击,造成cpu繁忙,latch争用严重,最常引起的latch争用有 shared pool、library cache还会有library cache pin、cursor pin s:wait x等争用出现。如果争用比较严重,甚至可能导致数据库crash。为避免此类情况出
41、现,对于新建对象,应尽可能的先把权限授予给可能会使用到的用户;对于在使用的对象,应充分评估对象依赖游标的个数和执行次数,选择执行低峰进行操作。l 对于grant any table,或者grant dba/ exp_full_database等涉及大量对象的系统授权操作,应该作为重大变更对待,此类操作的风险极大,务必在业务低峰期进行操作。四、 操作流程1. 准备工作a) 确认此次授权是否属于正常的业务需要。b) 若赋予的为系统权限,禁止使用with admin option选项。c) 若赋予的为对象权限,请确认此对象在数据库中缓存的游标个数,以及每个游标在不同时段的执行频率,根据具体的情况选择
42、合适的变更时间窗口进行授权。d) 准备授权脚本。e) 新建对象的授权需要走事件流程。f) 在用对象的授权或涉及大量对象的系统授权需要走一般变更或重大变更流程。2. 执行过程a) 以赋权对象所在的用户登录数据库,show user检查是否连接到正确的schema。b) 如果被依赖对象的执行频率很高,需要打开ddl trigger.c) 执行赋权脚本。d) 查看过程若无报错,退出当前登录。3. 验证方案,以下列举两种验证方式:使用被赋权用户登录:i. 验证对象权限:select owner,grantee,table_name,privilege from user_tab_privswhere
43、grantee=&user_nameand table_name=&object_name;ii. 验证系统权限:select username,privilege from user_sys_privs;五、 核心对象风险核心对象上的依赖sql往往较多,而且执行频率较高,授权操作会导致对象依赖的游标失效,进而导致硬解析风暴。应该尽量选择业务低峰期来进行核心表的赋权操作。六、 回退方案我们遭遇的授权操作的最大风险第一是导致的硬解析风暴,第二是授权操作涉及数据字典的修改,甚至可能会导致row cache lock的出现。对于硬解析风暴的风险,回退的方案不是revoke对象的权限,
44、而是等待硬解析风暴过去。对于赋权操作引发的问题,要根据具体的情况而定。提前把方案一定要整理好,慎重选择变更的时间,避免出现问题。08-修改字段长度一、 目的阐述表变更的风险及其步骤,降低对应用的影响和避免故障。二、 适用范围l 所有在使用的表修改字段长度,具体是number型和varchar2型,只允许范围扩大。三、 风险评估l 相关表的长度是否一并修改当该表某个字段长度加长后,可能有关联的表的数据来自于该表,那么那个关联的表的相应字段也应该加长。这点由应用去评估。该表上如果有物化视图,则物化视图的基表的对应的字段长度也要加长。该表上如果有存储过程、触发器、package,里面的代码中跟该字段
45、有关的变量如果声明的是具体的长度,则也要加长。正确的声明方式是col%type。l 修改字段导致依赖对象失效、sql游标失效问题。表的dml并发很高的时候,如果表上面还有依赖对象,修改字段长度会导致依赖对象失效。默认其他dml会话会尝试去自动编译这个依赖对象,此时很可能会出现大面积的library cache pin。应用会话的连接时间会加长,进而导致出现后续应用报不能取得连接池错误。应用服务器load由此飙升。表修改字段长度也会导致跟该表有关的sql的游标失效,如果sql的并发很高(查询sql或者dml sql),失效后sql会重新解析,此时也可能会出现大量的library cache pi
46、n & library cache lock。解决方法:选择在业务低峰期发布,同时在数据库级别开启trigger禁用客户端程序自动编译功能,字段加完后再禁用该trigger。l 表的依赖对象是否要相应调整。表上面的依赖对象如果有存储过程或触发器等,逻辑是否需要相应调整。l 是否涉及到同步。同步中的表需要两地都要变更。涉及到erosa的要更新一下数据字典。erosa是否需要重启取决于erosa版本。l 是否要通知其他关联的部门。如dw, asc或crm等等。有些表很多部门都用,需要沟通约定时间一起变更。如果有同步方案,同步方案的变更也要考虑。四、 操作流程1. 准备工作a) 该表的数据量
47、以及大小,以及数据变更量(按日/时/分/秒等)b) 该表的并发访问数,以及频率最高的几种sql的访问方式2. 执行过程 以表t1 加字段 col2为例。t1的数据量非常大,访问频率很高。a) 在sysdba下开启trigger禁用客户端自动编译功能。(可选)alter trigger sys.ddl_trigger_for_database enable;b) 变更字段以下加字段同编译失效对象连着执行。编译时先编译trigger再编译存储过程或package等conn zzzzzz/aaaalter table t1 modify col2 varchar2(50);alter trigger
48、 trg_t1_search compile;conn retl/rrralter trigger trg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzzzz/aaaalter procedure sp_test compile;后面3个trigger的编译可以开三个窗口同时进行。另开一个窗口,在admin用户下查看当前失效对象dbcheckc) 禁用ddl triggeralter trigger sys.ddl_trigger_for_database disable;d) 涉及到同步
49、的表,各个节点都变更,erosa重启取决于版本更新erosa数据字典./getdict.sh erosa重启./erctl stop./erctl start3. 验证方案a) 验证sys下的trigger已经禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name=upper( ddl_trigger_for_database );b) 验证结构正确desc alibaba1949.t1c) 验证无失效依赖对象dbcheck d) 跟测试库比对结构五、 核心对象风险核心
50、对象风险指的是业务上重要的表,并且数据量很大或表大小很大或并发访问数很高时,变更的潜在风险。前面已经阐述。09-改动统计信息一、 目的oracle优化器依据对象、系统的统计 信息来产生执行计划。因此如何收集对象、系统的统计信息尤其重要,本文档主要介绍收集对象统计信息的操作方法。某些情况下,如执行计划走错、表缺少关键字 段统计信息,需要我们手工的设置统计信息,因此也会涉及修改对象统计信息的内容。对于执行计划走错,通过修改统计信息来修正的情况,要对cbo算法有简单的了解,知道哪些统计信息涉及到cost计算的过程。可以参考lewis的cbo优化法则来了解cost的计算.本手册不会涉及这些内容。二、
51、适用范围l 新建表,表里初始化了大量的数据。 l 对于已经存在的表,表里数据量变化比较大。比如表删除了大量数据。需要重新收集统计信息。l 由于表上统计信息不准确或缺失导致执行计划走错。l 表统计信息过于陈旧,可能导致执行计划错误三、 风险评估l 统计信息的改变会涉及到表上所有sql在下一次硬解析的时候用到,因此影响面广。在操作的时候,需要确认影响的范围,不要单纯为了某一个sql的执行计划正确,而导致更多的sql执行计划走错。l 请仔细评估好,no_invalidate的设置问题,这个参数设置为true,表上依赖的sql不会立马失效,即不会立刻采用表上新的统计信息。只有下一次硬解析的时候才会用新
52、的统计信息来生成执行计划。绝大多数时候,我们这边采用的参数值是false.代表让表上依赖的游标立刻失效,在下一次解析的时候,能够立刻用上表上新的统计信息。l no_invalidate在设置为false会导致在收集统计信息完成后,表上所有的sql重新解析,对于核心表以及一些依赖sql很多的表,要尽量放到业务低峰期去操作,否则可能遭遇硬解析的风暴,导致系统cpu繁忙,latch争用(shared pool latch ,library cache latch,library cache pin,cursor pin s:wait x).如果遭遇这种情况,大多数时候,这种争用会随着硬解析完成而很快
53、结束,但是也有可能会导致oracle crash。l oracle优化器依赖准确健全的统计信息来产生优秀的执行计划,虽然收集统计信息理论上是为了让更精准的、更能反映目前数据的分布的统计信息产生出更优秀的执行计划,但是无论如何oracle无法保证这一点,有可能执行计划更优秀或者不变,有可能更糟糕了,相信随着oracle版本的不断提升,优化器的bug会越来越少。l oracle的dbms_stats不能单独收集列的统计信息,要了解到,如果收集了某一列的统计信息,表的统计信息会随着更新。l 把estimate_percent设置的比较小,可以加快收集统计信息的时间,在不收集直方图的情况下,设置较小的
54、值一般也不会有任何问题。可是如果表存在直方图,那么还是建议你根据情况把这个参数设置的大点。l 目前生产环境都关闭了绑定变量窥探的功能,因此对于收集了直方图的列,需要确认传入的是文本变量。四、 操作流程几个重要收集参数的介绍以及使用规范:1. no_invalidate 是否让表上的游标立即失效:自动定期执行(crontab)设置true,手动收集设置false。2. force 是否对锁定统计信息的表收集统计信息 :不指定,统一规范使用默认值false 不收集锁定表的统计信息,如果需要收集请提单给出原因。3. degree 收集统计信息的并行度 : 不指定,使用默认值1;如果为了加快收集时间,
55、可以设置高的并行度,需要提单给出理由。4. estimate_percent 采样百分比:一般设置成 0.5 ,可以让收集统计信息的时间缩短。这个值是个最小值,如果oracle觉得这个值小,会自动调大。采样的大小不要超过100m,采样的时间控制在1分钟以内。5. method_opt 收集直方图的方法 :分以下几种情况:a) 执行计划走错:1. 收集指定列的基本统计信息:for columns a size repeat,b size repeat2. 收集指定列的直方图:for columns a size auto,b size auto b) 统计信息全为空:收集所有列的基本信息,同时收集个别列的直方图:for columns size repeat, a size auto,b size autoc) 定时收集统计信息:for all columns size repeat 6. cascade 设置成true,收集索引的统计信息。9i默认值是false,10g默认值是true.7. 如果是分区表,需要指定partname参数。更多参数的说明请参照我写的dbms_stats包参数介绍。文档位于:数据库管理à知识总结-àdbms_st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省海门市2025年高三模拟试题数学试题试卷解析
- 2019-2025年二级注册建筑师之建筑结构与设备通关提分题库(考点梳理)
- 2025深圳市设备供应合同范本
- 2025租房合同协议书样本参考
- 餐饮外出营销方案范本
- 光伏 项目 合同样本
- 2025光纤买卖合同范本
- 2025中外合作开发合同(电子产品)
- 商场钢网架施工方案
- 提升团队协作效率的措施计划
- 施工现场机械设备管理规定
- 重大火灾隐患判定方法知识培训
- 市政道路施工方案投标文件(技术方案)
- 山东《电动自行车集中充电设施建设规范》
- 广东省佛山市S6高质量发展联盟2023-2024学年高一下学期4月期中考试数学
- 杭州本级公共租赁住房资格续审申请表Ⅴ
- (完整版)英语四级词汇表
- 新浙美版小学美术二年级下册教学计划教案及教学反思
- 2024年消防宣传月知识竞赛考试题库300题(含答案)
- 道路旅客运输企业双重预防机制建设指导手册
- 历史的三峡:近代中国思潮与政治学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论