Oracle DBA意味着丰富的薪金,高质量的生活。因此很多人都非常向往能做一名DBA,特别是一名Oracle数据库的DBA,但是对大多数人来讲,Oracle DBA往往是神龙见首不见尾,充满了神秘。本文给出了一个或者多个Oracle数据库,DBA的每一天、每一周和每一月主要要做的检查状态的详细信息,希望能对欲从事DBA工作的朋友有所帮助。
一、什么是DBA
一个大型的信息管理系统允许许多用户使用它,为了更好地为用户服务,保障系统高效正常地运行,通常都应设立一个专门的小组或人员来负责管理数据库系统,负责该管理系统的小组或人员叫数据库管理员(DataBase Administrator,简称DBA)。
数据库管理员的主要职责如下:
l 负责数据库管理系统的安装和升级
l 建立基本的数据库存储结构和基本对象
l 为数据库系统分配存储空间和规划将来的存储需求
l 修改数据库结构
l 用户注册
l 控制和监督管理用户对数据库的存取
l 数据库的后备和恢复
l 维护系统安全
二、每日检查
(一)验证所有的实例是否已经启动
DBA每天开始的第一件事情就是检查所有的实例是否已经启动,确认数据库是否可以使用。1.登陆进入每一个实例,运行每日报告或者测试脚本。
如果公司存在多个Oracle数据库,则一些站点可能希望能够自动运行这些检查过程,并生成详细的检查报告。DBA可根据实际情况,编写一个检查脚本每日定期自动执行。
2.可选择执行:使用Oracle企业管理器的probe事件。
(二)查找任何更改了的新的登陆日志
? DBA要养成定义查看跟踪文件,尤其是警报日志、登陆日志,并做些清除操作,只有当有人用手工方式编辑跟踪文件并且删除该文件内容时,警报跟踪文件才会暂停增大。
1.连接到每一个Oracle的管理系统
2.使用“telnet”或者其它兼容程序进行登陆
?3.对每一个已管理的实例,进入后台导出目的地。通常使用$ORACLE_BASE/<SID>/bdump,确保每一个管理数据库的SID下查看
4.在命令提示符下使用unix命令“tail”查看alert_<SID>.log警告日志文件,要不然就在这些文件中检查最近被访问的文件。
?5.如果出现自上次查看后的任何Oracle错误,在数据库恢复日志中注明,并对每一个进行调查。
(三)验证DBSNMP正在运行
Oracle支持SNMP(Simple NetWork Management Protocol,简单网络管理协议),通过支持SNMP,就可以将Oracle产品轻易地集成到系统和网络的监控工具中。从而实现当数据库出现紧急情况下系统自动报警、对报警条件自动进行反应。因此要确保DBSNMP进程正在运行。
1.登陆到每一个管理的机器去检查dbsnmp进程。
对unix:在命令提示符下输入:ps-ef | grep dbsnmp。这里应该有两个dbsnmp进程在运行,如果不是则重新启动dbsnmp进程。
(四)检验数据备份是否成功
(五)检验数据归档到磁带或者其他备份介质是否成功
(六)检验是否有足够的资源来满足系统最小性能需求
1.检验表空间中的自由空间
对每一个实例,在每一个表空间中验证有足够的自由空间存在,来处理每天预期表空间的增长。对<date>,最小的自由空间<repeat for each tablespace>:[ < tablespace > is < amount > ].当输入的数据是稳定的,平均每天的增长是可以计算出来的。然后最小自由空间应该至少<time to order,get,and install more disks>日数据的增长。
a)到每一个实例,运行free.sql来检查在表空间有多少自由空间。与该表的最小自由空间进行比较。注明任何低空间和正确运行的条件。
b)到每一个实例,运行space.sql来检查在表空间中的可用空间的百分比。与该表的最小自由空间百分比进行比较。注明任何低空间和正确运行的条件。
2.验证回滚段
状态应该是处于联机,而不是脱机状态或者满状态,要排除掉正常状态是脱机,使用一个特殊的回滚段来处理一个巨大的批处理工作
可选项:每一个数据库都有一个回滚段名称和他们预期状态的列表。
b)对每一个联机或者满回滚段(通过ID而不是名称)的当前状态,可在V$ROLLSTAT表中查询。
c)对所有的回滚段的储藏参数和名字,可在DBA_ROLLBACK_SEGS上查询。其查询的结果的状态不如V$ROLLSTAT精确,然而,如同它缺乏脱机和完全的状态时候,表现这些分别为脱机和在线。
3.标出坏的增长计划
在数据库中查找哪些耗尽资源的段或者以极快速率增长的段。这些段的存储参数需要进行调整。例如如果任何一个对象到达200作为当前的一个数量区域,升级max_extents到无限。
a) To gather daily sizing information, run daily_01.sql
运行daily_01.sql脚本可以获得每天关于大小方面的信息
b) To check current extents, run nr_extents.sql
运行nr_extents.sql脚本可以检查当前的范围。
c)查询当前表的大小信息
d)查询当前索引大小信息
e)查询增长趋势。
4.标出对象的Space-bound
Space-bound对象的的next_extents比tablespace能提供的最大的范围更大。Space-bound对象能损害数据库的性能。如果我们得到该对象,首先需要调查情形。然后我们能使用ALTER TABLESPACE<tablespace> COALESCE。否则增加另外的数据文件。
a)运行spacebound.sql脚本,如果一切都正常则不会返回任何行。
5.检查CPU、内存、网络或者磁盘资源争用过程
a)检查CPU的利用率,进入x:\web\phase2\default.htm
=>系统metrics=>CPU利用页面。400是CPU利用的最大值,因为这里有4可CPU在phxdev和phxprd机器上。如果CPU的用率在保持350有一段时间,我们就应该进行检查
(七)阅读DBA手册一个小时
(八)每日过程检查脚本
1. Free.sql
-- free.sql
-- To verify free space in tablespaces
-- Minimum amount of free space
-- document your thresholds:
-- <tablespace_name> = <amount> m
SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) /(1024*1024) ) as free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks FROM dba_free_space GROUP BY tablespace_name
2. Space.sql
-- space.sql
-- To check free, pct_free, and allocated space within a tablespace
SELECT tablespace_name, max_blocks, count_blocks, sum_free_blocks
, to_char(100*sum_free_blocks/sum_alloc_blocks, '99.99') || '%'
AS pct_free
FROM ( SELECT tablespace_name
, sum(blocks) AS sum_alloc_blocks
FROM dba_data_files
GROUP BY tablespace_name
)
, ( SELECT tablespace_name AS fs_ts_name
, max(blocks) AS max_blocks
, count(blocks) AS count_blocks
, sum(blocks) AS sum_free_blocks
FROM dba_free_space
GROUP BY tablespace_name )
WHERE tablespace_name = fs_ts_name
3. Daily_01.sql
--分析表和索引
BEGIN
dbms_utility.analyze_schema ( '&OWNER', 'ESTIMATE', NULL, 5 ) ;
END ;
4. nr_extents.sql
-- To find out any object reaching <threshold>
-- extents, and manually upgrade it to allow unlimited
-- max_extents (thus only objects we *expect* to be big
-- are allowed to become big)
SELECT e.owner, e.segment_type , e.segment_name , count(*) as nr_extents ,
s.max_extents
, to_char ( sum ( e.bytes ) / ( 1024 * 1024 ) , '999,999.90') as MB
FROM
dba_extents@phxdst e ,
dba_segments@phxdst s
WHERE e.segment_name = s.segment_name
GROUP BY e.owner, e.segment_type , e.segment_name , s.max_extents
HAVING count(*) > &THRESHOLD
OR ( ( s.max_extents - count(*) ) < &&THRESHOLD )
ORDER BY count(*) desc
5. spacebound.sql
-- spacebound.sql
-- To identify space-bound objects. If all is well, no rows are returned.
-- If any space-bound objects are found, look at value of NEXT extent
-- size to figure out what happened.
-- Then use coalesce (alter tablespace <foo> coalesce;).
-- Lastly, add another datafile to the tablespace if needed.
SELECT a.table_name, a.next_extent, a.tablespace_name
FROM all_tables a,
( SELECT tablespace_name, max(bytes) as big_chunk
FROM dba_free_space
GROUP BY tablespace_name ) f
WHERE f.tablespace_name = a.tablespace_name
AND a.next_extent > f.big_chunk
三、每周过程
(一)查找哪些违反规则的对象
For each object-creation policy (naming convention, storage parameters, etc.) have an automated check to verify that the policy is being followed.
对每一个object-creation策略(命名习惯、存储参数等等)有一个自动的检查来验证那些策略是被遵循的。
1. Every object in a given tablespace should have the exact same利for NEXT_EXTENT, which should match the tablespace default for NEXT_EXTENT. As of 12/14/98, default NEXT_EXTENT for DATAHI is 1 gig (1048576 bytes), DATALO is 500 mb (524288 bytes), and INDEXES is 256 mb (262144 bytes).
a) To check settings for NEXT_EXTENT, run nextext.sql.
b) To check existing extents, run existext.sql
2.所有的表应该有一个唯一的主键
a)检查遗失的主键,运行no_pk.sql脚本
b)检查禁止的主键,运行disPK.sql脚本。
c)所有的主键索引应该是唯一的,运行nonuPK.sql脚本来检查。
3.所有的索引应该在索引表空间中使用,运行mkrebuild_idx.sql脚本来创建。
4.模式应该在环境中是一致的,特别是在测试和生产环境中
a)运行datatype.sql脚本来检查数据类型的一致性
b)运行obj_coord.sql脚本来检查其它对象的一致性
(二).查找违反安全的策略
(三)在SQL*Net日志中检查错误和问题
1.客户端日志
2.服务器端日志
(四)对所有的历史警报日志进行存档
(五)访问一些主要厂商的主页
1. Andersen Consulting
http://www.ac.com/index.html
2. Oracle公司
http://www.oracle.com
http://technet.oracle.com
http://www.oracle.com/support
http://www.oramag.com
3. Quest Software
http://www.quests.com
4. IBM SP2
http://www.rs6000.ibm.com/sp.html
5. Sun Microsystems
<
http://www.sun.com>
(六)每周过程检查脚本
1. nextext.sql
-- To find tables that don't match the tablespace default for NEXT extent.
-- The implicit rule here is that every table in a given tablespace should
-- use the exact same value for NEXT, which should also be the tablespace's
-- default value for NEXT.
-- This tells us what the setting for NEXT is for these objects today.
SELECT segment_name, segment_type, dt.tablespace_name, ds.next_extent
FROM dba_tablespaces dt, dba_segments ds
WHERE dt.tablespace_name = ds.tablespace_name
AND dt.next_extent !=ds.next_extent
AND ds.owner = '&OWNER'
2. existext.sql
-- To check existing extents
-- This tells us what the setting for NEXT was for these objects at the
-- time the extent was allocated. If this report shows a lot of different
-- sized extents, your free space is likely to become fragmented. If so,
-- this tablespace is a candidate for reorganizing.
SELECT count(*), segment_name, segment_type, dt.tablespace_name
FROM dba_tablespaces dt, dba_extents dx
WHERE dt.tablespace_name = dx.tablespace_name
AND dt.next_extent != dx.byte AND dx.owner = '&OWNER'
GROUP BY segment_name, segment_type, dt.tablespace_name
3. No_pk.sql
-- To find tables without PK constraint
SELECT table_name
FROM all_tables
WHERE owner = '&OWNER'
MINUS
SELECT table_name
FROM all_constraints
WHERE owner = '&&OWNER'
AND constraint_type = 'P'
4. disPK.sql
-- To find out which primary keys are disabled
SELECT owner, constraint_name, table_name, status
FROM all_constraints
WHERE owner = '&OWNER' AND status = 'DISABLED' AND constraint_type = 'P'
5. nonuPK.sql
-- To find tables with nonunique XPKs
SELECT index_name, table_name, uniqueness
FROM
all_indexes@PHXDSD
WHERE index_name like '&PKNAME%'
AND owner = '&OWNER' AND uniqueness = 'NONUNIQUE'
6. mkrebuild_idx.sql
-- Rebuild indexes to have correct storage parameters
SELECT 'alter index ' || index_name || ' rebuild '
, 'tablespace INDEXES storage ( initial 256 K next 256 K ) ; '
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 )
)
AND owner = '&OWNER'
7. datatype.sql
-- To check datatype consistency between two environments
SELECT
table_name,
column_name,
data_type,
data_length,
data_precision,
data_scale,
nullable
FROM all_tab_columns -- first environment
WHERE owner = '&OWNER'
MINUS
SELECT
table_name,
column_name,
data_type,
data_length,
data_precision,
data_scale,
nullable
FROM
all_tab_columns@&my_db_link -- second environment
WHERE owner = '&OWNER2'
order by table_name, column_name
8. obj_coord.sql
-- To find out any difference in objects between two instances
SELECT object_name, object_type
FROM user_objects
MINUS
SELECT object_name, object_type
FROM
user_objects@&my_db_link
四、每月过程
(一)检查有害的增长率
1.在段增长中检查变化,比较以前的报告来验证降低数据库性能的增长率的段
(二)检查优化时机
1.检查普通Oracle优化点,诸如cache hit ratio(内存使用率),闩锁争用和其它与内存管理有关的点。同以前的报告进行比较,找出有害的趋势或者确定最近执行优化调整后对系统有影响的部分。
(三)查找I/O争用
1.经常检查活动的数据文件,同过去的输出量进行比较来确定将可能引起争用趋势。
(四)检查碎片
1.检查碎片,例如行链接等
(五)为未来性能进行设计
1.从Oracle和操作系统中对CPU,内存,网络和磁盘的使用情况报告进行比较。从而来确定在将来可能导致的任何一种资源的争用趋势。
2.比较维修水平协议的性能(Service Level Agreement)趋势来看什么时候,系统运行将会出界。
(六)执行优化和维护
1.进行适当的调整,来避免对系统资源的争用。包括预定时间的停机运行或者额外资源请求。