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