数据库常见问题处理百科
数据库常见问题处理百科
1. 表空间清理操作
1.1 目的
做为日常运维, 当表空间超过告警阀值, 为了避免数据库因表空间不足而导致问题, 对表空间进行清理操作, 保证系统稳定运维
1.2 风险与可能引发的问题
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5 对于分区表但非分区索引的数据ddl 操作清理, 如果没有适当的处理会导致索引失效问题. 对于delete 删除数据 , 没有提交会导致堵塞问题. 对于drop table 操作如果没有确认该表是否已经废弃, 会导致应用访问该表时报没有找到该表问题 对于delete 删除数据 , 如果没有使用shrink space或move (注意回收空间, 表空间是不会释放问题 对于drop table 操作如果数据库/表空间开启了回收站功能没有使用purge dba_recyclebin/user_recyclebin
操作表空间并未释放问题
1.3 操作方式
1.3.1 手工方式
group by segment_name order by 1 desc找出此表空间占用大的表并排序. 1.3.1.1 使用select sum(bytes),segment_name from dba_segments where tablespace_name=’TABLESPACE_NAME’
1.3.1.2 使用select * from dba_part_tables where table_name='TABLE_NAME'查询该表是否为分区表或者为非分
区表.
1.3.1.3 使用select * from dba_indexes where table_name='TABLE_NAME'查询该表的索引数情况再比对
select * from dba_part_indexes where table_name='TABLE_NAME'中的索引数情况如果相等则该表索引全为分区表索引, 那么在删除表分区时无需注意对表索引的影响反之则需要考虑删除表分区对索引的影响(1.1.1.5节说明如何避免影响)
1.3.1.4 如果为范围分区表删除可以使用select 'alter table ' || segment_name || ' drop partition ' ||
partition_name ||' ;' from dba_segments where owner='对应用户' and segment_name='TABLE_NAME' order by partition_nameasc对排序在最前面日期的分区进行删除(见例1.1)
(例1.1)
1.3.1.5 如果非分区索引的分区表则需要在drop partition xxx 后面添加关键字
update global indexes;(例1.2)
(例1.2)
Alter table TABLE_NAME drop partition p201207 update global indexes;
1.3.2 使用(TOAD)工具方式
(图1.3) 1.3.2.1 第一步通手工方式中的1.1.1.1相同找出占用空间大的表然后选择该表使用F4 查看表属性(见图1.3)
1.3.2.2 点击script 从创建语法中判断是否为分区索引
(图1.4) 分区索引结构(分区索引都带有local 关键字)
(图 1.5) 非分区索引结构
1.3.2.3 使用手工方式中的1.1.1.4或1.11.5 清除分区数据
1.3.3 其他清理数据库表空间中注意事项
(图1.6) 提供参考检查锁情况语句, 可以根据适当的分析做进一步处理
1.3.3.1 如果在清理表分区报ORA-00054: resource busy and acquire with NOWAIT specified请检查相关表锁情况
(图1.6)
1.3.3.2 对于非分区表如果采用delete 删除历史数据需要删除完以后对表进行shrink space 才能保证高水位回
收, 否则空间不释放,
1.3.3.3 对于整表清除数据而不是删除表建议使用 truncate table xxx
1.3.3.4 对于drop table 行为清除数据 , 需要核实数据库是否有开回收站, 使用show parameter recycle 查看参
数recyclebin 是否为on 如果为on 需要执行 purge user_recyclebin清空回收站释放空间.
1.3.3.5 对于某些特殊清空既需要保留表数据要需要清理空间的话, 如果其他表空间有很大空余空间 , 非分区
表可以使用 alter table xxx move tablespace xx 操作挪移至其他表空间(注意:操作时间), 分区表则可以使用 alter table xxxx move partition xxxxtablespace xxx (注意:分区索引与非分区索引).
1.3.3.6 其他未说明情况根据实际问题分析解决 (附:数据库表空间检查语句)
2. 归档空间清理
2.1 目的
当归档空间不足清理归档日志可以防止数据库因归档空间满而导致的一系列问题.
2.2 风险与可能引发的问题
2.2.1
2.2.2
2.2.3 在数据库处于归档模式下, 会产生归档日志, 这些产生的归档日志需要自动/手动定期去清理, 归档空间满没有空间存放新生成的归档日志则会导致dml 无法执行, 连接数据库报(ora-00257错误). 如果因归档空间满而导致数据库异常down 掉, 在启动数据库中会报(ora-16038)等错误. 如果将归档日志全部清理可能会导致与数据库全备发生脱离, 如果此时数据库异常需要全备恢复会导致
数据库无法前滚.
2.3 操作方式
2.3.1 归档日志存放在文件系统的清理方式
+ARCH或者为+xxx 则为ASM 方式存储, 如果为/dev/xxx 则为裸设备方式存储, 如果为 /arch或/xx 非/dev则为文件系统方式存储,
2.3.1.2 文件系统方式存放的归档日志清理方式有两种: RMAN方式清理, 以及手工删除目录文件方式, 推荐使
用RMAN 方式这里也只说明一下rman 方式的清理
2.3.1.3 在oracle 用户下使用rman target / 命令进入rman(图1.7为rman 登录界面)
(图: 1.7)
2.3.1.1 首先可以使用show parameter log_archive_desc_1(默认是定义在1) 查看归档日志的存放方式, 如果为
2.3.1.4 使用 list archivelog all列出全部归档日志或使用list archivelog until time 'sysdate+15';列出超过当前之前
的N 天的归档日志见(图1.8)
图:1.8)
2.3.1.5 使用 delete archive until time ‘sysdate +7’删除当前日志+7天之前的日志, 这里的+7
应该根据你的全备
周期来确定值. 命令执行后会提示你是否确认删除, 输入yes 删除
2.3.1.6 删除后hp-ux 服务器使用dbf 命令查看归档空间情况.aix/linux使用df –P 查看
2.3.1.7 如果有数据有copy 归档日志使用 delete copy 删除copy 的归档日志, 使用list copy 可以查看是否有
copy 归档日志.
2.3.2 归档日志存放在ASM 的清理方式
参数中的+XXX 路径, 进入数据库使用select * from v$asm_diskgroup查看对应asm 磁盘组空间情况, 字段free_mb代表该磁盘组的自由空间以M 为单位 2.3.2.1 同文件系统归档日志RMAN 清理方式清理, 区别在与检查归档空间使用情况, 对应log_archive_desc_1
3. 数据库锁问题处理
3.1 目的
保证系统稳定运行, 避免因为锁问题而产生的dml/ddl堵塞导致应用无法使用等问题
3.2 风险与可能引发的问题
常见的3级行级锁会持有相关行的资源, 使其他语句 update/delete 改行会导致等待
3.2.2 对锁相关语句如果没有找到最开始锁定资源的对象而进行全部堵塞语句kill 会导致kill 的所
有语句回滚,
3.2.3 锁引起的问题由锁的级别不同, 以及表的重要性不同而产生问题大小不同.
3.2.4 如果对象对某个表持有2-6级锁, 则无法对该表进行ddl 操作
3.2.1