<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30263044</id><updated>2012-02-16T20:35:16.197-05:00</updated><category term='cursor variable'/><category term='statspack'/><category term='package'/><category term='semi-join'/><category term='resource manager'/><category term='bug'/><category term='anti-join'/><category term='shared pool'/><category term='ps'/><category term='SQLPATH'/><category term='upgrade'/><category term='RLS'/><category term='relocate data files'/><category term='TAF'/><category term='self join'/><category term='Plan Guide'/><category term='restore'/><category term='configuration'/><category term='FGA'/><category term='Solaris'/><category term='email'/><category term='pfile'/><category term='AWR'/><category term='database link'/><category term='OCR'/><category term='sort'/><category term='patch'/><category term='OCP'/><category term='ORA-01722'/><category term='index fast full scan'/><category term='SSH'/><category term='initialization parameter'/><category term='nologging'/><category term='lock'/><category term='ref cursor'/><category term='connect by'/><category term='streams'/><category term='ROWID'/><category term='ASSM'/><category term='exp'/><category term='ASM'/><category term='TKPROF'/><category term='Sql Profiles'/><category term='interview'/><category term='row_number()'/><category term='ORA-14047'/><category term='VMware'/><category term='v$session_longops'/><category term='data pump'/><category term='library cache lock'/><category term='v$sqlarea'/><category term='data type'/><category term='DBA_TAB_STATISTICS'/><category term='cluster'/><category term='Database Control'/><category term='alter table'/><category term='v$lock'/><category term='listener.ora'/><category term='data files'/><category term='materialized view'/><category term='v$pwfile_user'/><category term='Runstat'/><category term='archived log'/><category term='SharePlex'/><category term='duplicate row'/><category term='scripts'/><category term='update'/><category term='recovery'/><category term='transaction'/><category term='standby'/><category term='IOT'/><category term='Cloud Computing'/><category term='parse'/><category term='startup'/><category term='SYSDATE'/><category term='data dictionary'/><category term='RMAN'/><category term='online redifinition'/><category term='join'/><category term='tip'/><category term='clone'/><category term='DBA command syntax'/><category term='unix'/><category term='DBNEWID'/><category term='boobooke'/><category term='latch'/><category term='index'/><category term='hanganalyze'/><category term='cancel-based recovery'/><category term='fine grained access'/><category term='DBMS_METADATA'/><category term='ORA-00600 [20022]'/><category term='kopm$'/><category term='replication'/><category term='ORA-01652'/><category term='bulk collect'/><category term='execution plan'/><category term='installation'/><category term='tempfile'/><category term='SQL'/><category term='PL/SQL Package'/><category term='transaction read only'/><category term='ORA-27101'/><category term='PL/SQL'/><category term='alert log'/><category term='storage'/><category term='Oracle Net'/><category term='TO_DATE'/><category term='systemdump'/><category term='sql tuning'/><category term='logminer'/><category term='troubleshooting'/><category term='raw device'/><category term='RAC'/><category term='cursor'/><category term='v$sql'/><category term='AWK'/><category term='01 - Performance Tunning'/><category term='ORA-01555'/><category term='video lecture'/><category term='relink'/><category term='wait event'/><category term='backup'/><category term='autotrace'/><category term='DBA script'/><category term='oradebug'/><category term='dbverify'/><category term='shell scripting'/><category term='DBMS_JOB'/><category term='CentOS'/><category term='sequence'/><category term='RBO'/><category term='buffer hit ratio'/><category term='parallel execution'/><category term='performance troubleshooting'/><category term='schedular'/><category term='regular expression'/><category term='ORA-27102'/><category term='Segment Advisor'/><category term='I/O'/><category term='VCS'/><category term='database design'/><category term='reference'/><category term='concepts'/><category term='transaction isolation level'/><category term='partition'/><category term='rank'/><category term='table function'/><category term='performance tunning'/><category term='processstate dump'/><category term='snapshot too old'/><category term='test case'/><category term='DBA_TAB_COL_STATISTICS'/><category term='imp'/><category term='mistake'/><category term='case when'/><category term='SQL Server'/><category term='Oracle internal'/><category term='reorganize'/><category term='DataGuard'/><category term='collection'/><category term='Oracle Advanced Replication'/><category term='errorstack dump'/><category term='MISC'/><category term='virtual private database'/><category term='FORALL'/><category term='DBMS_STATS'/><category term='incarnation'/><category term='recyclebin'/><category term='DBA General'/><category term='flashback'/><category term='control files'/><category term='session_cached_cursors'/><category term='DBID'/><category term='privilege'/><category term='index rebuild'/><category term='DB Console'/><category term='CBO'/><category term='Load Balancing'/><category term='trigger'/><category term='SQL Plus'/><category term='intelligent agent'/><category term='Java'/><category term='constraint'/><category term='bind variable'/><category term='direct-path insert'/><category term='library cache pin'/><category term='SQL_TRACE'/><category term='DBMS_SCHEDULER'/><category term='block corruption'/><category term='SQL Loader'/><category term='tablespace'/><category term='temporary tablespace'/><category term='redo log'/><category term='cursor_sharing'/><category term='SQL Function'/><category term='deadlock'/><category term='transportable tablespace'/><title type='text'>Oracle Study Notes by Denis</title><subtitle type='html'>What have I learned about Oracle today?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default?start-index=101&amp;max-results=100'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>382</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30263044.post-9039621915926672143</id><published>2012-01-17T11:01:00.000-05:00</published><updated>2012-01-17T11:01:26.748-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='case when'/><title type='text'>Using CASE WHEN statement</title><content type='html'>Suggested dev team to change the following SQL:&lt;br /&gt;&lt;br /&gt;&lt;pre class "sql" name="code"&gt;&lt;br /&gt;update t1 &lt;br /&gt;set b=(SELECT    &lt;br /&gt;               decode(count(*),0,'N','Y')&lt;br /&gt;          FROM t2 &lt;br /&gt;         WHERE t1.id = t2.id);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to the following structruce:&lt;br /&gt;&lt;br /&gt;&lt;pre class "sql" name="code"&gt;update t1  set b= case when  &lt;br /&gt;                     exists ( select null from t2 where t1.id =t2.id  )&lt;br /&gt;                       then 'Y' &lt;br /&gt;                       else 'N' end;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-9039621915926672143?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/9039621915926672143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=9039621915926672143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/9039621915926672143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/9039621915926672143'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2012/01/using-case-when-statement.html' title='Using CASE WHEN statement'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8106716638006488842</id><published>2011-12-21T11:29:00.000-05:00</published><updated>2011-12-21T11:29:23.946-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='TO_DATE'/><title type='text'>Implicit conversion of a character string to Oracle DATE type is dangerous</title><content type='html'>Typically TO_DATE function is used by taking a char as the first argument and 'fmt' as the second argument. According to Oracle doc:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;TO_DATE converts char of CHAR, VARCHAR2, NCHAR, or NVARCHAR2 datatype to a value of DATE datatype. The fmt is a datetime model format specifying the format of char. If you omit fmt, then char must be in the default date format. If fmt is J, for Julian, then char must be an integer.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;It should be pointed out that omitting the fmt could be a very bad practise. If the character string does not match the default format, Oracle does not necessarily throw error in some cases. For example, I have executed the following commands in the SQL* Plus:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt;alter session set nls_date_format='yyyy-mm-dd HH24:mi:ss';&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select count(*) from  dba_objects where created between '1-Nov-2011' and '14-Nov-2011';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         0&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select to_date('1-Nov-2011') from dual;&lt;br /&gt;&lt;br /&gt;TO_DATE('1-NOV-2011&lt;br /&gt;-------------------&lt;br /&gt;0001-11-20 11:00:00&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;While the correct results should be as follows:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt;alter session set nls_date_format='dd-Mon-yyyy HH24:mi:ss';&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select count(*) from  dba_objects where created between '1-Nov-2011' and '14-Nov-2011';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;       171&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select to_date('1-Nov-2011') from dual;&lt;br /&gt;&lt;br /&gt;TO_DATE('1-NOV-2011'&lt;br /&gt;--------------------&lt;br /&gt;01-Nov-2011 00:00:00&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have learned this in a pretty hard way during a sql tuning effort. Many hours have been spent before I realized that the weired results were due to this implicit conversion "bug". ( See &lt;a href="http://www.freelists.org/post/oracle-l/Huge-difference-between-sqlplus-and-sqldeveloper-sorting-in-memory-vs-disk,7"&gt;http://www.freelists.org/post/oracle-l/Huge-difference-between-sqlplus-and-sqldeveloper-sorting-in-memory-vs-disk,7&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8106716638006488842?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8106716638006488842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8106716638006488842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8106716638006488842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8106716638006488842'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/12/implicit-conversion-of-character-string.html' title='Implicit conversion of a character string to Oracle DATE type is dangerous'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1571607335202674063</id><published>2011-11-27T21:11:00.000-05:00</published><updated>2011-11-27T21:11:07.372-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reorganize'/><category scheme='http://www.blogger.com/atom/ns#' term='index rebuild'/><title type='text'>Reorganize Table and Index</title><content type='html'>I manage a database for the retail ordering application. The orders that were completed 90 days ago are subject to archiving. Due to various reasons there were about 80 million archiving backlog about two months ago. Since the backlog is caught up now, reorganization of the schema objects is desirable in order to reclaim space.&lt;br /&gt;&lt;br /&gt;First of all, I need to estimate how much space can be saved potentially after the reorganization. For table segment, I use DBMS_SPACE.create_table_cost to estimate the size after reorganization. Given the number of row and average row size and the target tablespace, the following script can be used to estimate the size if the table is moved to the target tablespace.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;--  script: tabsize_est.sql &lt;br /&gt;--  get the avg row size and row cnt from analyze job&lt;br /&gt;--  dba_tables&lt;br /&gt;-- @tabsize_est 'table_size' 100   10000000&lt;br /&gt;&lt;br /&gt;set verify off feedback off&lt;br /&gt;set SERVEROUTPUT ON&lt;br /&gt;DECLARE&lt;br /&gt;  l_ddl          VARCHAR2(500);&lt;br /&gt;  l_used_bytes   NUMBER;&lt;br /&gt;  l_alloc_bytes  NUMBER;&lt;br /&gt;  l_message      varchar2(100);&lt;br /&gt;BEGIN&lt;br /&gt;  -- Estimate the size of a new table on the USERS tablespace.&lt;br /&gt;  l_message := '&amp;amp;1';&lt;br /&gt;  DBMS_SPACE.create_table_cost (&lt;br /&gt;            tablespace_name =&amp;gt; 'TTQ_ORD_DATA_4',&lt;br /&gt;            avg_row_size    =&amp;gt; &amp;amp;2,&lt;br /&gt;            row_count       =&amp;gt; &amp;amp;3 ,&lt;br /&gt;            pct_free        =&amp;gt; 10 ,&lt;br /&gt;            used_bytes      =&amp;gt; l_used_bytes,&lt;br /&gt;            alloc_bytes     =&amp;gt; l_alloc_bytes);&lt;br /&gt;&lt;br /&gt;  DBMS_OUTPUT.put_line (  l_message  || ' Mbytes_allocated= ' || l_alloc_bytes/1024/1024 || ' Mbytes');&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I use the following script to generate command for each table:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;--  script: tabsize_est_gen.sql&lt;br /&gt;--  purpose: generate &lt;br /&gt;select '@@tabsize_est ' ||''' ' || t.owner || ' ' || t.table_name || ' ' || t.tablespace_name || ' ' &lt;br /&gt;     || trunc(s.bytes/1024/1024)  || ''' '||  t.avg_row_len || ' ' || t.num_rows&lt;br /&gt;from&lt;br /&gt;dba_segments s,&lt;br /&gt;dba_tables t&lt;br /&gt;where s.owner=t.owner&lt;br /&gt;and  s.segment_name=t.table_name&lt;br /&gt;and t.owner in  ('TTQ_ORD')&lt;br /&gt;and  s.bytes &amp;gt; 1000000000&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output from above script looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;@@tabsize_est ' TTQ_ORD CUST_ORDER_ACTIVITY TTQ_ORD_DATA_2 2611' 139 15874503&lt;br /&gt;@@tabsize_est ' TTQ_ORD CUST_HIGH_RISK_20110425 TTQ_ORD_DATA_2 1349' 82 14246227&lt;br /&gt;@@tabsize_est ' TTQ_ORD ENCDEC_MIGRATION TTQ_ORD_DATA_4 1400' 29 2257790&lt;br /&gt;@@tabsize_est ' TTQ_ORD ACCOUNT_COMMENTS TTQ_ORD_DATA_4 13600' 146 82486887&lt;br /&gt;@@tabsize_est ' TTQ_ORD BUNDLE_RECON_TRACKING TTQ_ORD_DATA_3 7060' 957 6294040&lt;br /&gt;@@tabsize_est ' TTQ_ORD ISP_MESSAGE_TRACKING TTQ_ORD_DATA_3 30480' 815 31089530&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then, executing above commands, I can obtain current and estimated table segment size as shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;TTQ_ORD CUST_ORDER_ACTIVITY TTQ_ORD_DATA_2 2611 Mbytes_allocated= 2600 Mbytes&lt;br /&gt;TTQ_ORD CUST_HIGH_RISK_20110425 TTQ_ORD_DATA_2 1349 Mbytes_allocated= 1400 Mbytes&lt;br /&gt;TTQ_ORD ENCDEC_MIGRATION TTQ_ORD_DATA_4 1400 Mbytes_allocated= 200 Mbytes&lt;br /&gt;TTQ_ORD ACCOUNT_COMMENTS TTQ_ORD_DATA_4 13600 Mbytes_allocated= 13600 Mbytes&lt;br /&gt;TTQ_ORD BUNDLE_RECON_TRACKING TTQ_ORD_DATA_3 7060 Mbytes_allocated= 7200 Mbytes&lt;br /&gt;TTQ_ORD ISP_MESSAGE_TRACKING TTQ_ORD_DATA_3 30480 Mbytes_allocated= 30400 Mbytes&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To estimate the size of index segment after rebuild, I use a script called index_est_proc_2.sql by Joanathan Lewis (&lt;a href="http://jonathanlewis.wordpress.com/index-sizing/"&gt;http://jonathanlewis.wordpress.com/index-sizing/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I use EXCEL to calcuate the size difference between the estimated size and current size for each index and table. As a result I can estimate the total space gain. Of course when I plan to do reoraganization, I can start with the segment which would give the most space gain.&lt;br /&gt;&lt;br /&gt;The space gain estimated is at tabespace level. To actually release the space at OS level, the datafile needs to be shrinked. For this it is very useful to know which segments reside at the end of datafile. Those segments should be moved first to allow the datafile shrikable.&lt;br /&gt;&lt;br /&gt;The following script is used to list the segment in each data file ordered by its max(block_id). The segments that reside at the end of datafile should have large max(block_id).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- find segment at the end of the data files&lt;br /&gt;-- so if this segment is removed, the data file could be resized down&lt;br /&gt;&lt;br /&gt;spool shrinkdf_&amp;amp;tbs..log&lt;br /&gt;&lt;br /&gt;col sum_mbytes format 999,999&lt;br /&gt;col  diff format 999,999,999&lt;br /&gt;&lt;br /&gt;select name from v$database;&lt;br /&gt;&lt;br /&gt;break on file_id skip 1&lt;br /&gt;select file_id, segment_name, sum_mbytes, count_blocks, max_block_id, &lt;br /&gt;max_block_id -  lead(max_block_id,1) over (partition by file_id order by max_block_id desc )  diff&lt;br /&gt;from&lt;br /&gt;(&lt;br /&gt;select /*+ RULE */ &lt;br /&gt;file_id&lt;br /&gt;, segment_name&lt;br /&gt;, sum(bytes/1014/1024)  sum_mbytes&lt;br /&gt;, count(block_id) count_blocks&lt;br /&gt;, max(block_id) max_block_id&lt;br /&gt;from dba_extents&lt;br /&gt;where tablespace_name = upper('&amp;amp;&amp;amp;tbs') &lt;br /&gt;group by file_id, segment_name&lt;br /&gt;order by 1, 5 desc,4&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;spool off&lt;br /&gt;&lt;br /&gt;undef tbs&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sample outout from the above script looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;FILE_ID SEGMENT_NAME                   SUM_MBYTES COUNT_BLOCKS MAX_BLOCK_ID         DIFF&lt;br /&gt;---------- ------------------------------ ---------- ------------ ------------ ------------&lt;br /&gt;       227 ORDER_TRANS                         1,818            9      1868809      128,000&lt;br /&gt;           AUDIT_TRAIL                         1,010            5      1740809       25,600&lt;br /&gt;           ORD_ADDRESS                           808            4      1715209       51,200&lt;br /&gt;           MASTER_ACCOUNT                        202            1      1664009      179,200&lt;br /&gt;           ORD_TRANS_DETAILED_STATUS             202            1      1484809       51,200&lt;br /&gt;           ORDER_MASTER                          202            1      1433609      153,600&lt;br /&gt;           MASTER_SERVICE                        202            1      1280009       25,600&lt;br /&gt;           ACCOUNT_HISTORY                       202            1      1254409       25,600&lt;br /&gt;           ACCOUNT_COMMENTS                      202            1      1228809       51,200&lt;br /&gt;           ORD_ACCOUNT                           202            1      1177609       51,200&lt;br /&gt;           SUPP_HISTORY                          202            1      1126409      102,400&lt;br /&gt;           CREDIT_CHECK                          202            1      1024009      153,600&lt;br /&gt;           ORD_CONTACT                           404            2       870409       25,600&lt;br /&gt;           ORD_TRANS_NOTES_HISTORY               404            2       844809      102,400&lt;br /&gt;           ORD_DSL                               404            2       742409&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It is clear that for the datafile with file_id=227, ORDER_TRANS is at the end, followed by AUDIT_TRAIL. &lt;br /&gt;&lt;br /&gt;Finally, the following script can be used to generate the resize statement:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;rem  script: red_df.sql &lt;br /&gt;rem &lt;br /&gt;rem  Purpose: This gives the Total size of datafiles in a tablespace&lt;br /&gt;rem         and also the size to which it can be reduced.&lt;br /&gt;rem     It generated rdf.log spool file with commands to resize datafiles&lt;br /&gt;rem  Usage: @red_df.sql &amp;lt;TABLESPACE&amp;gt;&lt;br /&gt;rem &lt;br /&gt;rem  Note: I got this script from a colleague but I once saw this script in AskTom website &lt;br /&gt;&lt;br /&gt;set verify off&lt;br /&gt;&lt;br /&gt;col tsname  format         a24    justify c heading 'Tablespace'&lt;br /&gt;col nfrags  format     9,999,990  justify c heading 'Free|Frags'&lt;br /&gt;col mxfrag  format   999,990.999  justify c heading 'Largest|Free Frag'&lt;br /&gt;col totsiz  format 9,999,990.999  justify c heading 'Total|Mbytes'&lt;br /&gt;col avasiz  format 9,999,990.999  justify c heading 'Available|Mbytes'&lt;br /&gt;col pctusd  format       990.99   justify c heading 'Percent|Used'&lt;br /&gt;&lt;br /&gt;set pagesize 200&lt;br /&gt;set linesize 120&lt;br /&gt;&lt;br /&gt;select&lt;br /&gt;total.tablespace_name                       tsname,&lt;br /&gt;count(free.bytes)                           nfrags,&lt;br /&gt;round(nvl(max(free.bytes)/1048576,0),2)              mxfrag,&lt;br /&gt;total.bytes/1048576                         totsiz,&lt;br /&gt;round(nvl(sum(free.bytes)/1048576,0),2)              avasiz,&lt;br /&gt;round((1-nvl(sum(free.bytes),0)/total.bytes)*100,2)  pctusd&lt;br /&gt;from&lt;br /&gt;(select tablespace_name, sum(bytes) bytes&lt;br /&gt;from dba_data_files&lt;br /&gt;where tablespace_name = upper('&amp;amp;1')&lt;br /&gt;group by tablespace_name)  total,&lt;br /&gt;dba_free_space  free&lt;br /&gt;where&lt;br /&gt;total.tablespace_name = free.tablespace_name(+)&lt;br /&gt;and total.tablespace_name = upper('&amp;amp;1')&lt;br /&gt;group by&lt;br /&gt;total.tablespace_name,&lt;br /&gt;total.bytes;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;set verify off&lt;br /&gt;set linesize 150&lt;br /&gt;set echo off&lt;br /&gt;&lt;br /&gt;column file_name format a60 word_wrapped&lt;br /&gt;column smallest format 999,990 heading "Smallest|Size|Poss."&lt;br /&gt;column currsize format 999,990 heading "Current|Size"&lt;br /&gt;column savings format 999,990 heading "Poss.|Savings" &lt;br /&gt;break on report&lt;br /&gt;compute sum of savings on report&lt;br /&gt;&lt;br /&gt;column value new_val blksize&lt;br /&gt;select value from v$parameter where name = 'db_block_size'&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;select file_name,&lt;br /&gt;ceil( (nvl(hwm,1)*&amp;amp;&amp;amp;blksize)/1024/1024 ) smallest, &lt;br /&gt;ceil( blocks*&amp;amp;&amp;amp;blksize/1024/1024) currsize,&lt;br /&gt;ceil( blocks*&amp;amp;&amp;amp;blksize/1024/1024) -&lt;br /&gt;ceil( (nvl(hwm,1)*&amp;amp;&amp;amp;blksize)/1024/1024 ) savings&lt;br /&gt;from dba_data_files a,&lt;br /&gt;( select file_id, max(block_id+blocks-1) hwm &lt;br /&gt;from dba_extents&lt;br /&gt;group by file_id ) b&lt;br /&gt;where a.file_id = b.file_id(+)&lt;br /&gt;and a.tablespace_name = upper('&amp;amp;1')&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;spool rdf.log&lt;br /&gt;column cmd format a75 word_wrapped&lt;br /&gt;set pagesize 4000&lt;br /&gt;&lt;br /&gt;select 'alter database datafile '''||file_name||''' resize ' ||&lt;br /&gt;ceil( (nvl(hwm,1)*&amp;amp;&amp;amp;blksize)/1024/1024 ) || 'm;' cmd &lt;br /&gt;from dba_data_files a,&lt;br /&gt;( select file_id, max(block_id+blocks-1) hwm&lt;br /&gt;from dba_extents&lt;br /&gt;group by file_id ) b&lt;br /&gt;where a.file_id = b.file_id(+)&lt;br /&gt;and ceil( blocks*&amp;amp;&amp;amp;blksize/1024/1024) - &lt;br /&gt;ceil( (nvl(hwm,1)*&amp;amp;&amp;amp;blksize)/1024/1024 ) &amp;gt; 0&lt;br /&gt;and a.tablespace_name = upper('&amp;amp;1')&lt;br /&gt;/&lt;br /&gt;spool off&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1571607335202674063?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1571607335202674063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1571607335202674063' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1571607335202674063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1571607335202674063'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/11/reorganize-table-and-index.html' title='Reorganize Table and Index'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-4785926393672173801</id><published>2011-11-07T08:52:00.001-05:00</published><updated>2011-11-07T08:56:44.124-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Cloud Computing and DBA career</title><content type='html'>Recently, in reply to&lt;a href="http://www.mitbbs.com/article_t/Database/31155319.html"&gt; a question in the MITBBS database forum( in Chinese)&lt;/a&gt; –“Will the DBA career become down-hill and the future dimmed with the growth of Cloud Computing and NoSQL movement ?”, I made the following comments: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;My understanding till today: NOSQL is just a special purpose database (or data model), it cannot replace traditional general purpose RDBMS. (The market of NoSQL is small). It has little impact on DBA’s career.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Cloud computing provides more choices for a company for its IT infrastructure. Basically three choices: traditional in-house IT； outsource IT totally ( i.e. to public cloud provider, pay-per-use ); consolidating in house IT infrastructure on private cloud; or maybe the fourth choice, some kind of mixing of all above. I think the demanding for DBA role (or system admin, network, storage admin in this regard) will be reduced when a company move part (or all) of its IT to cloud (either public or private). &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Demanding for traditional DBA role is not only being affected by emerging of cloud computing. It has been affected by more and more self-managing and automation of RDBMS anyway ( In USA that role is being outsourced to India and China etc) &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Obviously if there is a trend to move to cloud with significance, there will be a demanding for “cloud system/support administrator” It should not so difficult for a true DBA ( means he is always willing to learn new things) to transition his role to a cloud administrator. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After making the comments, I googled more and found the following article interesting: “The tech jobs that the cloud will eliminate” ( &lt;a href="http://www.infoworld.com/d/adventures-in-it/tech-jobs-cloud-will-eliminate-008"&gt;http://www.infoworld.com/d/adventures-in-it/tech-jobs-cloud-will-eliminate-008&lt;/a&gt;&amp;nbsp;). There is also a two-part article describing Cloud IT roles here: &lt;a href="http://open.eucalyptus.com/learn/cloud-it-roles"&gt;http://open.eucalyptus.com/learn/cloud-it-roles&lt;/a&gt;. It indicated a DBA’s skill-set is extendable to assume Cloud Data Architect role. &lt;br /&gt;&lt;br /&gt;I wrote a Perl script to non-interactively search dice.com to get the count of job listing with respect to some keywords. I scheduled to do this count every day. Hope this will give me some kind of insights into the trend about the DBA job market and the impact by Cloud Computing.&lt;br /&gt;&lt;br /&gt;For example, the output of the script of yesterday looked like:&lt;br /&gt;&lt;br /&gt;2011-11-06 07:59 System+Administrator 5688&lt;br /&gt;2011-11-06 07:59 DBA 2799&lt;br /&gt;2011-11-06 07:59 Oracle+DBA 1570&lt;br /&gt;2011-11-06 07:59 Cloud+Administrator 277&lt;br /&gt;2011-11-06 07:59 Cloud+DBA 74&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-4785926393672173801?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/4785926393672173801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=4785926393672173801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/4785926393672173801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/4785926393672173801'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/11/cloud-computing-and-dba-career.html' title='Cloud Computing and DBA career'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-6063176484893734698</id><published>2011-10-12T22:23:00.002-04:00</published><updated>2011-10-13T08:34:54.189-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - Find out Transactions per second etc from DM_OS_PERFORMANCE_COUNTERS</title><content type='html'>In a whitepaper named &lt;a href="http://sqlcat.com/sqlcat/b/whitepapers/archive/2011/07/05/diagnosing-and-resolving-latch-contention-on-sql-server.aspx"&gt;"Diagnosing and Resolving Latch Contention on SQL Server"&lt;/a&gt;,&amp;nbsp; a script is provided to snap DM_OS_WAITE_STATS view to calculate wait over a period of time. In this post, based on the same idea,&amp;nbsp; I developed a script to snap the DM_OS_PERFORMANCE_COUNTERS view in order to find out transactions/sec for each database. It is also easy to be modified to get other performance counters.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- script: snap_perf_conuter.sql&lt;br /&gt;&lt;br /&gt;/* Snapshot the performance counters (such as transaction/sec) on sys.dm_os_performance_counters&lt;br /&gt;   and store in a table so that they can be used to compute a per second value.&lt;br /&gt;      This script is only applicable to Cntr_Type = 272696576. Different Cntr_type is explained&lt;br /&gt;      in this blog:&lt;br /&gt;        http://rtpsqlguy.wordpress.com/2009/08/11/sys-dm_os_performance_counters-explained/&lt;br /&gt;** Data is maintained in tempdb so the connection must persist between each execution** &lt;br /&gt;**alternatively this could be modified to use a persisted table in tempdb. if that is changed code should be included to clean up the table at some point.**&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;use tempdb&lt;br /&gt;go&lt;br /&gt;declare @current_snap_time datetime&lt;br /&gt;declare @previous_snap_time datetime&lt;br /&gt;-- declare @l_counter_name  nchar(128)&lt;br /&gt;declare @sqlcmd nvarchar(4000)&lt;br /&gt;declare @l_counter_name  nvarchar(2000)&lt;br /&gt;&lt;br /&gt;-- modify the counter_name as needed, some examples provided &lt;br /&gt;set @l_counter_name  = '''transactions/sec'''&lt;br /&gt;-- set @l_counter_name = '''Batch Requests/sec'''                                                                                                              &lt;br /&gt;-- set @l_counter_name= '''Page Splits/sec'',''Page lookups/sec'''&lt;br /&gt;-- set @l_counter_name = '''transactions/sec'',''Batch Requests/sec'''                                                                                                              &lt;br /&gt;-- set @l_counter_name='''Page compression attempts/sec'',''Page Deallocations/sec'',''Page lookups/sec'',''Page reads/sec'',''Page Splits/sec'',''Page writes/sec'',''Pages Allocated/sec'',''Pages compressed/sec'''&lt;br /&gt;-- set @l_counter_name = '''Logins/sec'',''Logouts/sec'''                                                                                              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if not exists(select name from tempdb.sys.sysobjects where name like '#_perf_counter%') &lt;br /&gt;create table #_perf_counter ( "object_name" nchar(128) ,counter_name nchar(128) ,instance_name nchar(128) ,cntr_value bigint ,cntr_type int ,snap_time datetime&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;set @sqlcmd ='&lt;br /&gt;insert into #_perf_counter (&lt;br /&gt;object_name&lt;br /&gt;,counter_name&lt;br /&gt;,instance_name&lt;br /&gt;,cntr_value&lt;br /&gt;,cntr_type&lt;br /&gt;,snap_time&lt;br /&gt;)&lt;br /&gt;select&lt;br /&gt;OBJECT_NAME&lt;br /&gt;,counter_name&lt;br /&gt;,instance_name&lt;br /&gt;,cntr_value&lt;br /&gt;,cntr_type&lt;br /&gt;,getdate()&lt;br /&gt;from sys.dm_os_performance_counters&lt;br /&gt;where counter_name in (' +  @l_counter_name +  ')'&lt;br /&gt;&lt;br /&gt;exec sp_executesql @sqlcmd&lt;br /&gt;&lt;br /&gt;--get the previous and current collection point&lt;br /&gt;select top 1 @previous_snap_time = snap_time from #_perf_counter where snap_time &amp;lt; (select max(snap_time) from #_perf_counter) order by snap_time desc&lt;br /&gt;&lt;br /&gt;select @current_snap_time = max(snap_time) from #_perf_counter&lt;br /&gt;&lt;br /&gt;-- debug&lt;br /&gt;select @current_snap_time end_time, @previous_snap_time start_time&lt;br /&gt;&lt;br /&gt;set @sqlcmd='&lt;br /&gt;select&lt;br /&gt;e.object_name&lt;br /&gt;,e.counter_name&lt;br /&gt;,e.instance_name&lt;br /&gt;,(e.cntr_value -s.cntr_value) / DATEDIFF(ss, s.snap_time, e.snap_time)  Per_Sec_Value &lt;br /&gt;--, s.snap_time as [start_time] &lt;br /&gt;--, e.snap_time as [end_time] , DATEDIFF(ss, s.snap_time, e.snap_time) as [seconds_in_sample] from #_perf_counter e inner join  &lt;br /&gt;( select * from #_perf_counter   &lt;br /&gt;where snap_time ='''+ convert(varchar(100), @previous_snap_time, 21) + ''' ) s on ( e.instance_name=s.instance_name and e.object_name = s.object_name and e.instance_name=s.instance_name &lt;br /&gt;   and e.counter_name=s.counter_name)&lt;br /&gt;where e.snap_time= '''+  convert(varchar(100), @current_snap_time, 21) + ''' and e.counter_name in (' +  @l_counter_name + ')order by Per_Sec_value desc'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;exec sp_executesql @sqlcmd&lt;br /&gt;&lt;br /&gt;--clean up table&lt;br /&gt; delete from #_perf_counter&lt;br /&gt; where snap_time = @previous_snap_time&lt;br /&gt;&lt;br /&gt;-----------------  end of script  ----&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Sample output (edited) : &lt;br /&gt;&lt;pre class="sql" name="code"&gt;end_time                start_time&lt;br /&gt;----------------------- -----------------------&lt;br /&gt;2011-10-12 18:47:25.173 2011-10-12 18:46:23.190&lt;br /&gt;&lt;br /&gt;(1 row(s) affected)&lt;br /&gt;&lt;br /&gt;object_name                         counter_name     instance_name               Per_Sec_Value        seconds_in_sample&lt;br /&gt;----------------------------------- ---------------- --------------------------- -------------------- -----------------&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     _Total                      296                  62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     tempdb                      126                  62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     Orderplacement              100                  62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     master                      60                   62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     Distributor                 2                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     NOCVDB                      1                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     DBADB                       1                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     msdb                        1                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     tempdbx                     0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     spot_admin                  0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     ASPState                    0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     APPCACHELOG                 0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     VGISessions                 0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     SSNSDB                      0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     SSNS4DB                     0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     copper                      0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     VZWPCAT                     0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     model                       0                    62&lt;br /&gt;MSSQL$FPSEFSDB_OP2:Databases        Transactions     mssqlsystemresource         0                    62&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-6063176484893734698?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/6063176484893734698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=6063176484893734698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6063176484893734698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6063176484893734698'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/10/sql-server-find-out-transactions-per.html' title='SQL Server - Find out Transactions per second etc from DM_OS_PERFORMANCE_COUNTERS'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-4165590233363816010</id><published>2011-10-08T17:59:00.003-04:00</published><updated>2011-10-08T19:44:26.071-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deadlock'/><category scheme='http://www.blogger.com/atom/ns#' term='lock'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - Troubleshooting Deadlock</title><content type='html'>There is a &lt;a href="http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=16633"&gt;thread&lt;/a&gt;&amp;nbsp; in the SQLTeam forum that describes a deadlock scenario: &lt;br /&gt;The application inserts a row into a status table. A trigger on the table fires so that when the status id inserted is a certain value it will call a stored procedure, which inserts a row into an accounting table. This whole thing is wrapped in a transaction so it should all be getting rolled back when there are errors. On occasion two threads of the application insert into the status table at nearly the same millisecond, and when both end up calling the stored procedure to insert into the accounting table a deadlock occurs and one is killed. &lt;br /&gt;&lt;br /&gt;Two important details were unveiled during the discussion: &lt;br /&gt;(1) the whole transaction took place with isolation level set to be serializable &lt;br /&gt;(2) in the stored procedure, there is an existence check query doing full table scan&amp;nbsp; on the status table before inserting the row into it.&lt;br /&gt;&lt;br /&gt;I try to simulate the deadlock situation for my own better understanding, especially this is the first time I know how to use DBCC trace to troubleshooting deadlock.&amp;nbsp;It is a good practise.&lt;br /&gt;&lt;br /&gt;First of all, I created the following test table:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- create a test table&lt;br /&gt;&lt;br /&gt;USE testdata&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;IF OBJECT_ID ( 'mytable', 'U' ) IS NOT NULL&lt;br /&gt;DROP TABLE mytable;&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE mytable&lt;br /&gt; (&lt;br /&gt;  id  INT,&lt;br /&gt;  val INT,&lt;br /&gt;  padding VARCHAR(4000),&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;create unique clustered index index01&lt;br /&gt;on mytable(id);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 1, 1, REPLICATE('a', 4000);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 2, 2, REPLICATE('a', 4000);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 3, 3, REPLICATE('a', 4000);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 4, 4, REPLICATE('a', 4000);&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;delete from mytable where id in (2,4);&lt;br /&gt;&lt;br /&gt;-- show the location of rows&lt;br /&gt;select&lt;br /&gt;       a.%%physloc%%                          AS Address,&lt;br /&gt;       sys.fn_PhysLocFormatter(a.%%physloc%%) AS AddressText,&lt;br /&gt;       a.id&lt;br /&gt;FROM   mytable a&lt;br /&gt;ORDER BY 2;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The remaining two rows in the mytable are located in different page as shown below: &lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Address    AddressText            id&lt;br /&gt;---------- ---------------------- -----------&lt;br /&gt;0x99000000 (1:153:0)                        1&lt;br /&gt;0xFF420000 (1:17151:0)                      3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Secondly I turn on the deadlock trace:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;1&amp;gt; DBCC traceon(1222, -1)&lt;br /&gt;2&amp;gt; go&lt;br /&gt;DBCC execution completed. If DBCC printed error messages, contact your system administrator.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I run the following two scripts in two different SSMS windows:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- script: ins_1.sql &lt;br /&gt;use testdata&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;set transaction isolation level serializable&lt;br /&gt;begin tran&lt;br /&gt;go&lt;br /&gt;if not exists (select id from mytable where val = 2)&lt;br /&gt;begin&lt;br /&gt;  waitfor delay '00:01:00'&lt;br /&gt;  insert into mytable values (2,2, replicate('a','4000'))&lt;br /&gt;end&lt;br /&gt;go&lt;br /&gt;commit tran&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;-- script: ins_2.sql&lt;br /&gt;use testdata&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;set transaction isolation level serializable&lt;br /&gt;begin tran&lt;br /&gt;go&lt;br /&gt;if not exists (select id from mytable where val = 4)&lt;br /&gt;begin&lt;br /&gt;  waitfor delay '00:01:00'&lt;br /&gt;  insert into mytable values (4,4, replicate('a','4000'))&lt;br /&gt;end&lt;br /&gt;go&lt;br /&gt;commit tran&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Withing the 1 min delay, run sp_lock procedure, I can see the key-range locks are requested by the two sessions:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;spid   dbid   ObjId       IndId  Type Resource                         Mode     Status&lt;br /&gt;------ ------ ----------- ------ ---- -------------------------------- -------- ------&lt;br /&gt;53     8      0           0      DB                                    S        GRANT&lt;br /&gt;52     8      0           0      DB                                    S        GRANT&lt;br /&gt;52     8      0           0      MD   49(90c8bd04:fb81833:777569)      Sch-S    GRANT&lt;br /&gt;53     8      0           0      MD   49(ead7fb30:916efee:7da7e5)      Sch-S    GRANT&lt;br /&gt;53     8      66099276    1      PAG  1:153                            IS       GRANT&lt;br /&gt;52     8      66099276    1      PAG  1:153                            IS       GRANT&lt;br /&gt;53     8      66099276    1      PAG  1:17151                          IS       GRANT&lt;br /&gt;52     8      66099276    1      PAG  1:17151                          IS       GRANT&lt;br /&gt;53     8      66099276    0      TAB                                   IS       GRANT&lt;br /&gt;52     8      66099276    0      TAB                                   IS       GRANT&lt;br /&gt;53     8      66099276    1      KEY  (ffffffffffff)                   RangeS-S GRANT&lt;br /&gt;52     8      66099276    1      KEY  (ffffffffffff)                   RangeS-S GRANT&lt;br /&gt;53     8      66099276    1      KEY  (03000d8f0ecc)                   RangeS-S GRANT&lt;br /&gt;52     8      66099276    1      KEY  (03000d8f0ecc)                   RangeS-S GRANT&lt;br /&gt;53     8      66099276    1      KEY  (010086470766)                   RangeS-S GRANT&lt;br /&gt;52     8      66099276    1      KEY  (010086470766)                   RangeS-S GRANT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Key-range locks protect a range of rows implicitly included in a record set being read by a Transact-SQL statement while using the serializable transaction isolation level. The serializable isolation level requires that any query executed during a transaction must obtain the same set of rows every time it is executed during the transaction. A key range lock protects this requirement by preventing other transactions from inserting new rows whose keys would fall in the range of keys read by the serializable transaction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After about 1 min, one of the sessions received the following message:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Msg 1205, Level 13, State 48, Line 4&lt;br /&gt;Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.&lt;br /&gt;Msg 3902, Level 16, State 1, Line 1&lt;br /&gt;The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the error log, I can find the following:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;--------------------- start of error log  ------------------&lt;br /&gt;&lt;br /&gt;2011-10-08 11:01:06.38 spid55      DBCC TRACEON 1222, server process ID (SPID) 55. This is an informational message only; no user action is required.&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     deadlock-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s      deadlock victim=process3313558&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       process-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s        process id=process3313558 taskpriority=0 logused=132 waitresource=KEY: 8:72057594047889408 (03000d8f0ecc) waittime=3935 ownerId=623111 transactionname=user_transaction lasttranstarted=2011-10-08T11:13:38.497 XDES=0x574bb30 lockMode=RangeI-N schedulerid=4 kpid=8728 status=suspended spid=52 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2011-10-08T11:13:38.497 lastbatchcompleted=2011-10-08T11:13:38.497 clientapp=Microsoft SQL Server Management Studio - Query hostname=TUSNC012LKVT006 hostpid=4412 loginname=US1\v983294 isolationlevel=serializable (4) xactid=623111 currentdb=8 lockTimeout=4294967295 clientoption1=671090784 clientoption2=390200&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         executionStack&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          frame procname=adhoc line=4 stmtstart=182 stmtend=296 sqlhandle=0x02000000d2ef471c04bdc8903318b80f6975779f09b41ba8&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     insert into mytable values (2,2, replicate('a','4000'))     &lt;br /&gt;2011-10-08 11:14:42.43 spid16s         inputbuf&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     if not exists (select id from mytable where val = 2)&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     begin&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       waitfor delay '00:01:00'&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       insert into mytable values (2,2, replicate('a','4000')) &lt;br /&gt;2011-10-08 11:14:42.43 spid16s     end&lt;br /&gt;2011-10-08 11:14:42.43 spid16s        process id=process69eaa8 taskpriority=0 logused=132 waitresource=KEY: 8:72057594047889408 (ffffffffffff) waittime=9293 ownerId=623056 transactionname=user_transaction lasttranstarted=2011-10-08T11:13:32.760 XDES=0xff48c10 lockMode=RangeI-N schedulerid=2 kpid=11340 status=suspended spid=53 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2011-10-08T11:13:32.760 lastbatchcompleted=2011-10-08T11:13:32.760 clientapp=Microsoft SQL Server Management Studio - Query hostname=TUSNC012LKVT006 hostpid=4412 loginname=US1\v983294 isolationlevel=serializable (4) xactid=623056 currentdb=8 lockTimeout=4294967295 clientoption1=671090784 clientoption2=390200&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         executionStack&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          frame procname=adhoc line=4 stmtstart=182 stmtend=296 sqlhandle=0x02000000eec4b91030fbd7eaeeef1609e5a77d124395f09a&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     insert into mytable values (4,4, replicate('a','4000'))     &lt;br /&gt;2011-10-08 11:14:42.43 spid16s         inputbuf&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     if not exists (select id from mytable where val = 4)&lt;br /&gt;2011-10-08 11:14:42.43 spid16s     begin&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       waitfor delay '00:01:00'&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       insert into mytable values (4,4, replicate('a','4000')) &lt;br /&gt;2011-10-08 11:14:42.43 spid16s     end&lt;br /&gt;2011-10-08 11:14:42.43 spid16s       resource-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s        keylock hobtid=72057594047889408 dbid=8 objectname=testdata.dbo.mytable indexname=index01 id=lock55da680 mode=RangeS-S associatedObjectId=72057594047889408&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         owner-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          owner id=process69eaa8 mode=RangeS-S&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         waiter-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          waiter id=process3313558 mode=RangeI-N requestType=convert&lt;br /&gt;2011-10-08 11:14:42.43 spid16s        keylock hobtid=72057594047889408 dbid=8 objectname=testdata.dbo.mytable indexname=index01 id=lock627aa80 mode=RangeS-S associatedObjectId=72057594047889408&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         owner-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          owner id=process3313558 mode=RangeS-S&lt;br /&gt;2011-10-08 11:14:42.43 spid16s         waiter-list&lt;br /&gt;2011-10-08 11:14:42.43 spid16s          waiter id=process69eaa8 mode=RangeI-N requestType=convert&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------- end of error log  ------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The solution to this deadlock situation could be (1) using repeated read isolation level&amp;nbsp; and/or (2) create an index on the 'val' column. Bottom line, we have to fully understand the requirement to code properly: why we need to insert into a table then using trigger to insert into another table? But this is out of my reach.&amp;nbsp;&amp;nbsp;Here I am just satisfied with being familiar with SQL Server lock types and DBCC trace command a little bit.&lt;br /&gt;&lt;br /&gt;The deadlock shown in this test case belong to a type of deadlock named conversion deadlock. Looking closely at the "resource-list" section of the error log. We can see that both sessions hold&amp;nbsp;the same&amp;nbsp;resource in shared mode (RangeS-S) at the begining. This is no problem. But both sessions then request to convert the lock type to RangeI-N, this reqires the other session give up the RangeS-S lock first. Thus a deadlock happens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-4165590233363816010?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/4165590233363816010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=4165590233363816010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/4165590233363816010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/4165590233363816010'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/10/sql-server-troubleshooting-deadlock.html' title='SQL Server - Troubleshooting Deadlock'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-5818010096844631213</id><published>2011-10-05T17:32:00.004-04:00</published><updated>2011-10-05T19:04:59.176-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plan Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - Are there any queries using any Plan Guides now?</title><content type='html'>Plan Guide in SQL Server is equivalent to SQL Profile in Oracle functionally. In Oracle, v$sqlarea has a column called SQL_PROFILE,&amp;nbsp;based on which &amp;nbsp;I can query this view to check if any queries are using any SQL Profiles. Here is the an example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;&lt;br /&gt;select sql_profile, max(sql_text) sample_sql_text, sum(executions) total_executions, &lt;br /&gt;sum(buffer_gets)/ sum(executions)   gets_per_execs &lt;br /&gt;from v$sqlarea where sql_profile is not null group by sql_profile;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL_PROFILE                      SAMPLE_SQL_TEXT                     TOTAL_EXECUTIONS GETS_PER_EXECS&lt;br /&gt;-------------------------------- ----------------------------------- ---------------- --------------&lt;br /&gt;profile_sfh_user_1               SELECT U.SFH_USER_ID,B.SFH_BTN_ID,U             2254     10.3189885&lt;br /&gt;                                 B.PMT_INDICATOR,U.EMAIL FROM SFH_US&lt;br /&gt;                                 ER U,SFH_BTN B,SFH_USER_BTN UB WHER&lt;br /&gt;                                 E U.SFH_USER_ID = UB.SFH_USER_ID AN&lt;br /&gt;                                 D UB.SFH_BTN_ID = B.SFH_BTN_ID AND&lt;br /&gt;                                 B.CUST_BTN = :B2 AND U.USER_ID = :B&lt;br /&gt;                                 1 AND U.USER_STATUS_CD = 'A' AND UB&lt;br /&gt;                                 .SVC_STATUS ='A' AND B.BTN_STATUS_C&lt;br /&gt;                                 D = 'A'&lt;br /&gt; &lt;br /&gt;COE_gg3zpxx6j5c8c_4057913317      SELECT COUNT(SESSION_KEY) FROM SFH           638642     7.52062032&lt;br /&gt;                                 _MYACC_SUMMARY WHERE cust_btn=:cust&lt;br /&gt;                                 _btn AND SESSION_KEY like :session_&lt;br /&gt;                                 key_value AND LAST_ACCESS_DATE &gt;= S&lt;br /&gt;                                 YSDATE-1&lt;br /&gt; &lt;br /&gt;profile_sfh_summary_1            SELECT * FROM SFH_SUMMARY_JOBS WHER             6088     3.84395532&lt;br /&gt;                                 E TTQ_ACCOUNT_ID='999802381'AND CR_&lt;br /&gt;                                 DATE &gt; TRUNC(SYSDATE)&lt;br /&gt; &lt;br /&gt;COE_1x13vygbj9k9t_142312094      DELETE FROM SFH_MYACC_SUMMARY WHERE             5047     11.3929067&lt;br /&gt;                                  CUST_BTN = :CUST_BTN AND  SESSION_&lt;br /&gt;                                 KEY LIKE :SESSION_KEY&lt;/pre&gt;&lt;br /&gt;It can been seen that&amp;nbsp; there are four SQL Profiles being used in this Oracle database (This is one of our production databases. I modified some table names to protect the innocent). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How can I obtain the same information in SQL Server regarding the usage of Plan Guide ? This is what I try to find out in the past few days. Below is what I got so far.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First of all, the output of the following query shows there are three Plan Guids in my AdventureWorks sample database&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;--  Show Plan Guides I created in AdventureWorks sample database&lt;br /&gt;&lt;br /&gt;use AdventureWorks&lt;br /&gt;go&lt;br /&gt;-- usp_p is my own print-rows-as-column procedure&lt;br /&gt;exec usp_p'   &lt;br /&gt;select name,create_date,query_text,scope_type_desc from sys.plan_guides&lt;br /&gt;'&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OUTPUT ROWS AS COLUMN    &lt;br /&gt;    &lt;br /&gt;----------------------------------------------&lt;br /&gt;name                          : Guide1&lt;br /&gt;create_date                   : Oct  4 2011  4:19PM&lt;br /&gt;query_text                    : SELECT * FROM Sales.SalesOrderHeader AS h,&lt;br /&gt;        Sales.Customer AS c, Sales.SalesTerritory AS t&lt;br /&gt;        WHERE h.CustomerID = c.CustomerID AND c.TerritoryID = t.TerritoryID&lt;br /&gt;            AND t.CountryRegionCode = @Country_region&lt;br /&gt;scope_type_desc               : OBJECT&lt;br /&gt;----------------------------------------------&lt;br /&gt;name                          : MyPlan_Guide_1&lt;br /&gt;create_date                   : Oct  4 2011  6:41PM&lt;br /&gt;query_text                    : SELECT COUNT(*) FROM [HumanResources].[Employee] e INNER JOIN [Person].[Contact] c ON c.[ContactID] = e.[ContactID]&lt;br /&gt;scope_type_desc               : SQL&lt;br /&gt;----------------------------------------------&lt;br /&gt;name                          : Template_Plan_1&lt;br /&gt;create_date                   : Oct  5 2011 11:05AM&lt;br /&gt;query_text                    : select SUM ( LineTotal ) as LineTotal from Sales . SalesOrderHeader H join Sales . SalesOrderDetail D on D . SalesOrderID = H . SalesOrderID where H . SalesOrderID = @0&lt;br /&gt;scope_type_desc               : TEMPLATE&lt;br /&gt;----------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As shown above in the "scope_type_desc" column, in SQL Server, there are three types of Plan Guide: Object, SQL and Template. In summary,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An OBJECT plan guide matches queries that execute in the context of Transact-SQL stored procedures, user-defined scalar functions, multi-statement user-defined table-valued functions, and DML triggers. &lt;/li&gt;&lt;li&gt;An SQL plan guide matches queries that execute in the context of stand-alone Transact-SQL statements and batches that are not part of a database object. SQL-based plan guides can also be used to match queries that parameterize to a specified form.&lt;/li&gt;&lt;li&gt;A TEMPLATE plan guide matches stand-alone queries that parameterize to a specified form. These plan guides are used to override the current PARAMETERIZATION database SET option of a database for a class of queries.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Now, I use the following query in SSMS to check whether any Plan Guides are being used&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- Show if any plan guides are in use now:&lt;br /&gt;&lt;br /&gt;SELECT &lt;br /&gt;   SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1 , ((CASE qs.statement_end_offset WHEN -1 THEN datalength(st.TEXT) &lt;br /&gt;   ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS sql_txt &lt;br /&gt;, qp.query_plan.value('declare default element namespace "http://schemas.microsoft.com/sqlserver/2004/07/showplan"; &lt;br /&gt; (/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@PlanGuideDB)[1]' , 'varchar(100)')  AS [PlanGuideDB]&lt;br /&gt;, qp.query_plan.value('declare default element namespace "http://schemas.microsoft.com/sqlserver/2004/07/showplan"; &lt;br /&gt; (/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@PlanGuideName)[1]' , 'varchar(100)')  AS [PlanGuideName]&lt;br /&gt; ,qp.query_plan&lt;br /&gt;, total_worker_time/execution_count AS AvgCPU &lt;br /&gt;, total_elapsed_time/execution_count AS AvgDuration &lt;br /&gt;, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads &lt;br /&gt;, execution_count &lt;br /&gt;FROM sys.dm_exec_query_stats qs&lt;br /&gt;cross apply sys.dm_exec_sql_text(sql_handle) st&lt;br /&gt;cross apply sys.dm_exec_query_plan(plan_handle) qp&lt;br /&gt;WHERE qp.query_plan.exist('declare default element namespace "http://schemas.microsoft.com/sqlserver/2004/07/showplan";&lt;br /&gt; /ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[(@PlanGuideName)]') = 1&lt;br /&gt;ORDER BY [PlanGuideDB], [PlanGuideName] DESC&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The idea of this query is from this post: &lt;a href="http://www.scarydba.com/2009/02/12/missing-index-information-and-query-stats/"&gt;http://www.scarydba.com/2009/02/12/missing-index-information-and-query-stats/&lt;/a&gt; ,&amp;nbsp; which tries to associate missing index info with the query causing it. Basically I used xquery exist funtion to search if there is a keyword 'PlanGuideName' in the XML text.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the sample output screenshot.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-W21TqAlL3nY/TozL6TYjCRI/AAAAAAAAACc/BBvcui_Uvfs/s1600/plan_guide_in_using.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="51" kca="true" src="http://1.bp.blogspot.com/-W21TqAlL3nY/TozL6TYjCRI/AAAAAAAAACc/BBvcui_Uvfs/s640/plan_guide_in_using.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As shown in the screenshot,&amp;nbsp; the query works for the Object and SQL type Plan Guide. When comes to the template Plan Guide, I encountered difficulties.&lt;br /&gt;&lt;br /&gt;The template Plan Guide was created by the following script, which is used to force replacing literals with parameters for a specific type query. By default, database PARAMEDTERIZATION is set to Simple, which will not be applicable to this type of query that has a two-table join.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;USE AdventureWorks;&lt;br /&gt;DECLARE @stmt nvarchar(max);&lt;br /&gt;DECLARE @params nvarchar(max);&lt;br /&gt;EXEC sp_get_query_template&lt;br /&gt;    N' SELECT  SUM(LineTotal) AS LineTotal&lt;br /&gt;       FROM    Sales.SalesOrderHeader H&lt;br /&gt;       JOIN    Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID&lt;br /&gt;      WHERE   H.SalesOrderID = 56000',&lt;br /&gt;    @stmt OUTPUT,&lt;br /&gt;    @params OUTPUT&lt;br /&gt;&lt;br /&gt;EXEC sp_create_plan_guide&lt;br /&gt;    N'Template_Plan_1',&lt;br /&gt;    @stmt,&lt;br /&gt;    N'TEMPLATE',&lt;br /&gt;    NULL,&lt;br /&gt;    @params,&lt;br /&gt;    N'OPTION(PARAMETERIZATION FORCED)';&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I run the following test to see if the template Plan Guide works:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;use AdventureWorks&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;SELECT  SUM(LineTotal) AS LineTotal&lt;br /&gt;FROM    Sales.SalesOrderHeader H&lt;br /&gt;JOIN    Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID&lt;br /&gt;WHERE   H.SalesOrderID = 56001&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When checking the estimated plan, in the Show Plan XML window, I can find the following text for the "StmtSimple" node:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" &lt;/span&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.00658091" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StatementText="SELECT SUM(LineTotal) AS LineTotal FROM Sales.SalesOrderHeader H&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;JOIN Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;WHERE H.SalesOrderID = 56001" StatementType="SELECT" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: red;"&gt;TemplatePlanGuideDB="AdventureWorks" TemplatePlanGuideName="Template_Plan_1"&lt;/span&gt; ParameterizedText="(@0 int)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;span style="background-color: white;"&gt;select SUM ( LineTotal ) as LineTotal from &lt;/span&gt;Sales . SalesOrderHeader H join Sales . SalesOrderDetail D on D . SalesOrderID = H . SalesOrderID &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;where H . SalesOrderID = @0" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;QueryHash="0x1170510D7B65D486" QueryPlanHash="0x1B1C9CA6A989FB7C"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;It can be noticed that there are "TemplatePlanGuideDB" and "TemplatePlanGuideName" attributes presented, which indicates the template Plan Guide will be used. When checking the acutual plan, in the Show Plan XML window, I see different text than above: &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;stmtsimple &lt;="" font="" statementcompid="1" statementestrows="1" statementid="1" statementoptmlevel="FULL"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.00658091" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;StatementText="select SUM ( LineTotal ) as LineTotal from Sales . SalesOrderHeader H &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;join Sales . SalesOrderDetail D on D . SalesOrderID = H . SalesOrderID &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;where H . SalesOrderID = @0" StatementType="SELECT" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;QueryHash="0x1170510D7B65D486" QueryPlanHash="0x1B1C9CA6A989FB7C"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Basically&amp;nbsp;in the actual execution plan XML text, there is no such keywords as 'PlanGuideDBName' or 'TemplatePlanGuideDBName'. Due to the lacking of such marks,&amp;nbsp; the query described previously cannot&lt;br /&gt;be used to answer such a question " Are there any queries using any template Plan Guides now?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-5818010096844631213?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/5818010096844631213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=5818010096844631213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5818010096844631213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5818010096844631213'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/10/sql-server-are-there-any-queries-using.html' title='SQL Server - Are there any queries using any Plan Guides now?'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-W21TqAlL3nY/TozL6TYjCRI/AAAAAAAAACc/BBvcui_Uvfs/s72-c/plan_guide_in_using.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-3949949338483343454</id><published>2011-09-23T11:21:00.001-04:00</published><updated>2011-09-23T11:31:46.269-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - A Procedure to Display Rows as Column</title><content type='html'>As an Oracle DBA, I am used to using command line interface (CLI) for my many DBA tasks. When some long rows are output from a query, it is often very unconvenient to view in CLI windows due to text wrapping at certain lengh. Tom Kyte has developed a procedure in Oracle to display rows as column. Here I try to accomolish the same thing in SQL Server.&lt;br /&gt;&lt;br /&gt;My procedure is called usp_p, the source code can be downloaded &lt;a href="https://sites.google.com/site/denissunsite/code/usp_p.sql"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Below is an example of using this procedure.&lt;br /&gt;&lt;br /&gt;First of all, here is the script (top10_ela.sql ) that displays top 10 sqls ordered by average execution time:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;declare @sqltext varchar(4000)&lt;br /&gt;&lt;br /&gt;set @sqltext =&lt;br /&gt;' SELECT   top 10                                                                           '+    &lt;br /&gt;' sql_handle                                                                                '+&lt;br /&gt;' , (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,                          '+ &lt;br /&gt;'      ( (CASE WHEN statement_end_offset = -1                                               '+ &lt;br /&gt;'             THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)                                '+&lt;br /&gt;'       ELSE statement_end_offset END)  - statement_start_offset) / 2+1))  AS sql_statement '+&lt;br /&gt;'  , (total_elapsed_time/execution_count)/1000 AS [Avg Exec Time in ms]                     '+&lt;br /&gt;'  , max_elapsed_time/1000 AS [MaxExecTime in ms]                                           '+&lt;br /&gt;'  , min_elapsed_time/1000 AS [MinExecTime in ms]                                           '+&lt;br /&gt;'  , (total_worker_time/execution_count)/1000 AS [Avg CPU Time in ms]                       '+&lt;br /&gt;' , qs.execution_count AS NumberOfExecs                                                     '+&lt;br /&gt;' , (total_logical_writes+total_logical_Reads)/execution_count AS [Avg Logical IOs]         '+&lt;br /&gt;' , max_logical_reads AS MaxLogicalReads                                                    '+&lt;br /&gt;' , min_logical_reads AS MinLogicalReads                                                    '+&lt;br /&gt;' , max_logical_writes AS MaxLogicalWrites                                                  '+&lt;br /&gt;' , min_logical_writes AS MinLogicalWrites                                                  '+&lt;br /&gt;' , creation_time                                                                           '+&lt;br /&gt;' , last_execution_time                                                                     '+&lt;br /&gt;' FROM sys.dm_exec_query_stats qs                                                           '+ &lt;br /&gt;' CROSS APPLY sys.dm_exec_sql_text(sql_handle)  s2                                          '+ &lt;br /&gt;' WHERE s2.objectid is null                                                                 '+  &lt;br /&gt;' ORDER BY [Avg Exec Time in ms] DESC                                                    '; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;exec testdata.dbo.usp_p @sqltext&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The output looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;$ sqlcmd -i top10_ela.sql&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OUTPUT ROWS AS COLUMN&lt;br /&gt;&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000f2deb70ac53c5a28f974b9e33fc40ac4696e1f8d&lt;br /&gt;sql_statement                 : select * from big_table&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :     733709&lt;br /&gt;MaxExecTime in ms             :     733709&lt;br /&gt;MinExecTime in ms             :     733709&lt;br /&gt;Avg CPU Time in ms            :     733236&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 22 2011  6:03PM&lt;br /&gt;last_execution_time           : Sep 22 2011  6:03PM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x020000008c08dc2a83d90353b43ebdf73f967c6071cd7f40&lt;br /&gt;sql_statement                 : update big_table set vc_padding = upper(vc_padding);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :      25434&lt;br /&gt;MaxExecTime in ms             :      25434&lt;br /&gt;MinExecTime in ms             :      25434&lt;br /&gt;Avg CPU Time in ms            :      21236&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      57242&lt;br /&gt;MaxLogicalReads               :      28651&lt;br /&gt;MinLogicalReads               :      28651&lt;br /&gt;MaxLogicalWrites              :      28591&lt;br /&gt;MinLogicalWrites              :      28591&lt;br /&gt;creation_time                 : Sep 23 2011  9:33AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:33AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000f35bee37d4134755a33f598165698922e569daee&lt;br /&gt;sql_statement                 : update big_table set vc_padding = upper(vc_padding) where id &amp;gt; 1 ;&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :      20409&lt;br /&gt;MaxExecTime in ms             :      20409&lt;br /&gt;MinExecTime in ms             :      20409&lt;br /&gt;Avg CPU Time in ms            :      12484&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      53364&lt;br /&gt;MaxLogicalReads               :      28637&lt;br /&gt;MinLogicalReads               :      28637&lt;br /&gt;MaxLogicalWrites              :      24727&lt;br /&gt;MinLogicalWrites              :      24727&lt;br /&gt;creation_time                 : Sep 23 2011  9:54AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:54AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000f35bee37d4134755a33f598165698922e569daee&lt;br /&gt;sql_statement                 : update big_table set vc_padding = lower(vc_padding) where id &amp;gt; 2 ;&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :      11945&lt;br /&gt;MaxExecTime in ms             :      11945&lt;br /&gt;MinExecTime in ms             :      11945&lt;br /&gt;Avg CPU Time in ms            :      10801&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      32673&lt;br /&gt;MaxLogicalReads               :      28636&lt;br /&gt;MinLogicalReads               :      28636&lt;br /&gt;MaxLogicalWrites              :       4037&lt;br /&gt;MinLogicalWrites              :       4037&lt;br /&gt;creation_time                 : Sep 23 2011  9:54AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:54AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000ce87d72c2c2b99271f90dd3617a175b49fb7654c&lt;br /&gt;sql_statement                 : update big_table set vc_padding = lower(vc_padding);&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :      10505&lt;br /&gt;MaxExecTime in ms             :      10505&lt;br /&gt;MinExecTime in ms             :      10505&lt;br /&gt;Avg CPU Time in ms            :       9133&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      57214&lt;br /&gt;MaxLogicalReads               :      28637&lt;br /&gt;MinLogicalReads               :      28637&lt;br /&gt;MaxLogicalWrites              :      28577&lt;br /&gt;MinLogicalWrites              :      28577&lt;br /&gt;creation_time                 : Sep 23 2011  9:43AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:43AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000ce87d72c2c2b99271f90dd3617a175b49fb7654c&lt;br /&gt;sql_statement                 : update  /* 1 */ big_table set vc_padding = lower(vc_padding);&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :       2164&lt;br /&gt;MaxExecTime in ms             :       2164&lt;br /&gt;MinExecTime in ms             :       2164&lt;br /&gt;Avg CPU Time in ms            :       2164&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 23 2011  9:43AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:44AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000ce87d72c2c2b99271f90dd3617a175b49fb7654c&lt;br /&gt;sql_statement                 : update  /* 2 */ big_table set vc_padding = lower(vc_padding);&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :       2070&lt;br /&gt;MaxExecTime in ms             :       2070&lt;br /&gt;MinExecTime in ms             :       2070&lt;br /&gt;Avg CPU Time in ms            :       2070&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 23 2011  9:43AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:44AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000ce87d72c2c2b99271f90dd3617a175b49fb7654c&lt;br /&gt;sql_statement                 : update  /* 4 */ big_table set vc_padding = lower(vc_padding);&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :       2054&lt;br /&gt;MaxExecTime in ms             :       2054&lt;br /&gt;MinExecTime in ms             :       2054&lt;br /&gt;Avg CPU Time in ms            :       2054&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 23 2011  9:43AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:44AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000f35bee37d4134755a33f598165698922e569daee&lt;br /&gt;sql_statement                 : update big_table set vc_padding = lower(vc_padding) where id &amp;gt; 4 ;&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :       2050&lt;br /&gt;MaxExecTime in ms             :       2050&lt;br /&gt;MinExecTime in ms             :       2050&lt;br /&gt;Avg CPU Time in ms            :       2050&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 23 2011  9:54AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:54AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;sql_handle                    : 0x02000000ce87d72c2c2b99271f90dd3617a175b49fb7654c&lt;br /&gt;sql_statement                 : update  /* 3 */ big_table set vc_padding = lower(vc_padding);&lt;br /&gt;&lt;br /&gt;Avg Exec Time in ms           :       1924&lt;br /&gt;MaxExecTime in ms             :       1924&lt;br /&gt;MinExecTime in ms             :       1924&lt;br /&gt;Avg CPU Time in ms            :       1924&lt;br /&gt;NumberOfExecs                 :          1&lt;br /&gt;Avg Logical IOs               :      28634&lt;br /&gt;MaxLogicalReads               :      28634&lt;br /&gt;MinLogicalReads               :      28634&lt;br /&gt;MaxLogicalWrites              :          0&lt;br /&gt;MinLogicalWrites              :          0&lt;br /&gt;creation_time                 : Sep 23 2011  9:43AM&lt;br /&gt;last_execution_time           : Sep 23 2011  9:44AM&lt;br /&gt;----------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: I did not verify that every data type can be shown properly as of now, I will probably have to modify the code as time goes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-3949949338483343454?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/3949949338483343454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=3949949338483343454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3949949338483343454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3949949338483343454'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/09/sql-server-procedure-to-display-rows-as.html' title='SQL Server - A Procedure to Display Rows as Column'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-52401784529666271</id><published>2011-09-21T14:26:00.000-04:00</published><updated>2011-09-21T14:26:11.444-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - Create a Policy to Enfore Naming Convention on Stored Procedure</title><content type='html'>In SQL Server 2008, assuming we need to enforce a naming standard on stored procedures: &lt;br /&gt;All stored procedures in the database (TestData) must start with "usp_" - ("usp" stands for user stored procedure).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1 Create the Condition&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;In Object Explorer, expand Management, expand Policy Management, expand Conditions, right-click the Conditions node and then click New Condition.&lt;/li&gt;&lt;li&gt;&amp;nbsp;On the Create New Condition, General page, in the Name box, type the name of the new condition: SP Naming &lt;/li&gt;&lt;li&gt;Select the Multipart Name facet in the Facet box.&lt;/li&gt;&lt;li&gt;In the Expression area, construct the condition expressions : @Name like 'usp_%'.&lt;/li&gt;&lt;li&gt;On the Description page, type a description and then click OK.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2 Create the Policy&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In Object Explorer, expand Management, expand Policy Management, right-click Policies, and then click New Policy.&lt;/li&gt;&lt;li&gt;On the Create New Policy, General page, in the Name box, type the name of the new policy: SP Naming Policy.&lt;/li&gt;&lt;li&gt;If you want the policy to be enabled as soon as it is created, select the Enabled check box. &lt;/li&gt;&lt;li&gt;If the evaluation mode is On demand, the Enabled check box is not available.&lt;/li&gt;&lt;li&gt;In the Check condition box, select the existing condition: SP Naming. To edit the condition, select the condition and then click the build (...) button.&lt;/li&gt;&lt;li&gt;&amp;nbsp;In the Against targets box, select the Every StoredProcedure target. Create a new condition TestData DB Only in the Database Node (Facet: Database, Condition: @Name='testdata'). &lt;/li&gt;&lt;li&gt;In the Evaluation Mode box, select how this policy will behave: On Change: Prevent. Different conditions can have different valid evaluation modes.&lt;/li&gt;&lt;li&gt;To limit the policy to subset of the target types, in the Server restriction box, select from limiting conditions or create a new condition.&lt;/li&gt;&lt;li&gt;On the Description page, in the Category box, select an optional policy category or create a new one.&lt;/li&gt;&lt;li&gt;Type n optional description of the policy.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Click OK.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;When the policy is enabled, trying to create a procedure that violates the policy, the following message is received:&lt;br /&gt;&lt;br /&gt;Changed database context to 'testdata'.&lt;br /&gt;Policy 'SP Naming Policy' has been violated by 'SQLSERVER:\SQL\TUSNC012LKVT006\DEFAULT\Databases\testdata\StoredProcedures\dbo.HelloWorld3_proc'.&lt;br /&gt;This transaction will be rolled back.&lt;br /&gt;Policy condition: '@Name LIKE 'usp_%''&lt;br /&gt;Policy description: ''&lt;br /&gt;Additional help: '' : ''&lt;br /&gt;Statement: '&lt;br /&gt;create procedure HelloWorld3_proc&lt;br /&gt;as&lt;br /&gt;select 'HelloWorld'&lt;br /&gt;'.&lt;br /&gt;Msg 3609, Level 16, State 1, Server TUSNC012LKVT006, Procedure sp_syspolicy_dispatch_event, Line 65&lt;br /&gt;The transaction ended in the trigger. The batch has been aborted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-52401784529666271?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/52401784529666271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=52401784529666271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/52401784529666271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/52401784529666271'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/09/sql-server-create-policy-to-enfore.html' title='SQL Server - Create a Policy to Enfore Naming Convention on Stored Procedure'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-6289142573817415240</id><published>2011-09-08T18:39:00.024-04:00</published><updated>2011-09-09T08:37:55.268-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server - test case showing rows moved when creating a clustered index</title><content type='html'>Recently I have determined to study SQL Server. Of course, this is not the first time I&amp;nbsp;attempt to do so.&amp;nbsp;Just this time I decided not to spend time on Oracle voluntarily and to concentrate on SQL server instead.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;I have noticed that in SQL Server it is highly recommended that every table&amp;nbsp;should have a clustered index. A table&amp;nbsp;with a clustered index (CI)&amp;nbsp;conceptually corresponds to the Index Organized Table (IOT)&amp;nbsp;in Oracle. Basically, the leaf node of the index contains the data block (called B+ tree index). I also found &lt;a href="http://blog.sqlpositive.com/2011/06/diff-oracle-sql-server-indexes-part1/"&gt;a blog post&lt;/a&gt; that&amp;nbsp;attempted to explain why SQL Server needs to use CI to achieve performance while IOT is not used&amp;nbsp;in Oracle as&amp;nbsp;widely as the&amp;nbsp;CI in SQL Sever. But I am still not very clear about the reasons&amp;nbsp;after reading the post.&lt;br /&gt;&lt;br /&gt;If a table does not have a CI and we want to create &amp;nbsp;CI on it, the existing rows should be reorganized to occupy the pages in the&amp;nbsp;sorted key order. This is what I try to confirm with the following test case.&lt;br /&gt;&lt;br /&gt;Test case:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- script: rowmove.sql&lt;br /&gt;-- purpose: demonstrate table rows moved when creating clustered index&lt;br /&gt;-- env    : SQL Server 2008&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;:setvar sqlcmdheaders            40     -- "page size"&lt;br /&gt;:setvar sqlcmdcolwidth          132     -- line width&lt;br /&gt;:setvar sqlcmdmaxfixedtypewidth  32     -- max column width (fixed length)&lt;br /&gt;:setvar sqlcmdmaxvartypewidth    32     -- max column width (varying length)&lt;br /&gt;&lt;br /&gt;USE testdata&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;IF OBJECT_ID ( 'mytable', 'U' ) IS NOT NULL &lt;br /&gt;DROP TABLE mytable;&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE mytable&lt;br /&gt; (&lt;br /&gt;  id  INT,&lt;br /&gt;  col1 VARCHAR(2000),&lt;br /&gt;  col2 VARCHAR(2000));&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 1, REPLICATE('a', 2000), REPLICATE('b', 2000);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 4, REPLICATE('a', 2000), REPLICATE('b', 2000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 2, REPLICATE('a', 2000), REPLICATE('b', 2000);&lt;br /&gt;&lt;br /&gt;INSERT INTO mytable&lt;br /&gt;SELECT 3, REPLICATE('a', 2000), REPLICATE('b', 2000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;       a.%%physloc%%                          AS Address,&lt;br /&gt;       sys.fn_PhysLocFormatter(a.%%physloc%%) AS AddressText,&lt;br /&gt;       a.id&lt;br /&gt;FROM   mytable a&lt;br /&gt;ORDER BY 2;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;print " "&lt;br /&gt;print "  ----  After created clustered index on ID ----"&lt;br /&gt;print " "&lt;br /&gt;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;create unique clustered index index01 &lt;br /&gt;on mytable(id);&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;       a.%%physloc%%                          AS Address,&lt;br /&gt;       sys.fn_PhysLocFormatter(a.%%physloc%%) AS AddressText,&lt;br /&gt;       a.id&lt;br /&gt;FROM   mytable a&lt;br /&gt;ORDER BY 2;&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Test output:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Changed database context to 'testdata'.&lt;br /&gt;&lt;br /&gt;(1 rows affected)&lt;br /&gt;Address    AddressText                      id         &lt;br /&gt;---------- -------------------------------- -----------&lt;br /&gt;0xFA420000 (1:17146:0)                                1&lt;br /&gt;0xFA420000 (1:17146:1)                                4&lt;br /&gt;0xFD420000 (1:17149:0)                                2&lt;br /&gt;0xFD420000 (1:17149:1)                                3&lt;br /&gt;&lt;br /&gt;(4 rows affected)&lt;br /&gt; &lt;br /&gt;  ----  After created clustered index on ID ----&lt;br /&gt; &lt;br /&gt;Address    AddressText                      id         &lt;br /&gt;---------- -------------------------------- -----------&lt;br /&gt;0x99000000 (1:153:0)                                  3&lt;br /&gt;0x99000000 (1:153:1)                                  4&lt;br /&gt;0xFE420000 (1:17150:0)                                1&lt;br /&gt;0xFE420000 (1:17150:1)                                2&lt;br /&gt;&lt;br /&gt;(4 rows affected)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It can be seen that in this test case one page can hold maximum 2 table rows. At the begining, table rows with id=1 and 4 reside on page 17146, and with id=2,3 resides on page 17149. This is understandable as we inserted the rows in the order of 1,4,2,3. After create a CI on ID column, the rows with id=1,2 moved to page 153 and rows with id=3,4 moved to page  17150. So the rows occupies the pages in the sorted order of ID. It should be noted that the pages that belong to the table do not need to physically on the disk files closely to each other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-6289142573817415240?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/6289142573817415240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=6289142573817415240' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6289142573817415240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6289142573817415240'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/09/sql-server-test-case-showing-rows-moved.html' title='SQL Server - test case showing rows moved when creating a clustered index'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2446437663745976719</id><published>2011-05-11T17:11:00.003-04:00</published><updated>2011-05-15T21:08:10.929-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='01 - Performance Tunning'/><title type='text'>Setting CUROSR_SHARING To FORCE causes large amount of child cursors for an insert statement</title><content type='html'>In a pre-production test, we found out that application did not use bind variables and there was no time to change code before the production rollout. So we suggested changing CURSOR_SHARING parameter from EXACT to FORCE in order to turn hard parse to soft parse. When testing this change for the two webservice functions , which mainly consists of two inserts, one update and bunch of select statements, the results are promising:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Summary of testing results from 15 min interval AWR reports from a 4-node 11.2.0.2 RAC database&lt;br /&gt;&lt;br /&gt;2-node test (CURSOR_SHARING=EXACT)&lt;br /&gt;&lt;br /&gt;dd1    DB Time:   23.04 (mins)  143 tx/s   Parses: 440.7 per sec  Hard parses: 315.2 per sec       &lt;br /&gt;dd4    DB Time:   23.35 (mins)  140 tx/s   Parses: 414.4 per sec  Hard parses: 303.5 per sec               &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2-node test (CURSOR_SHARING=FORCE)&lt;br /&gt;&lt;br /&gt;dd1   DB Time:    16.68 (mins)  146 tx/s   Parses: 383.9 per sec  Hard parses: 2.6 per sec&lt;br /&gt;dd4   DB Time:    16.01 (mins)  147 tx/s   Parses: 384.2 per sec  Hard parses: 2.6 per sec&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- dd1  Time Model Statistics (CURSOR_SHARING=FORCE) &lt;br /&gt; &lt;br /&gt;Statistic Name                                       Time (s) % of DB Time&lt;br /&gt;------------------------------------------ ------------------ ------------&lt;br /&gt;sql execute elapsed time                                666.6         66.6&lt;br /&gt;DB CPU                                                  350.0         35.0&lt;br /&gt;parse time elapsed                                       80.0          8.0&lt;br /&gt;hard parse elapsed time                                  15.1          1.5&lt;br /&gt;hard parse (sharing criteria) elapsed time                1.7           .2&lt;br /&gt;PL/SQL execution elapsed time                             1.1           .1&lt;br /&gt;hard parse (bind mismatch) elapsed time                   1.0           .1&lt;br /&gt;PL/SQL compilation elapsed time                           0.8           .1&lt;br /&gt;connection management call elapsed time                   0.4           .0&lt;br /&gt;sequence load elapsed time                                0.4           .0&lt;br /&gt;repeated bind elapsed time                                0.0           .0&lt;br /&gt;DB time                                               1,000.9&lt;br /&gt;background elapsed time                                 200.0&lt;br /&gt;background cpu time                                     143.9&lt;br /&gt;          -------------------------------------------------------------&lt;br /&gt; &lt;br /&gt;-- dd1  Time Model Statistics (CURSOR_SHARING=EXACT) &lt;br /&gt;&lt;br /&gt;Statistic Name                                       Time (s) % of DB Time&lt;br /&gt;------------------------------------------ ------------------ ------------&lt;br /&gt;DB CPU                                                  728.2         52.7&lt;br /&gt;sql execute elapsed time                                632.9         45.8&lt;br /&gt;parse time elapsed                                      481.2         34.8&lt;br /&gt;hard parse elapsed time                                 390.0         28.2&lt;br /&gt;hard parse (sharing criteria) elapsed time                3.2           .2&lt;br /&gt;hard parse (bind mismatch) elapsed time                   2.9           .2&lt;br /&gt;PL/SQL execution elapsed time                             1.4           .1&lt;br /&gt;PL/SQL compilation elapsed time                           1.2           .1&lt;br /&gt;connection management call elapsed time                   0.5           .0&lt;br /&gt;sequence load elapsed time                                0.5           .0&lt;br /&gt;repeated bind elapsed time                                0.0           .0&lt;br /&gt;failed parse elapsed time                                 0.0           .0&lt;br /&gt;DB time                                               1,382.4&lt;br /&gt;background elapsed time                                 261.8&lt;br /&gt;background cpu time                                     115.5&lt;br /&gt;          -------------------------------------------------------------&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bascially, we saw hard parse was greatly reduced. For the same level transaction rate, DB time was reduced from 46 min to 32 min after changing to FORCE. However, when another module was enabled and added to the two webserverice workload, things went wrong. We saw large amount of "cursor:mutex S" and "liberary cache lock" waits (&amp;gt;80% DB time). We identified an insert statement that has large amount of child cursors ( ~ 8000) caused the problem.&lt;br /&gt;&lt;br /&gt;Below is a test case demonstrating large number of child cursors are created with CURSOR_SHARING=FORCE: &lt;br /&gt;&lt;br /&gt;Test case 1&lt;br /&gt;&lt;br /&gt;This test was carried out to repeat what we encountered in our pre-production test. Inserts into a table called MY_STB_LOG2 were performed with CUROSR_SHARING=FORCE, with 324 total number of inserts similar to the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;insert into MY_STB_LOG2 values('0000043862420080','VHO6_W07_MTR_30243_20110504094656__.101.Zip',CURRENT_TIMESTAMP,timestamp'2011-05-04 07:51:40.000',timestamp'2011-05-04 02:20:45.000',timestamp'2011-05-04 02:35:07.000','N','N','','','','P',SYSDATE);&lt;br /&gt;insert into MY_STB_LOG2 values('0000048201268050','VHO6_W07_MTR_30243_20110504094656__.101.Zip',CURRENT_TIMESTAMP,timestamp'2011-05-05 01:02:07.000',timestamp'2011-05-04 21:10:22.000','','N','N','','','','P',SYSDATE);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After run, checking v$sqlarea and v$sql, we got: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; select sql_text,sql_id, executions from v$sqlarea where sql_text like 'insert into MY_STB_LOG2%';&lt;br /&gt; &lt;br /&gt;SQL_TEXT&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;SQL_ID        EXECUTIONS&lt;br /&gt;------------- ----------&lt;br /&gt;insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS_B_02",timestamp:"SYS_B_03",:"SYS&lt;br /&gt;_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;16yq35g1c433b         71&lt;br /&gt; &lt;br /&gt;insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS_B_02",:"SYS_B_03",:"SYS_B_04",:"&lt;br /&gt;SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;4yzz9r14n53fg         28&lt;br /&gt; &lt;br /&gt;insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS_B_02",timestamp:"SYS_B_03",times&lt;br /&gt;tamp:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;gpb19na8zd67s        210&lt;br /&gt; &lt;br /&gt;insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS_B_02",:"SYS_B_03",timestamp:"SYS&lt;br /&gt;_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;6ua1jndb5ud4x         15&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select sql_id, count(*) from v$sql  where sql_text like 'insert into MY_STB_LOG2%' group by sql_id;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select sql_id, count(*) from v$sql  where sql_text like 'insert into MY_STB_LOG2%' group by sql_id;&lt;br /&gt; &lt;br /&gt;SQL_ID          COUNT(*)&lt;br /&gt;------------- ----------&lt;br /&gt;gpb19na8zd67s        210&lt;br /&gt;16yq35g1c433b         71&lt;br /&gt;4yzz9r14n53fg         28&lt;br /&gt;6ua1jndb5ud4x         15&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It can be seen that we have 4 versions of insert statements after literals are replaced by system-generated bind varialbes. For each version, the execution times equal to the number of its child cursors. It indicates for every insert, Oracle actually does hard parse with extra cost to search child cursors. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When using &lt;a href="http://dioncho.wordpress.com/2009/03/05/vsql_shared_cursor"&gt;Dion's script &lt;/a&gt;to query v$sql_shared_cursor, we can see the reason for unshared cursor is "HASH_MATCH_FAILED"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------&lt;br /&gt;SQL_TEXT = insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS&lt;br /&gt;_B_02",timestamp:"SYS_B_03",:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;SQL_ID = 16yq35g1c433b&lt;br /&gt;ADDRESS = 0000000113DCCE88&lt;br /&gt;CHILD_ADDRESS = 0000000093C96F80&lt;br /&gt;CHILD_NUMBER = 68&lt;br /&gt;HASH_MATCH_FAILED = Y&lt;br /&gt;--------------------------------------------------&lt;br /&gt;SQL_TEXT = insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS&lt;br /&gt;_B_02",timestamp:"SYS_B_03",:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;SQL_ID = 16yq35g1c433b&lt;br /&gt;ADDRESS = 0000000113DCCE88&lt;br /&gt;CHILD_ADDRESS = 00000000AB5E4300&lt;br /&gt;CHILD_NUMBER = 69&lt;br /&gt;HASH_MATCH_FAILED = Y&lt;br /&gt;--------------------------------------------------&lt;br /&gt;SQL_TEXT = insert into MY_STB_LOG2 values(:"SYS_B_00",:"SYS_B_01",CURRENT_TIMESTAMP,timestamp:"SYS&lt;br /&gt;_B_02",timestamp:"SYS_B_03",:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",:"SYS_B_08",:"SYS_B_09",:"SYS_B_10",SYSDATE)&lt;br /&gt;SQL_ID = 16yq35g1c433b&lt;br /&gt;ADDRESS = 0000000113DCCE88&lt;br /&gt;CHILD_ADDRESS = 000000013C695090&lt;br /&gt;CHILD_NUMBER = 70&lt;br /&gt;HASH_MATCH_FAILED = Y&lt;br /&gt;--------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It should be noted that even application using the bind varialbe, this problem could occur. One possible solution is to use PL/SQL procedure to do the insert:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Test case 2&lt;br /&gt;&lt;br /&gt;I create a procedure STB_INS (see appendix) to insert into a table called MY_STB_LOG3 ( same structure as LOG2), then I run 324 exec procedure such as:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;exec STB_INS('0001097562293114','VHO6_W07_MTR_30243_20110504094656__.101.Zip',CURRENT_TIMESTAMP,timestamp'2011-05-05 01:30:01.000',timestamp'2011-05-05 00:20:03.000',timestamp'2011-05-04 23:42:57.000','N','N','','','','P',SYSDATE);&lt;br /&gt;&lt;br /&gt;exec STB_INS('0000027988805135','VHO6_W07_MTR_30243_20110504094656__.101.Zip',CURRENT_TIMESTAMP,timestamp'2011-05-05 01:46:21.000',timestamp'2011-05-05 01:02:54.000',timestamp'2011-05-04 22:55:10.000','N','N','','','','P',SYSDATE);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After run, check v$sqlarea and v$sql&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt;  select sql_id, sql_text, executions from v$sqlarea where sql_text like '%MY_STB_LOG3%';&lt;br /&gt;&lt;br /&gt;SQL_ID&lt;br /&gt;-------------&lt;br /&gt;SQL_TEXT&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;EXECUTIONS&lt;br /&gt;----------&lt;br /&gt;4fdv39rhjag5n&lt;br /&gt;INSERT INTO MY_STB_LOG3 VALUES( :B13 ,:B12 ,:B11 ,:B10 ,:B9 ,:B8 ,:B7 ,:B6 ,:B5 ,:B4 ,:B3 ,:B2 ,:B1 )&lt;br /&gt;       324&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select count(*) from v$sql where sql_id='4fdv39rhjag5n';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         1&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We see 324 executions shared same cursor. &lt;br /&gt;&lt;br /&gt;Appendix&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace procedure stb_ins(&lt;br /&gt;p_UNIT_ADDRESS             VARCHAR2&lt;br /&gt;,p_BATCH_NUMBER            VARCHAR2&lt;br /&gt;,p_RECEIVED_TIME           TIMESTAMP&lt;br /&gt;,p_LAST_LOG_TIME           TIMESTAMP&lt;br /&gt;,p_POWERON_TIME            TIMESTAMP&lt;br /&gt;,p_POWEROFF_TIME           TIMESTAMP&lt;br /&gt;,p_UNAVAILABLE_FLAG        VARCHAR2&lt;br /&gt;,p_UNSUBSCRIBE_FLAG        VARCHAR2&lt;br /&gt;,p_WORK_ID                 VARCHAR2&lt;br /&gt;,p_STATUS_CODE             VARCHAR2&lt;br /&gt;,p_STATUS_DESC             VARCHAR2&lt;br /&gt;,p_PROC_STATUS             VARCHAR2&lt;br /&gt;,p_CREATE_DATE             DATE&lt;br /&gt;) &lt;br /&gt;is&lt;br /&gt;begin&lt;br /&gt;  insert into my_stb_log3 values(&lt;br /&gt;               p_UNIT_ADDRESS           &lt;br /&gt;                ,p_BATCH_NUMBER          &lt;br /&gt;                ,p_RECEIVED_TIME         &lt;br /&gt;                ,p_LAST_LOG_TIME         &lt;br /&gt;                ,p_POWERON_TIME          &lt;br /&gt;                ,p_POWEROFF_TIME         &lt;br /&gt;                ,p_UNAVAILABLE_FLAG      &lt;br /&gt;                ,p_UNSUBSCRIBE_FLAG      &lt;br /&gt;                ,p_WORK_ID               &lt;br /&gt;                ,p_STATUS_CODE           &lt;br /&gt;                ,p_STATUS_DESC           &lt;br /&gt;                ,p_PROC_STATUS            &lt;br /&gt;                ,p_CREATE_DATE            &lt;br /&gt;  );&lt;br /&gt;  commit;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Some related references about cursor sharing:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freelists.org/post/oracle-l/Multiple-SQL-version-count-with-cusror-sharingsimilar,5"&gt;http://www.freelists.org/post/oracle-l/Multiple-SQL-version-count-with-cusror-sharingsimilar,5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:599762300346943686"&gt;http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:599762300346943686&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kerryosborne.oracle-guy.com/2009/06/oracle-11g-adaptive-cursor-sharing-acs/"&gt;http://kerryosborne.oracle-guy.com/2009/06/oracle-11g-adaptive-cursor-sharing-acs/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/optimops.htm#sthref874"&gt;http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/optimops.htm#sthref874&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2446437663745976719?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2446437663745976719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2446437663745976719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2446437663745976719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2446437663745976719'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/05/setting-curosrsharing-to-force-causes.html' title='Setting CUROSR_SHARING To FORCE causes large amount of child cursors for an insert statement'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-7165855864049766868</id><published>2011-04-11T15:30:00.000-04:00</published><updated>2011-04-11T15:30:32.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='index rebuild'/><title type='text'>Index rebuild and archival procedure</title><content type='html'>I administer one of the production databases that supports retail ordering application. We have an archival procedure that archives old orders. Last weekend, I rebuilt all of the indexes of 5 tables against which the delete statements in the archival procedure are identified most expensive. The total size of those indexes are reduced by 460GB after rebuild. After the rebuild, the archival of 350K orders took 1h40min compared to 2h30min typically before rebuild. The reason for the performance improvement as far as I can see are as follows:&lt;br /&gt;&lt;br /&gt;(1) Decreasing the number of gets in the index range scan operation due to indexes are more compressed &lt;br /&gt;(2) Increasing the chances of caching,&amp;nbsp; thus&amp;nbsp;reducing the need to wait for db file sequential read. &lt;br /&gt;For example, let's say, index entry 1 is in block 1 and entry 2 is in block 2 before rebuild, so Oracle needs to read block1 and 2 to the buffer cache to delete them; while after rebuild both entry 1 and entry 2&amp;nbsp;could be&amp;nbsp;in block 1, so Oracle needs to read block 1 once and can work on two entries. &lt;br /&gt;&lt;br /&gt;Among those 5 tables, the top-most expensive delete is the&amp;nbsp;one from a table called ORDER_TRANS. There is an index called ORDER_TRANS_IX4 of this table is 16GB after rebuild as compared to 150GB before rebuild. Why is the index so sparse? The index is on the LAST_MODIFIED_DATE column of the table. This is a typical right-hand index, i.e. new index key entries are added to the right hand size of the index tree. The key value is monotonically increasing, like a sequence-based PK. If assuming a leaf block of the index can hold 360 index entries, 99.9% blocks (hold&amp;nbsp; &amp;lt;=180 entries) are&amp;nbsp; &amp;gt;50% empty; 97.5% blocks (hold &amp;lt;=90 entries) are &amp;gt;75% empty. (see appendix)&amp;nbsp;.The reasons that why especially right-hand index can grow bigger are described in a Jonathan Lewis's &lt;a href="http://jonathanlewis.wordpress.com/2008/09/26/index-analysis/"&gt;blog post&lt;/a&gt;. In my particular case, I believe the problems of the archival procedure itself contribute to the sparsity of the index greatly.&lt;br /&gt;&lt;br /&gt;The candidate orders that are eligible for archiving is based on certain business logic. However I found that there are very old orders. e.g. competed in&amp;nbsp;2004, 2005, that are not selected out for archiving. I confirmed with a lead developer who called those orders "fallout" that those orders should be updated so that they could become eligible for archiving long time ago. In addition, the orders are not selected based on the increasing order of its completion date or cancel date. We can imagine that if we really archive old orders based on their completion or cancel date, i.e, the older the earlier to be archived, we won't have that sparse index in the first place, because left-hand size leaf block can become empty much sooner and easily and thus&amp;nbsp;reused. &lt;br /&gt;&lt;br /&gt;In summary, it appears that rebuild index improves our archival procedure performance; however, we may&amp;nbsp;want to &amp;nbsp;look it in the other way around. If the old orders are really archived based on common sense, we probably don't need to rebuild index at all. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Appendix - How the leaf blocks of ORDER_TRANS_IX4 are used based on &lt;a href="http://jonathanlewis.wordpress.com/index-efficiency-3/"&gt;JL's script.&lt;/a&gt;&amp;nbsp;( Sample 5% blocks)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ROWS_PER_BLOCK     BLOCKS     ROW_CT CUMULATIVE_BLOCKS&lt;br /&gt;-------------- ---------- ---------- -----------------&lt;br /&gt;             1      16232      16232             16232&lt;br /&gt;             2      14696      29392             30928&lt;br /&gt;             3      13739      41217             44667&lt;br /&gt;             4      13840      55360             58507&lt;br /&gt;             5      13316      66580             71823&lt;br /&gt;             6      13859      83154             85682&lt;br /&gt;             7      13787      96509             99469&lt;br /&gt;             8      13842     110736            113311&lt;br /&gt;             9      13937     125433            127248&lt;br /&gt;            10      14127     141270            141375&lt;br /&gt;            11      14244     156684            155619&lt;br /&gt;            12      14528     174336            170147&lt;br /&gt;            13      14566     189358            184713&lt;br /&gt;            14      15005     210070            199718&lt;br /&gt;            15      15150     227250            214868&lt;br /&gt;            16      15492     247872            230360&lt;br /&gt;            17      15868     269756            246228&lt;br /&gt;            18      16015     288270            262243&lt;br /&gt;            19      16026     304494            278269&lt;br /&gt;            20      16217     324340            294486&lt;br /&gt;            21      16106     338226            310592&lt;br /&gt;            22      16121     354662            326713&lt;br /&gt;            23      16257     373911            342970&lt;br /&gt;            24      15860     380640            358830&lt;br /&gt;            25      15912     397800            374742&lt;br /&gt;            26      15920     413920            390662&lt;br /&gt;            27      15859     428193            406521&lt;br /&gt;            28      15462     432936            421983&lt;br /&gt;            29      15288     443352            437271&lt;br /&gt;            30      15095     452850            452366&lt;br /&gt;            31      15346     475726            467712&lt;br /&gt;            32      15000     480000            482712&lt;br /&gt;            33      14832     489456            497544&lt;br /&gt;            34      14719     500446            512263&lt;br /&gt;            35      14147     495145            526410&lt;br /&gt;            36      13925     501300            540335&lt;br /&gt;            37      13671     505827            554006&lt;br /&gt;            38      13452     511176            567458&lt;br /&gt;            39      13278     517842            580736&lt;br /&gt;            40      13109     524360            593845&lt;br /&gt;            41      13040     534640            606885&lt;br /&gt;            42      12801     537642            619686&lt;br /&gt;            43      12338     530534            632024&lt;br /&gt;            44      11986     527384            644010&lt;br /&gt;            45      11732     527940            655742&lt;br /&gt;            46      11123     511658            666865&lt;br /&gt;            47      11126     522922            677991&lt;br /&gt;            48      10896     523008            688887&lt;br /&gt;            49      10546     516754            699433&lt;br /&gt;            50      10178     508900            709611&lt;br /&gt;            51       9644     491844            719255&lt;br /&gt;            52       9593     498836            728848&lt;br /&gt;            53       9208     488024            738056&lt;br /&gt;            54       9009     486486            747065&lt;br /&gt;            55       8421     463155            755486&lt;br /&gt;            56       8393     470008            763879&lt;br /&gt;            57       7992     455544            771871&lt;br /&gt;            58       7651     443758            779522&lt;br /&gt;            59       7329     432411            786851&lt;br /&gt;            60       6941     416460            793792&lt;br /&gt;            61       6662     406382            800454&lt;br /&gt;            62       6526     404612            806980&lt;br /&gt;            63       6320     398160            813300&lt;br /&gt;            64       5864     375296            819164&lt;br /&gt;            65       5687     369655            824851&lt;br /&gt;            66       5334     352044            830185&lt;br /&gt;            67       5182     347194            835367&lt;br /&gt;            68       4953     336804            840320&lt;br /&gt;            69       4728     326232            845048&lt;br /&gt;            70       4379     306530            849427&lt;br /&gt;            71       4219     299549            853646&lt;br /&gt;            72       4124     296928            857770&lt;br /&gt;            73       3769     275137            861539&lt;br /&gt;            74       3737     276538            865276&lt;br /&gt;            75       3553     266475            868829&lt;br /&gt;            76       3268     248368            872097&lt;br /&gt;            77       3102     238854            875199&lt;br /&gt;            78       3010     234780            878209&lt;br /&gt;            79       2860     225940            881069&lt;br /&gt;            80       2608     208640            883677&lt;br /&gt;            81       2552     206712            886229&lt;br /&gt;            82       2408     197456            888637&lt;br /&gt;            83       2238     185754            890875&lt;br /&gt;            84       2236     187824            893111&lt;br /&gt;            85       1989     169065            895100&lt;br /&gt;            86       1883     161938            896983&lt;br /&gt;            87       1737     151119            898720&lt;br /&gt;            88       1705     150040            900425&lt;br /&gt;            89       1627     144803            902052&lt;br /&gt;            90       1479     133110            903531&lt;br /&gt;            91       1447     131677            904978&lt;br /&gt;            92       1314     120888            906292&lt;br /&gt;            93       1316     122388            907608&lt;br /&gt;            94       1207     113458            908815&lt;br /&gt;            95       1258     119510            910073&lt;br /&gt;            96       1065     102240            911138&lt;br /&gt;            97       1049     101753            912187&lt;br /&gt;            98        974      95452            913161&lt;br /&gt;            99        927      91773            914088&lt;br /&gt;           100        919      91900            915007&lt;br /&gt;           101        877      88577            915884&lt;br /&gt;           102        828      84456            916712&lt;br /&gt;           103        794      81782            917506&lt;br /&gt;           104        666      69264            918172&lt;br /&gt;           105        635      66675            918807&lt;br /&gt;           106        617      65402            919424&lt;br /&gt;           107        549      58743            919973&lt;br /&gt;           108        458      49464            920431&lt;br /&gt;           109        475      51775            920906&lt;br /&gt;           110        292      32120            921198&lt;br /&gt;           111        243      26973            921441&lt;br /&gt;           112        244      27328            921685&lt;br /&gt;           113        201      22713            921886&lt;br /&gt;           114        219      24966            922105&lt;br /&gt;           115        169      19435            922274&lt;br /&gt;           116        150      17400            922424&lt;br /&gt;           117        167      19539            922591&lt;br /&gt;           118        177      20886            922768&lt;br /&gt;           119        128      15232            922896&lt;br /&gt;           120        135      16200            923031&lt;br /&gt;           121        140      16940            923171&lt;br /&gt;           122        134      16348            923305&lt;br /&gt;           123        130      15990            923435&lt;br /&gt;           124         99      12276            923534&lt;br /&gt;           125        107      13375            923641&lt;br /&gt;           126        104      13104            923745&lt;br /&gt;           127         84      10668            923829&lt;br /&gt;           128        106      13568            923935&lt;br /&gt;           129         86      11094            924021&lt;br /&gt;           130         68       8840            924089&lt;br /&gt;           131         97      12707            924186&lt;br /&gt;           132         71       9372            924257&lt;br /&gt;           133         71       9443            924328&lt;br /&gt;           134         61       8174            924389&lt;br /&gt;           135         72       9720            924461&lt;br /&gt;           136         82      11152            924543&lt;br /&gt;           137         48       6576            924591&lt;br /&gt;           138         72       9936            924663&lt;br /&gt;           139         64       8896            924727&lt;br /&gt;           140         58       8120            924785&lt;br /&gt;           141         41       5781            924826&lt;br /&gt;           142         41       5822            924867&lt;br /&gt;           143         35       5005            924902&lt;br /&gt;           144         45       6480            924947&lt;br /&gt;           145         39       5655            924986&lt;br /&gt;           146         37       5402            925023&lt;br /&gt;           147         32       4704            925055&lt;br /&gt;           148         39       5772            925094&lt;br /&gt;           149         26       3874            925120&lt;br /&gt;           150         25       3750            925145&lt;br /&gt;           151         38       5738            925183&lt;br /&gt;           152         33       5016            925216&lt;br /&gt;           153         34       5202            925250&lt;br /&gt;           154         36       5544            925286&lt;br /&gt;           155         33       5115            925319&lt;br /&gt;           156         29       4524            925348&lt;br /&gt;           157         33       5181            925381&lt;br /&gt;           158         25       3950            925406&lt;br /&gt;           159         22       3498            925428&lt;br /&gt;           160         34       5440            925462&lt;br /&gt;           161         22       3542            925484&lt;br /&gt;           162         21       3402            925505&lt;br /&gt;           163         21       3423            925526&lt;br /&gt;           164         22       3608            925548&lt;br /&gt;           165         21       3465            925569&lt;br /&gt;           166         25       4150            925594&lt;br /&gt;           167         19       3173            925613&lt;br /&gt;           168         17       2856            925630&lt;br /&gt;           169         16       2704            925646&lt;br /&gt;           170         15       2550            925661&lt;br /&gt;           171         17       2907            925678&lt;br /&gt;           172          9       1548            925687&lt;br /&gt;           173          9       1557            925696&lt;br /&gt;           174         17       2958            925713&lt;br /&gt;           175         13       2275            925726&lt;br /&gt;           176         16       2816            925742&lt;br /&gt;           177         13       2301            925755&lt;br /&gt;           178         14       2492            925769&lt;br /&gt;           179         10       1790            925779&lt;br /&gt;           180          7       1260            925786&lt;br /&gt;           181          7       1267            925793&lt;br /&gt;           182          6       1092            925799&lt;br /&gt;           183          9       1647            925808&lt;br /&gt;           184          7       1288            925815&lt;br /&gt;           185          7       1295            925822&lt;br /&gt;           186          9       1674            925831&lt;br /&gt;           187          6       1122            925837&lt;br /&gt;           188          8       1504            925845&lt;br /&gt;           189          5        945            925850&lt;br /&gt;           190          7       1330            925857&lt;br /&gt;           191          5        955            925862&lt;br /&gt;           192          9       1728            925871&lt;br /&gt;           193          6       1158            925877&lt;br /&gt;           194          5        970            925882&lt;br /&gt;           195          8       1560            925890&lt;br /&gt;           196          8       1568            925898&lt;br /&gt;           197          9       1773            925907&lt;br /&gt;           198          6       1188            925913&lt;br /&gt;           199          5        995            925918&lt;br /&gt;           200          3        600            925921&lt;br /&gt;           201          2        402            925923&lt;br /&gt;           202          6       1212            925929&lt;br /&gt;           203          5       1015            925934&lt;br /&gt;           204          5       1020            925939&lt;br /&gt;           205          4        820            925943&lt;br /&gt;           206          5       1030            925948&lt;br /&gt;           207          3        621            925951&lt;br /&gt;           209          1        209            925952&lt;br /&gt;           210          5       1050            925957&lt;br /&gt;           211          3        633            925960&lt;br /&gt;           212          3        636            925963&lt;br /&gt;           213          3        639            925966&lt;br /&gt;           214          4        856            925970&lt;br /&gt;           215          3        645            925973&lt;br /&gt;           216          1        216            925974&lt;br /&gt;           217          2        434            925976&lt;br /&gt;           218          4        872            925980&lt;br /&gt;           219          3        657            925983&lt;br /&gt;           220          2        440            925985&lt;br /&gt;           221          2        442            925987&lt;br /&gt;           222          2        444            925989&lt;br /&gt;           223          4        892            925993&lt;br /&gt;           224          2        448            925995&lt;br /&gt;           225          2        450            925997&lt;br /&gt;           226          2        452            925999&lt;br /&gt;           227          2        454            926001&lt;br /&gt;           228          1        228            926002&lt;br /&gt;           229          4        916            926006&lt;br /&gt;           230          5       1150            926011&lt;br /&gt;           231          2        462            926013&lt;br /&gt;           232          3        696            926016&lt;br /&gt;           233          2        466            926018&lt;br /&gt;           234          1        234            926019&lt;br /&gt;           235          5       1175            926024&lt;br /&gt;           236          3        708            926027&lt;br /&gt;           237          3        711            926030&lt;br /&gt;           239          3        717            926033&lt;br /&gt;           240          4        960            926037&lt;br /&gt;           241          4        964            926041&lt;br /&gt;           242          1        242            926042&lt;br /&gt;           243          2        486            926044&lt;br /&gt;           244          5       1220            926049&lt;br /&gt;           245          3        735            926052&lt;br /&gt;           246          2        492            926054&lt;br /&gt;           248          1        248            926055&lt;br /&gt;           249          1        249            926056&lt;br /&gt;           250          2        500            926058&lt;br /&gt;           252          4       1008            926062&lt;br /&gt;           255          4       1020            926066&lt;br /&gt;           256          4       1024            926070&lt;br /&gt;           257          2        514            926072&lt;br /&gt;           258          1        258            926073&lt;br /&gt;           259          4       1036            926077&lt;br /&gt;           261          1        261            926078&lt;br /&gt;           262          2        524            926080&lt;br /&gt;           263          1        263            926081&lt;br /&gt;           264          2        528            926083&lt;br /&gt;           265          1        265            926084&lt;br /&gt;           266          2        532            926086&lt;br /&gt;           267          4       1068            926090&lt;br /&gt;           268          2        536            926092&lt;br /&gt;           269          2        538            926094&lt;br /&gt;           271          1        271            926095&lt;br /&gt;           272          1        272            926096&lt;br /&gt;           273          3        819            926099&lt;br /&gt;           275          2        550            926101&lt;br /&gt;           277          1        277            926102&lt;br /&gt;           278          1        278            926103&lt;br /&gt;           279          1        279            926104&lt;br /&gt;           280          2        560            926106&lt;br /&gt;           281          1        281            926107&lt;br /&gt;           283          1        283            926108&lt;br /&gt;           284          3        852            926111&lt;br /&gt;           285          1        285            926112&lt;br /&gt;           286          3        858            926115&lt;br /&gt;           288          2        576            926117&lt;br /&gt;           289          1        289            926118&lt;br /&gt;           290          1        290            926119&lt;br /&gt;           291          2        582            926121&lt;br /&gt;           292          3        876            926124&lt;br /&gt;           293          3        879            926127&lt;br /&gt;           294          1        294            926128&lt;br /&gt;           295          1        295            926129&lt;br /&gt;           296          1        296            926130&lt;br /&gt;           297          2        594            926132&lt;br /&gt;           298          2        596            926134&lt;br /&gt;           299          1        299            926135&lt;br /&gt;           301          1        301            926136&lt;br /&gt;           302          4       1208            926140&lt;br /&gt;           305          1        305            926141&lt;br /&gt;           306          1        306            926142&lt;br /&gt;           308          1        308            926143&lt;br /&gt;           309          3        927            926146&lt;br /&gt;           310          1        310            926147&lt;br /&gt;           313          1        313            926148&lt;br /&gt;           314          1        314            926149&lt;br /&gt;           315          2        630            926151&lt;br /&gt;           317          1        317            926152&lt;br /&gt;           318          2        636            926154&lt;br /&gt;           319          1        319            926155&lt;br /&gt;           320          2        640            926157&lt;br /&gt;           321          2        642            926159&lt;br /&gt;           322          3        966            926162&lt;br /&gt;           323          2        646            926164&lt;br /&gt;           324          2        648            926166&lt;br /&gt;           325          1        325            926167&lt;br /&gt;           326          1        326            926168&lt;br /&gt;           327          2        654            926170&lt;br /&gt;           328          3        984            926173&lt;br /&gt;           329          3        987            926176&lt;br /&gt;           330          3        990            926179&lt;br /&gt;           331          2        662            926181&lt;br /&gt;           332          2        664            926183&lt;br /&gt;           333          2        666            926185&lt;br /&gt;           334          2        668            926187&lt;br /&gt;           335          2        670            926189&lt;br /&gt;           336          1        336            926190&lt;br /&gt;           337          2        674            926192&lt;br /&gt;           338          3       1014            926195&lt;br /&gt;           340          3       1020            926198&lt;br /&gt;           341          3       1023            926201&lt;br /&gt;           342          1        342            926202&lt;br /&gt;           343          3       1029            926205&lt;br /&gt;           344          6       2064            926211&lt;br /&gt;           345          4       1380            926215&lt;br /&gt;           346          2        692            926217&lt;br /&gt;           347          2        694            926219&lt;br /&gt;           348          4       1392            926223&lt;br /&gt;           349          4       1396            926227&lt;br /&gt;           350          5       1750            926232&lt;br /&gt;           351          3       1053            926235&lt;br /&gt;           352          4       1408            926239&lt;br /&gt;           354          3       1062            926242&lt;br /&gt;           355          5       1775            926247&lt;br /&gt;           356          5       1780            926252&lt;br /&gt;           357          4       1428            926256&lt;br /&gt;           358          6       2148            926262&lt;br /&gt;           359          2        718            926264&lt;br /&gt;           360          6       2160            926270&lt;br /&gt;           361          9       3249            926279&lt;br /&gt;           362          6       2172            926285&lt;br /&gt;           363          5       1815            926290&lt;br /&gt;           364          6       2184            926296&lt;br /&gt;           365          9       3285            926305&lt;br /&gt;           366         11       4026            926316&lt;br /&gt;           367         43      15781            926359&lt;br /&gt;               ---------- ----------&lt;br /&gt;sum                926359   32433921&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-7165855864049766868?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/7165855864049766868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=7165855864049766868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7165855864049766868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7165855864049766868'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/04/index-rebuild-and-archival-procedure.html' title='Index rebuild and archival procedure'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2020391370326755631</id><published>2011-02-28T19:47:00.000-05:00</published><updated>2011-02-28T19:47:44.738-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWR'/><category scheme='http://www.blogger.com/atom/ns#' term='I/O'/><title type='text'>How can I confirm there was an I/O problem (2) ?</title><content type='html'>In a previous &lt;a href="http://oracle-study-notes.blogspot.com/2011/02/how-can-i-confirm-there-was-io-problem.html"&gt;post&lt;/a&gt;, I have mentioned that I have&amp;nbsp;tried to mine AWR data to confirm an I/O issue occurred around 2:18 PM of Feb 18; however I encountered some issue and instead found out 'sar' was helpful. Today, I worked out the query against AWR tables. The query is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;rem  awr_io_file_smpl.sql  &lt;br /&gt;rem   -- Adapted from the scripts written by Karl Arao: http://karlarao.wordpress.com&lt;br /&gt;rem&lt;br /&gt;rem  check if there are I/O problem from AWR. &lt;br /&gt;rem  normally atpr (Average time per read)  should be less than 20 ms&lt;br /&gt;rem  if atpr &amp;gt; 100 ms, it obviously indicates that we have problem&lt;br /&gt;rem   &lt;br /&gt;rem  note: the statistics are based on  (tm-interval, tm)&lt;br /&gt;rem    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;col atpr format 999,999&lt;br /&gt;col atpw format 999,999&lt;br /&gt;&lt;br /&gt;set echo off&lt;br /&gt;-- set markup HTML ON&lt;br /&gt;-- SPOOL ON ENTMAP ON PREFORMAT OFF&lt;br /&gt;-- spool awr_io_file_smpl.html&lt;br /&gt;spool awr_io_file_smpl.log&lt;br /&gt;select * from (&lt;br /&gt;SELECT &lt;br /&gt;--      s0.snap_id snap_id,&lt;br /&gt;       to_char(s1.END_INTERVAL_TIME, 'YYMMDD HH24:MI') tm,&lt;br /&gt;--      s0.instance_number inst,&lt;br /&gt;       ROUND(EXTRACT(DAY FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 1440 + EXTRACT(HOUR FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 60 + EXTRACT(MINUTE FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) + EXTRACT(SECOND FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) / 60, 2) dur,&lt;br /&gt;--      e.tsname,&lt;br /&gt;      e.file# ,&lt;br /&gt;--      SUBSTR(e.filename, 1, 52) filename ,&lt;br /&gt;--      e.readtim         - NVL(b.readtim,0) readtim ,&lt;br /&gt;      e.phyrds          - NVL(b.phyrds,0) reads ,&lt;br /&gt;      DECODE ((e.phyrds - NVL(b.phyrds, 0)), 0, to_number(NULL), ((e.readtim - NVL(b.readtim,0)) &lt;br /&gt;                   / (e.phyrds - NVL(b.phyrds,0)))*10) atpr ,&lt;br /&gt;--      (e.phyrds         - NVL(b.phyrds,0)) / ((ROUND(EXTRACT(DAY FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 1440 + EXTRACT(HOUR FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 60 + EXTRACT(MINUTE FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) + EXTRACT(SECOND FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) / 60, 2))*60) rps  ,&lt;br /&gt;--      DECODE ((e.phyrds  - NVL(b.phyrds, 0)), 0, to_number(NULL), (e.phyblkrd - NVL(b.phyblkrd,0)) / (e.phyrds - NVL(b.phyrds,0)) ) bpr ,&lt;br /&gt;--      e.writetim         - NVL(b.writetim,0) writetim ,&lt;br /&gt;      e.phywrts          - NVL(b.phywrts,0) writes ,&lt;br /&gt;      DECODE ((e.phywrts - NVL(b.phywrts, 0)), 0, to_number(NULL), ((e.writetim - NVL(b.writetim,0)) / (e.phywrts - NVL(b.phywrts,0)))*10) atpw ,&lt;br /&gt;--      (e.phywrts         - NVL(b.phywrts,0)) / ((ROUND(EXTRACT(DAY FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 1440 + EXTRACT(HOUR FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 60 + EXTRACT(MINUTE FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) + EXTRACT(SECOND FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) / 60, 2))*60) wps ,&lt;br /&gt;--      DECODE ((e.phywrts    - NVL(b.phywrts, 0)), 0, to_number(NULL), (e.phyblkwrt - NVL(b.phyblkwrt,0)) / (e.phywrts - NVL(b.phywrts,0)) ) bpw ,&lt;br /&gt;--      e.wait_count          - NVL(b.wait_count,0) waits ,&lt;br /&gt;--      DECODE ((e.wait_count - NVL(b.wait_count, 0)), 0, 0, ((e.time - NVL(b.time,0)) / (e.wait_count - NVL(b.wait_count,0)))*10) atpwt,&lt;br /&gt;      (e.phyrds             - NVL(b.phyrds,0)) + (e.phywrts - NVL(b.phywrts,0)) ios,&lt;br /&gt;      ((e.phyrds            - NVL(b.phyrds,0)) + (e.phywrts - NVL(b.phywrts,0))) / ((ROUND(EXTRACT(DAY FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 1440 + EXTRACT(HOUR FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) * 60 + EXTRACT(MINUTE FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) + EXTRACT(SECOND FROM s1.END_INTERVAL_TIME - s0.END_INTERVAL_TIME) / 60, 2))*60) iops&lt;br /&gt;    FROM dba_hist_snapshot s0,&lt;br /&gt;      dba_hist_snapshot s1,&lt;br /&gt;      dba_hist_filestatxs e,&lt;br /&gt;      dba_hist_filestatxs b&lt;br /&gt;    WHERE s0.dbid =(select dbid from v$database)&lt;br /&gt;    AND s1.dbid            = s0.dbid&lt;br /&gt;    AND b.dbid(+)          = s0.dbid -- begin dbid&lt;br /&gt;    AND e.dbid             = s0.dbid -- end dbid&lt;br /&gt;    AND b.dbid             = e.dbid  -- remove oj&lt;br /&gt;    AND s0.instance_number =dbms_utility.CURRENT_INSTANCE&lt;br /&gt;    AND s1.instance_number = s0.instance_number&lt;br /&gt;    AND b.instance_number(+) = s0.instance_number &lt;br /&gt;    AND e.instance_number    = s0.instance_number &lt;br /&gt;    AND b.instance_number    = e.instance_number &lt;br /&gt;    AND s1.snap_id           = s0.snap_id + 1&lt;br /&gt;    AND b.snap_id(+)         = s0.snap_id      &lt;br /&gt;    AND e.snap_id            = s0.snap_id + 1 &lt;br /&gt;    AND b.tsname             = e.tsname      &lt;br /&gt;    AND b.file#              = e.file#           &lt;br /&gt;    AND b.creation_change#   = e.creation_change# &lt;br /&gt;    AND ((e.phyrds - NVL(b.phyrds,0)) + (e.phywrts - NVL(b.phywrts,0))) &amp;gt; 0&lt;br /&gt;    AND s0.END_INTERVAL_TIME &amp;gt;= to_date('2011-02-18 13:00:00', 'YYYY-MM-DD HH24:MI:SS') &lt;br /&gt;    AND s0.END_INTERVAL_TIME &amp;lt;= to_date('2011-02-18 16:00:00', 'YYYY-MM-DD HH24:MI:SS') &lt;br /&gt;    order by s1.END_INTERVAL_TIME, e.tsname&lt;br /&gt;--    and b.tsname='xxxx'&lt;br /&gt;)&lt;br /&gt;where atpr &amp;gt; 100 &lt;br /&gt;;&lt;br /&gt;spool off&lt;br /&gt;set markup html off spool off&lt;br /&gt;set termout on&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output of above query is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;TM                  DUR      FILE#      READS     ATPR     WRITES     ATPW        IOS       IOPS&lt;br /&gt;------------ ---------- ---------- ---------- -------- ---------- -------- ---------- ----------&lt;br /&gt;110218 14:00      15.04        268          8      124          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        283          7      141          1        0          8 .008865248&lt;br /&gt;110218 14:00      15.04        281          8      118          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        296          8      116          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        273          8      123          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        293          8      123          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        288          8      125          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        276          8      120          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        286          7      133          1        0          8 .008865248&lt;br /&gt;110218 14:00      15.04        278          8      123          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        308          8      125          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        271          8      116          1        0          9 .009973404&lt;br /&gt;110218 14:00      15.04        248          7      139          1       10          8 .008865248&lt;br /&gt;110218 14:30       14.6        502       3472      205        620      816       4092 4.67123288&lt;br /&gt;110218 14:30       14.6        519        351    1,695         72    1,749        423 .482876712&lt;br /&gt;110218 14:30       14.6        515        664      347         90        6        754 .860730594&lt;br /&gt;110218 14:30       14.6        504       1174      214        114    1,107       1288 1.47031963&lt;br /&gt;110218 14:30       14.6        448       8463      139        550      461       9013 10.2888128&lt;br /&gt;110218 14:30       14.6        412       5772      131        361      353       6133 7.00114155&lt;br /&gt;110218 14:30       14.6        462       5889      215        437      291       6326 7.22146119&lt;br /&gt;110218 14:30       14.6        429      10276      313        356      360      10632 12.1369863&lt;br /&gt;110218 14:30       14.6        427       4255      189        183      691       4438 5.06621005&lt;br /&gt;110218 14:30       14.6        473       7355      298        865      149       8220 9.38356164&lt;br /&gt;110218 14:30       14.6        513        867      148        218      587       1085 1.23858447&lt;br /&gt;110218 14:30       14.6        479       5903      196        986      144       6889 7.86415525&lt;br /&gt;110218 14:30       14.6        475       7702      263       1163      221       8865  10.119863&lt;br /&gt;110218 14:30       14.6        471       9543      155        141      906       9684 11.0547945&lt;br /&gt;110218 14:30       14.6        523       2187      378       1014      253       3201 3.65410959&lt;br /&gt;110218 14:30       14.6        482       6674      150       1536      252       8210 9.37214612&lt;br /&gt;110218 14:30       14.6        437      10793      271       1920      401      12713 14.5125571&lt;br /&gt;110218 14:30       14.6        395       8062      151        555      233       8617 9.83675799&lt;br /&gt;110218 14:30       14.6        464      19537      431       4212      144      23749 27.1107306&lt;br /&gt;110218 14:30       14.6        491      14568      440       4247      220      18815 21.4783105&lt;br /&gt;110218 14:30       14.6        444      20026      385       2541      212      22567 25.7614155&lt;br /&gt;110218 14:30       14.6        481      15496      444       3763      287      19259 21.9851598&lt;br /&gt;110218 14:30       14.6        421      14930      334       1642       85      16572 18.9178082&lt;br /&gt;110218 14:30       14.6        514       5464      597       2542      360       8006 9.13926941&lt;br /&gt;110218 14:30       14.6        435       3804      165        167      751       3971 4.53310502&lt;br /&gt;110218 14:30       14.6        512       2065      237        474      276       2539 2.89840183&lt;br /&gt;110218 14:30       14.6        498       4540      186        508      993       5048 5.76255708&lt;br /&gt;110218 14:30       14.6        478       8505      159       1161      561       9666 11.0342466&lt;br /&gt;110218 14:30       14.6        470       8134      182        454      283       8588 9.80365297&lt;br /&gt;110218 14:30       14.6        460       4841      168        391      325       5232 5.97260274&lt;br /&gt;110218 14:30       14.6        474       6486      130        779      166       7265   8.293379&lt;br /&gt;110218 14:30       14.6        411       3368      291        186      678       3554 4.05707763&lt;br /&gt;110218 14:30       14.6        521       2447      183        543      235       2990 3.41324201&lt;br /&gt;110218 14:30       14.6        418       3837      124        128      991       3965 4.52625571&lt;br /&gt;110218 14:30       14.6        100        160    1,370        670      213        830 .947488584&lt;br /&gt;110218 14:30       14.6        139        408      273       1061      366       1469 1.67694064&lt;br /&gt;110218 15:00      15.03         62          4      103          1       10          5 .005544467&lt;br /&gt;110218 15:30      15.04         69          6      107          2        0          8 .008865248&lt;br /&gt;110218 15:30      15.04         62          6      102          2        5          8 .008865248&lt;br /&gt;110218 15:30      15.04         63          6      102          2        5          8 .008865248&lt;br /&gt;110218 15:30      15.04         64          6      107          2        5          8 .008865248&lt;br /&gt;110218 15:30      15.04         78          6      113          2        5          8 .008865248&lt;br /&gt;110218 15:30      15.04         77          6      107          2       10          8 .008865248&lt;br /&gt;110218 15:30      15.04         66          6      107          2        5          8 .008865248&lt;br /&gt;110218 16:00      15.04        125          6      282          1      180          7 .007757092&lt;br /&gt;110218 16:00      15.04        110          6      282          1       70          7 .007757092&lt;br /&gt;&lt;br /&gt;59 rows selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;From the above output, it can be seen from about 14:15 -14:30, there are many data files having APTR &amp;gt; 100 ms. This clearly indicates there was I/O problem during that period.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2020391370326755631?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2020391370326755631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2020391370326755631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2020391370326755631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2020391370326755631'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/how-can-i-confirm-there-was-io-problem_28.html' title='How can I confirm there was an I/O problem (2) ?'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8172384622025305545</id><published>2011-02-28T13:39:00.000-05:00</published><updated>2011-02-28T13:39:45.298-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><title type='text'>A simple concept map for some basic storage terms</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-0pKWjr0rUoc/TWvq25NW1LI/AAAAAAAAABw/CpPy9IFqpHY/s1600/StorageConceptMap.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" l6="true" src="https://lh5.googleusercontent.com/-0pKWjr0rUoc/TWvq25NW1LI/AAAAAAAAABw/CpPy9IFqpHY/s400/StorageConceptMap.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ref:&lt;br /&gt;[1] NetApp University “Data ONTAP 7.3 Fundamentals” Version 5.0&lt;br /&gt;&lt;br /&gt;[2] &lt;a href="http://www.oracle.com/technetwork/database/netapp-asm3329-129196.pdf"&gt;Using Oracle10 g™ Database Automatic Storage Management with Network Appliance™ Storage&lt;/a&gt; (2004 White paper, PDF)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8172384622025305545?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8172384622025305545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8172384622025305545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8172384622025305545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8172384622025305545'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/simple-concept-map-for-some-basic.html' title='A simple concept map for some basic storage terms'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-0pKWjr0rUoc/TWvq25NW1LI/AAAAAAAAABw/CpPy9IFqpHY/s72-c/StorageConceptMap.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2559942000563713519</id><published>2011-02-22T17:36:00.000-05:00</published><updated>2011-02-22T17:36:48.420-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePlex'/><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><title type='text'>Tip - List all of the tables in the Shareplex replication</title><content type='html'>Some time ago a co-worker showed me how to do this with a query. Today I have a need to do it, but I forget. I have to get the table list from the configuration file. Now I blog this as a reference for future:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;--- for port 2200 ---&lt;br /&gt;select owner, object_name, objid&lt;br /&gt;from splex.shareplex_objmap s, dba_objects o&lt;br /&gt;where s.objid = o.object_id &lt;br /&gt;order by owner, object_name;&lt;br /&gt;&lt;br /&gt;--- for port 2201 ----&lt;br /&gt;select owner, object_name, objid&lt;br /&gt;from splex_cpf.shareplex_objmap s, dba_objects o&lt;br /&gt;where s.objid = o.object_id &lt;br /&gt;order by owner, object_name;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2559942000563713519?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2559942000563713519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2559942000563713519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2559942000563713519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2559942000563713519'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/tip-list-all-of-tables-in-shareplex.html' title='Tip - List all of the tables in the Shareplex replication'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-3646722908943125296</id><published>2011-02-22T10:59:00.001-05:00</published><updated>2011-02-22T11:00:19.223-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='I/O'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>How can I confirm there was an I/O problem?</title><content type='html'>Last Friday afternoon , our production support team ( this team manages application servers in my working environment) reported that arounnd 2:18 PM there were application queuing and some job time-out issues. Naturally, as a knee-jerk reaction, the problem was described as "Database is slow". Later, some "SCSI trans" errors&amp;nbsp;are found&amp;nbsp;somewhere&amp;nbsp;, which indicated there were some I/O problem. So my question is as a DBA, how can I confirm there is an I/O problem? &lt;br /&gt;&lt;br /&gt;At first, I tried to look into the AWR data. I modified awr_io_file.sql script by &lt;a href="http://karlarao.wordpress.com/"&gt;Karl Arao&lt;/a&gt;&amp;nbsp;, in hope to report Average time per read time for the data file during the problem period. However, the script was running more than 20 min without results. I killed the job and decided to research on this mining AWR data approach later. BTW, one drawback I am aware of is that even I can get this data, it will be averaged over 15 min (our AWR snapshot interval). Averaging could hide the real problem.&lt;br /&gt;&lt;br /&gt;After googling a while, I found that 'sar' utility in my Solaris platform can shed some light on I/O issue in the recent past history.&lt;br /&gt;&lt;br /&gt;If we do 'man sar', we can found the following description about sar -f option:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sar [-aAbcdgkmpqruvwy] [-e time] [-f filename]  [-i sec]  [-s time]&lt;br /&gt;&lt;br /&gt;sar  extracts  data  from  a  previously  recorded filename,&lt;br /&gt;either the one specified by the -f option  or,  by  default,&lt;br /&gt;the    standard    system    activity    daily   data   file&lt;br /&gt;/var/adm/sa/sadd for the current day dd.  The  starting  and&lt;br /&gt;ending  times  of the report can be bounded using the -e and&lt;br /&gt;-s arguments with time specified in the  form  hh[:mm[:ss]].&lt;br /&gt;The  -i option selects records at sec second intervals. Oth-&lt;br /&gt; erwise, all intervals found in the data file are reported.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the first time that I am aware of that there are 'standard system activity daily data file'&lt;br /&gt;at /var/adm/sa/. As of now, I can see the following files:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;myservnm:/var/adm/sa [orclsid] $ ls -l &lt;br /&gt;total 2177984&lt;br /&gt;-rw-r--r--   1 sys      sys      241097472 Feb 18 23:55 sa18&lt;br /&gt;-rw-r--r--   1 sys      sys      241097472 Feb 19 23:55 sa19&lt;br /&gt;-rw-r--r--   1 sys      sys      241097472 Feb 20 23:55 sa20&lt;br /&gt;-rw-r--r--   1 sys      sys      241097472 Feb 21 23:55 sa21&lt;br /&gt;-rw-r--r--   1 sys      sys      78691536 Feb 22 07:45 sa22&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So it looks like we have 5 days data.&lt;br /&gt;&lt;br /&gt;What I did last Friday afternoon was:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sar -A  -e 14:28  -s 14:10   &amp;gt; ~/sar1410_1428.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you don't specify the -f, it will extract from the current day's file, i.e. sa18 last Friday.&lt;br /&gt;In the output file, we can see various info recorded at 5 min snapshot&lt;br /&gt;&lt;br /&gt;For example, CPU utilization:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SunOS myservnm 5.10 Generic_142900-05 sun4u    02/18/2011&lt;br /&gt; &lt;br /&gt;14:10:02    %usr    %sys    %wio   %idle&lt;br /&gt;14:15:03      17      14       0      69&lt;br /&gt;14:20:04      10      11       0      78&lt;br /&gt;14:25:05      20      18       0      62&lt;br /&gt; &lt;br /&gt;Average       16      15       0      70&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the device activity section, I can find at 14:20 snapshot some lines have very high avserv time.&lt;br /&gt;while normally I saw avserv &amp;lt; 30 ms in my system. for examples: &lt;br /&gt;&lt;pre&gt;14:10:02   device        %busy   avque   r+w/s  blks/s  avwait  avserv&lt;br /&gt; &lt;br /&gt;14:15:03   sd7               1     0.0       1      12     0.0     9.0&lt;br /&gt;           sd7,e             1     0.0       1      12     0.0     9.2&lt;br /&gt;           sd8              32     0.3      46     426     0.0     7.4&lt;br /&gt;....&lt;br /&gt;14:20:04   sd7               1     0.0       1      16     0.0     9.1&lt;br /&gt;           sd7,e             1     0.0       1      16     0.0     9.3&lt;br /&gt;...          &lt;br /&gt;sd1133,e          1     0.0       1      26     0.0    12.9&lt;br /&gt;           sd1134           44     0.8       3      73    78.6   238.1&lt;br /&gt;           sd1134,e         44     0.8       3      73    79.1   239.6&lt;br /&gt;           sd1135           42     0.4       1      20     0.0   485.3&lt;br /&gt;           sd1135,e         42     0.4       1      20     0.0   494.7&lt;br /&gt;           sd1136           42     0.4       0      25     0.0  1000.9&lt;br /&gt;           sd1136,e         42     0.4       0      25     0.0  1042.2&lt;br /&gt;           sd1142            1     0.0       1      40     0.0    13.0&lt;br /&gt;...&lt;br /&gt;  sd1204,e          4     0.0       3      81     0.0    16.0&lt;br /&gt;           sd1205           43     0.4       1      22     0.0   440.3&lt;br /&gt;           sd1205,e         43     0.4       1      22     0.0   448.0&lt;br /&gt;           sd1206           43     0.8       2      60    85.3   254.3&lt;br /&gt;           sd1206,e         43     0.8       2      60    85.9   256.1&lt;br /&gt;           sd1207            1     0.0       1      25     0.0    12.7&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://www.computerhope.com/unix/usar.htm"&gt;webpage&lt;/a&gt;&amp;nbsp; describes the meaning of some sar options and report fields.&lt;br /&gt;This &lt;a href="http://osr507doc.sco.com/en/PERFORM/ident_IO_bound.html"&gt;article&lt;/a&gt; called "Identifying disk I/O-bound systems" has information about intepreting sar report. &lt;br /&gt;&lt;br /&gt;I am happy I have another tool under my tool-belt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-3646722908943125296?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/3646722908943125296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=3646722908943125296' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3646722908943125296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3646722908943125296'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/how-can-i-confirm-there-was-io-problem.html' title='How can I confirm there was an I/O problem?'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8615761548823908946</id><published>2011-02-15T15:09:00.001-05:00</published><updated>2011-02-15T18:41:18.743-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semi-join'/><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>Tuning an inefficient SQL with semi-join</title><content type='html'>Found a sql look like the following in a batch job:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT    &lt;br /&gt; distinct&lt;br /&gt; C.INT_PSEFS_ID&lt;br /&gt;,C.ACCOUNT_ID&lt;br /&gt;,C.PSEFS_ID&lt;br /&gt;,C.IS_PQ&lt;br /&gt;,C.psefs_save_date&lt;br /&gt;FROM     &lt;br /&gt;   MYSCH.PSEFS_MSTR A&lt;br /&gt;  ,MYSCH.PSEFS_DTLS B&lt;br /&gt;  ,MYSCH.PSEFS_MSTR C&lt;br /&gt;WHERE    &lt;br /&gt;    A.INT_PSEFS_ID = B.INT_PSEFS_ID&lt;br /&gt;  AND C.PSEFS_ID LIKE SUBSTR (A.PSEFS_ID, 1, 13)|| '%'&lt;br /&gt;  AND A.IS_VALID = 'N' &lt;br /&gt;  AND B.PSEFS_STATUS_ID IN (4, 6)&lt;br /&gt;  AND A.PSEFS_COMP_DATE  &amp;lt;= SYSDATE - 45&lt;br /&gt;;&lt;br /&gt;&lt;/pre&gt;The execution plan is as follows: &lt;br /&gt;&lt;pre class="sql" name="code"&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                    | Name             | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT             |                  |    66T|  4861T|       |  3064G  (2)|999:59:59 |&lt;br /&gt;|   1 |  HASH UNIQUE                 |                  |    66T|  4861T|    11P|  3064G  (2)|999:59:59 |&lt;br /&gt;|   2 |   TABLE ACCESS BY INDEX ROWID| PSEFS_MSTR       |  3287K|   122M|       |   149K  (1)| 00:29:49 |&lt;br /&gt;|   3 |    NESTED LOOPS              |                  |    66T|  4861T|       |  3027G  (1)|999:59:59 |&lt;br /&gt;|*  4 |     HASH JOIN                |                  |    20M|   794M|   550M|   839K  (3)| 02:47:49 |&lt;br /&gt;|*  5 |      TABLE ACCESS FULL       | PSEFS_DTLS       |    26M|   250M|       |   612K  (2)| 02:02:29 |&lt;br /&gt;|*  6 |      TABLE ACCESS FULL       | PSEFS_MSTR       |    20M|   600M|       |   156K  (6)| 00:31:17 |&lt;br /&gt;|*  7 |     INDEX RANGE SCAN         | PSEFS_MSTR_IX5   |   591K|       |       |  5154   (1)| 00:01:02 |&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;INT_PSEFS_ID is a PK of A, and a FK of B, so A join B on INT_PSEFS_ID will generate a result set (refer to as R1) with duplicated records of A; Then we selected out row of C (same table as A) by join it with R1t based on an unusual join condition with LIKE operator. To see the problem by way of example, supposing we have a row in C with PSRFS_ID='ABCDEFGHIJKLM_2'; In R1, we could have several rows with PSRFS_ID in('ABCDEFGHIJKLM_3', 'ABCDEFGHIJKLM_4', 'ABCDEFGHIJKLM_4', 'ABCDEFGHIJKLM'), due to the LIKE, the row in C will match 4 rows in R1, thus generate 4 duplicated rows in the final result set. I rewrote the SQL to use sub-queries to enable the more efficient semi-joins intead of normal joins &lt;br /&gt;&lt;pre class="sql" name="code"&gt;select &lt;br /&gt;C.INT_PSEFS_ID&lt;br /&gt;, C.ACCOUNT_ID&lt;br /&gt;, C.PSEFS_ID,IS_PQ&lt;br /&gt;, C.psefs_save_date&lt;br /&gt;from MYSCH.PSEFS_MSTR C&lt;br /&gt;where&lt;br /&gt;   SUBSTR(C.PSEFS_ID,1,13) in&lt;br /&gt;   (&lt;br /&gt;   select  SUBSTR(A.PSEFS_ID,1,13)&lt;br /&gt;   from MYSCH.PSEFS_MSTR  A&lt;br /&gt;    where  A.IS_VALID = 'N'&lt;br /&gt;     and A.PSEFS_COMP_DATE  &amp;lt;= SYSDATE - 45 &lt;br /&gt;     and exists ( select 1 from MYSCH.PSEFS_DTLS B&lt;br /&gt;     where A.int_psefs_id = B.int_psefs_id&lt;br /&gt;       and B.PSEFS_STATUS_ID IN (4, 6) )&lt;br /&gt;   ) ;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Now the execution plan looks like: &lt;br /&gt;&lt;pre class="sql" name="code"&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation              | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT       |               |    26M|  1182M|       |  1174K  (3)| 03:54:49 |&lt;br /&gt;|*  1 |  HASH JOIN RIGHT SEMI  |               |    26M|  1182M|   387M|  1174K  (3)| 03:54:49 |&lt;br /&gt;|   2 |   VIEW                 | VW_NSO_1      |    20M|   155M|       |   839K  (3)| 02:47:49 |&lt;br /&gt;|*  3 |    HASH JOIN RIGHT SEMI|               |    20M|   794M|   550M|   839K  (3)| 02:47:49 |&lt;br /&gt;|*  4 |     TABLE ACCESS FULL  | PSEFS_DTLS    |    26M|   250M|       |   612K  (2)| 02:02:29 |&lt;br /&gt;|*  5 |     TABLE ACCESS FULL  | PSEFS_MSTR    |    20M|   600M|       |   156K  (6)| 00:31:17 |&lt;br /&gt;|   6 |   TABLE ACCESS FULL    | PSEFS_MSTR    |    65M|  2445M|       |   153K  (4)| 00:30:45 |&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;div class="sql" name="code"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="sql" name="code"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zxHvZ7comR4/TVrc178zepI/AAAAAAAAABs/kTNjuGDKKqg/s1600/good.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" h5="true" height="253" src="http://4.bp.blogspot.com/-zxHvZ7comR4/TVrc178zepI/AAAAAAAAABs/kTNjuGDKKqg/s320/good.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 1. Good&amp;nbsp;query visual&amp;nbsp;representation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;﻿﻿﻿ &lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-HyK35XD4glI/TVrcf_pU0kI/AAAAAAAAABo/zKucK8zwwTg/s1600/bad.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" h5="true" height="190" src="http://3.bp.blogspot.com/-HyK35XD4glI/TVrcf_pU0kI/AAAAAAAAABo/zKucK8zwwTg/s320/bad.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 2.&amp;nbsp;Bad query visual representaion&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;﻿﻿﻿ &lt;div class="sql" name="code"&gt;&lt;br /&gt;Note: though this sql is actually rather simple, the visual approach advocated by Jonathan Lewis in this &lt;a href="http://www.simple-talk.com/sql/performance/designing-efficient-sql-a-visual-approach/"&gt;article&lt;/a&gt;&amp;nbsp;really helps me to do the analysis&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8615761548823908946?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8615761548823908946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8615761548823908946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8615761548823908946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8615761548823908946'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/tuning-inefficient-sql-with-semi-join.html' title='Tuning an inefficient SQL with semi-join'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-zxHvZ7comR4/TVrc178zepI/AAAAAAAAABs/kTNjuGDKKqg/s72-c/good.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-200036200321231647</id><published>2011-02-14T09:45:00.000-05:00</published><updated>2011-02-14T09:45:56.625-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Open a HTML file from Cygwin command line</title><content type='html'>&lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; allows me have a UNIX-link enviroment inside my Windows XP environment. As a Cygwin user, sometimes I would like to open a HTML file from Cygwin command line. To achieve this, first of all I create the following file and put under ~/bin.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;---- start of ie.bat -----&lt;br /&gt;@start "" /b "C:\Program Files\Internet Explorer\iexplore.exe" %*&lt;br /&gt;---- end of ie.bat  ------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Secondly, in Cygwin, if we type pwd, we get UNIX-like current path name, i.e. with forward slashs, for example:&lt;br /&gt;&lt;pre&gt;$ pwd&lt;br /&gt;/cygdrive/c/Denis_Files/VZ2009&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I need to convert it to Windows path name, so I create a shell script as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ cat ~/bin/pwdw&lt;br /&gt;pwd | sed s#/cygdrive/c#c:# |sed  -e 's#\/#\\#g'&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now if I type 'pwdw' in the Cygwin command windows, I got:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ pwdw&lt;br /&gt;c:\Denis_Files\VZ2009&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To start a HTML file, such as AWR report, what I need to do is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ie.bat 'c:\Denis_Files\VZ2009\awrrpt_20101003_1300_1330.html'&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Just a small tip that makes my life easier :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-200036200321231647?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/200036200321231647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=200036200321231647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/200036200321231647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/200036200321231647'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/open-html-file-from-cygwin-command-line.html' title='Open a HTML file from Cygwin command line'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8124113494564025097</id><published>2011-02-09T20:01:00.000-05:00</published><updated>2011-02-09T20:01:21.581-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='wait event'/><title type='text'>Quick notes about troubleshooting a blocker issue involving an insert</title><content type='html'>Called to help troubleshooting a production issue: an insert statemnt blocked many others. However, when I checked the database on 7:30 PM, the symptoms&amp;nbsp;have gone.&lt;br /&gt;&lt;br /&gt;In retrospective, the problem&amp;nbsp;is most &amp;nbsp;likely due to&amp;nbsp;a configuration issue in context of DMT. This database was upgraded to 10g a year ago from 8i. A few tablespaces is still dictionary-managed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the AWR "Top 5 Timed Events" during the problem period:&lt;br /&gt;&lt;br /&gt;Top 5 Timed Events (18:30 -19:00) &lt;br /&gt;&lt;br /&gt;Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;enq: TX - contention 44,494 130,783 2,939 59.7 Other &lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;enq: ST - contention 27,122 79,719 2,939 36.4 Configuration &lt;/span&gt;&lt;br /&gt;CPU time 3,700 1.7 &lt;br /&gt;read by other session 839,265 2,843 3 1.3 User I/O &lt;br /&gt;db file scattered read 405,142 2,121 5 1.0 User I/O &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From: &lt;a href="http://www.saptechies.com/faq-oracle-enqueues/"&gt;http://www.saptechies.com/faq-oracle-enqueues/&lt;/a&gt;,&amp;nbsp; we can read some info about Oracle enqueue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;System enqueues:&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;ST (space transaction enqueue): This enqueue is held in dictionary-managed tablespaces within extent allocations and releases. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;TYPE = ST&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Very large numbers of extents are allocated or deallocated. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;You can solve the problem permanently by using LMTS instead of DMTS (refer to Notes 214995 and 659946). If you use DMTS, you must ensure that the extents of temporary segments, tables and indexes are sufficiently big so that you can avoid large quantities of extents being allocated and deallocated.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I wan able to find&amp;nbsp;the blocker&amp;nbsp;from the&amp;nbsp;DBA_HIST_ACTIVE_SESS_HISTORY view. Drunig 18:30 - 19:00 Session 651 is blocking many other sessions, which either wait for enq: TX or enq:ST&amp;nbsp; for examples:&lt;br /&gt;&lt;br /&gt;SAMPLE_TIME SESSION_ID SQL_ID EVENT BLOCKING_SESSION&lt;br /&gt;&lt;br /&gt;---------------------------------------- ---------- ------------- ------------------------------ ----------------&lt;br /&gt;08-FEB-11 06.59.56.243 PM 242 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 345 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 414 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 469 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 591 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 593 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 594 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 595 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 596 6wyrqa50whrjg enq: TX - contention 651&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SAMPLE_TIME SESSION_ID SQL_ID EVENT BLOCKING_SESSION&lt;br /&gt;---------------------------------------- ---------- ------------- ------------------------------ ----------------&lt;br /&gt;08-FEB-11 06.59.56.243 PM 1976 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 49 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 1841 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 1763 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 1693 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;08-FEB-11 06.59.56.243 PM 1660 dpc1k1djg5gh0 enq: ST - contention 651&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;Session 651 that was doing the same insert lasted about 1hour, from about 6:17 to 7:15&lt;br /&gt;&lt;br /&gt;SAMPLE_TIME SESSION_ID SQL_ID EVENT BLOCKING_SESSION&lt;br /&gt;---------------------------------------- ---------- ------------- ------------------------------ ----------------&lt;br /&gt;08-FEB-11 06.17.23.778 PM 651 6wyrqa50whrjg&lt;br /&gt;08-FEB-11 06.17.33.998 PM 651 6wyrqa50whrjg&lt;br /&gt;08-FEB-11 06.17.44.198 PM 651 6wyrqa50whrjg&lt;br /&gt;08-FEB-11 06.17.54.508 PM 651 6wyrqa50whrjg&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;08-FEB-11 07.14.45.919 PM 651 6wyrqa50whrjg&lt;br /&gt;08-FEB-11 07.14.56.049 PM 651 6wyrqa50whrjg&lt;br /&gt;08-FEB-11 07.15.06.159 PM 651 6wyrqa50whrjg&lt;br /&gt;-- end --&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After this&amp;nbsp;sql (&amp;nbsp;6wyrqa50whrjg&amp;nbsp; is an&amp;nbsp; simple insert into a table) was done, things become normal.&amp;nbsp; I am still not sure why this insert took so long. I was unable to know what wait event it was experiencing. Apparantly, Oracle was allocating a new extent to the table segment, but why took about an hour?&amp;nbsp;The table&amp;nbsp;referred in the SQL has two extents now, first one has 64000 blocks, the second has 16000 blocks. &lt;br /&gt;&lt;br /&gt;So the scenario&amp;nbsp;appeared to be&amp;nbsp;that a session wants to insert a row into a table that resides in a DMT tablespace, but&amp;nbsp; the table segment is run out of space, Oracle firstly has to allocate a new extent to the table segment; the session is waiting for this allocation to complete; it blocks all other sessions doing the same insert into the same table with the latter waiting for enq:TX. It also blocks other sessions with enq:ST events, &amp;nbsp;which&amp;nbsp; are doing DML on&amp;nbsp; different tables&amp;nbsp; that resides in the same tablespace. &lt;br /&gt;&lt;br /&gt;Anyway we&amp;nbsp;really need to migrate DMT to LMT asap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8124113494564025097?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8124113494564025097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8124113494564025097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8124113494564025097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8124113494564025097'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/02/quick-notes-about-troubleshooting.html' title='Quick notes about troubleshooting a blocker issue involving an insert'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-7061494560503319714</id><published>2011-01-10T20:36:00.000-05:00</published><updated>2011-01-10T20:36:21.800-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rank'/><title type='text'>Using analytical function rank() - an example of improving query performance</title><content type='html'>Today, I have encountered a sql in a production database, which looks like&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select distinct rs, bid, &lt;br /&gt;     [some_other_cols ...  ]&lt;br /&gt;  from&lt;br /&gt;     prod_table n&lt;br /&gt;   where ee_date in (&lt;br /&gt;       select max(ee_date) from&lt;br /&gt;                prod_table n1&lt;br /&gt;           where n1.bid = n.bid&lt;br /&gt;             and n1.cc = n.cc&lt;br /&gt;             and n1.rs=n.rs)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation             | Name          | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;---------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT      |               |   571 | 51390 |   197   (4)| 00:00:03 |&lt;br /&gt;|   1 |  HASH UNIQUE          |               |   571 | 51390 |   197   (4)| 00:00:03 |&lt;br /&gt;|*  2 |   FILTER              |               |       |       |            |          |&lt;br /&gt;|   3 |    HASH GROUP BY      |               |   571 | 51390 |   197   (4)| 00:00:03 |&lt;br /&gt;|*  4 |     HASH JOIN         |               | 22250 |  1955K|   194   (3)| 00:00:03 |&lt;br /&gt;|   5 |      TABLE ACCESS FULL| PROD_TABLE    | 22250 |   738K|    96   (2)| 00:00:02 |&lt;br /&gt;|   6 |      TABLE ACCESS FULL| PROD_TABLE    | 22250 |  1216K|    97   (3)| 00:00:02 |&lt;br /&gt;---------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It contains  a correlated sub-query. I rewrote it by using the analytical function  rank(). I found that the consistent gets reduced by half&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select distinct rs,bid, &lt;br /&gt;     [some_other_cols ...  ]&lt;br /&gt;    from&lt;br /&gt;    (&lt;br /&gt;    select  n1.*,&lt;br /&gt;           rank() over ( partition by bid, cc, rs order by ee_date desc ) rank&lt;br /&gt;    from  prod_table n1&lt;br /&gt;    )&lt;br /&gt;    where rank =1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                 | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time&lt;br /&gt;-------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT          |               | 22250 |   956K|       |   602   (2)| 00:00:08&lt;br /&gt;|   1 |  HASH UNIQUE              |               | 22250 |   956K|  2984K|   602   (2)| 00:00:08&lt;br /&gt;|*  2 |   VIEW                    |               | 22250 |   956K|       |   350   (2)| 00:00:05&lt;br /&gt;|*  3 |    WINDOW SORT PUSHED RANK|               | 22250 |   956K|  2984K|   350   (2)| 00:00:05&lt;br /&gt;|   4 |     TABLE ACCESS FULL     | PROD_TABLE    | 22250 |   956K|       |    98   (4)| 00:00:02&lt;br /&gt;-------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-7061494560503319714?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/7061494560503319714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=7061494560503319714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7061494560503319714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7061494560503319714'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2011/01/using-analytical-function-rank-example.html' title='Using analytical function rank() - an example of improving query performance'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-3119703096471630797</id><published>2010-10-20T16:41:00.002-04:00</published><updated>2010-10-20T21:36:57.344-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CBO'/><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>Composite index selectivity</title><content type='html'>I did tests with 10053 trace today and found that Oracle CBO behavior changes regarding compute selectivity of 3-column composite index from 9.2.0.8 to 10.2.0.4. (note: no histogram on any columns)&lt;br /&gt;&lt;br /&gt;In 9i: selectivty of index(col1, col2, col3)= density (co11) x denisty (col2) x denisity(col3); &lt;br /&gt;&lt;br /&gt;In 10g and 11g selectivity of index(col1, col2, col3) = 1/DISTINCT_KEYS where DISTINCT_KEYS is from index stats obtainable through dba_indexes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the test case which mimics the production able and the problem sql.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;----- begin of the test case ----&lt;br /&gt;&lt;br /&gt;drop table test;&lt;br /&gt;create table test&lt;br /&gt;as&lt;br /&gt;select level id,&lt;br /&gt;       trunc(mod(level,80)) id1,&lt;br /&gt;       20*trunc(mod(level, 40)) id2,&lt;br /&gt;       1    id3,&lt;br /&gt;       trunc(mod(level,50)) id4&lt;br /&gt;from dual&lt;br /&gt;connect by level &amp;lt;=1000000;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;create index test_ix1 on test(id1, id2, id3);&lt;br /&gt;&lt;br /&gt;exec dbms_stats.gather_table_stats(user,'test', method_opt=&amp;gt;'FOR ALL COLUMNS size 1', cascade=&amp;gt;true);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;alter session set tracefile_identifier = test;&lt;br /&gt;ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';&lt;br /&gt;&lt;br /&gt;explain plan for&lt;br /&gt;select id&lt;br /&gt;from test&lt;br /&gt;where id1 = 20&lt;br /&gt;and id3=1&lt;br /&gt;and id2 = 400;&lt;br /&gt;&lt;br /&gt;ALTER SESSION SET EVENTS '10053 trace name context off';&lt;br /&gt;Exit&lt;br /&gt;------ end of test case  -----------------------&lt;br /&gt;&lt;br /&gt;#### 9.2.0.8  10053 trace excerpt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;***************************************&lt;br /&gt;SINGLE TABLE ACCESS PATH&lt;br /&gt;Column:        ID1  Col#: 2      Table: TEST   Alias: TEST&lt;br /&gt;    NDV: 80        NULLS: 0         DENS: 1.2500e-02 LO:  0  HI: 79&lt;br /&gt;    NO HISTOGRAM: #BKT: 1 #VAL: 2&lt;br /&gt;Column:        ID3  Col#: 4      Table: TEST   Alias: TEST&lt;br /&gt;    NDV: 1         NULLS: 0         DENS: 1.0000e+00 LO:  1  HI: 1&lt;br /&gt;    NO HISTOGRAM: #BKT: 1 #VAL: 2&lt;br /&gt;Column:        ID2  Col#: 3      Table: TEST   Alias: TEST&lt;br /&gt;    NDV: 40        NULLS: 0         DENS: 2.5000e-02 LO:  0  HI: 780&lt;br /&gt;    NO HISTOGRAM: #BKT: 1 #VAL: 2&lt;br /&gt;  TABLE: TEST     ORIG CDN: 1000000  ROUNDED CDN: 313  CMPTD CDN: 313&lt;br /&gt;  Access path: tsc  Resc:  857  Resp:  847&lt;br /&gt;  Access path: index (equal)&lt;br /&gt;      Index: TEST_IX1&lt;br /&gt;  TABLE: TEST&lt;br /&gt;      RSC_CPU: 711380   RSC_IO: 82&lt;br /&gt;  IX_SEL:  0.0000e+00  TB_SEL:  3.1250e-04&lt;br /&gt;  BEST_CST: 83.00  PATH: 4  Degree:  1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#### 10.2.0.4  10053 trace excerpt&lt;br /&gt;&lt;br /&gt;***************************************&lt;br /&gt;SINGLE TABLE ACCESS PATH&lt;br /&gt;  -----------------------------------------&lt;br /&gt;  BEGIN Single Table Cardinality Estimation&lt;br /&gt;  -----------------------------------------&lt;br /&gt;  Column (#2): ID1(NUMBER)&lt;br /&gt;    AvgLen: 3.00 NDV: 81 Nulls: 0 Density: 0.012346 Min: 0 Max: 79&lt;br /&gt;  Column (#4): ID3(NUMBER)&lt;br /&gt;    AvgLen: 3.00 NDV: 1 Nulls: 0 Density: 1 Min: 1 Max: 1&lt;br /&gt;  Column (#3): ID2(NUMBER)&lt;br /&gt;    AvgLen: 4.00 NDV: 40 Nulls: 0 Density: 0.025 Min: 0 Max: 780&lt;br /&gt;  Table: TEST  Alias: TEST&lt;br /&gt;    Card: Original: 1003092  Rounded: 310  Computed: 309.60  Non Adjusted: 309.60&lt;br /&gt;  -----------------------------------------&lt;br /&gt;  END   Single Table Cardinality Estimation&lt;br /&gt;  -----------------------------------------&lt;br /&gt;  Access Path: TableScan&lt;br /&gt;    Cost:  730.88  Resp: 730.88  Degree: 0&lt;br /&gt;      Cost_io: 700.00  Cost_cpu: 284170229&lt;br /&gt;      Resp_io: 700.00  Resp_cpu: 284170229&lt;br /&gt;  Access Path: index (AllEqRange)&lt;br /&gt;    Index: TEST_IX1&lt;br /&gt;    resc_io: 3173.00  resc_cpu: 27721329&lt;br /&gt;    ix_sel: 0.0125  ix_sel_with_filters: 0.0125&lt;br /&gt;    Cost: 3176.01  Resp: 3176.01  Degree: 1&lt;br /&gt;  Best:: AccessPath: TableScan&lt;br /&gt;         Cost: 730.88  Degree: 1  Resp: 730.88  Card: 309.60  Bytes: 0&lt;br /&gt;&lt;br /&gt;Note:&lt;br /&gt;select index_name, distinct_keys from user_indexes where index_name='TEST_IX1';&lt;br /&gt;&lt;br /&gt;INDEX_NAME                     DISTINCT_KEYS&lt;br /&gt;------------------------------ -------------&lt;br /&gt;TEST_IX1                                  80&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#### 11.2.0.1  10053 trace excerpt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;***************************************&lt;br /&gt;SINGLE TABLE ACCESS PATH&lt;br /&gt;  Single Table Cardinality Estimation for TEST[TEST]&lt;br /&gt;  ColGroup (#1, Index) TEST_IX1&lt;br /&gt;    Col#: 2 3 4    CorStregth: 40.00&lt;br /&gt;  ColGroup Usage:: PredCnt: 3  Matches Full: #1  Partial:  Sel: 0.0125&lt;br /&gt;  Table: TEST  Alias: TEST&lt;br /&gt;    Card: Original: 1000000.000000  Rounded: 12500  Computed: 12500.00  Non Adjusted: 12500.00&lt;br /&gt;  Access Path: TableScan&lt;br /&gt;    Cost:  629.80  Resp: 629.80  Degree: 0&lt;br /&gt;      Cost_io: 617.00  Cost_cpu: 283372261&lt;br /&gt;      Resp_io: 617.00  Resp_cpu: 283372261&lt;br /&gt;  ColGroup Usage:: PredCnt: 3  Matches Full: #1  Partial:  Sel: 0.0125&lt;br /&gt;  ColGroup Usage:: PredCnt: 3  Matches Full: #1  Partial:  Sel: 0.0125&lt;br /&gt;  Access Path: index (AllEqRange)&lt;br /&gt;    Index: TEST_IX1&lt;br /&gt;    resc_io: 3173.00  resc_cpu: 27721329&lt;br /&gt;    ix_sel: 0.012500  ix_sel_with_filters: 0.012500&lt;br /&gt;    Cost: 3174.25  Resp: 3174.25  Degree: 1&lt;br /&gt;  Best:: AccessPath: TableScan&lt;br /&gt;         Cost: 629.80  Degree: 1  Resp: 629.80  Card: 12500.00  Bytes: 0&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Notice the ix_sel line in the above 10053 trace excerpt; for 10g and 11g it equal to 1/80. for 9i seems computed through multiplying selectivity of eeach column.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;Came accross Jonathan Lewis's comment, and came to know this CBO behavior changes acctually from 10.1.0.4 ie. 10.1.0.4 is still similar to 9i behavior.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Below is his comment: (&lt;a href="http://kr.forums.oracle.com/forums/thread.jspa?messageID=3153224"&gt;http://kr.forums.oracle.com/forums/thread.jspa?messageID=3153224&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;-------- &lt;br /&gt;For a single-table query with the predicate&lt;br /&gt;(full list of index columns) = (set of values)&lt;br /&gt;&lt;br /&gt;The selectivities vary across version as follows:&lt;br /&gt;&lt;br /&gt;11.1.0.6: Table selectivity and index selectivity given by distinct_keys in index&lt;br /&gt;10.2.0.1: Table selectivity given by product of column selectivities, index selectivity given by distinct_keys in index&lt;br /&gt;10.1.0.4: Table selectivity and index selectivity given by product of column selectivities&lt;br /&gt;&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;JL's original post about this behavior: &lt;a href="http://jonathanlewis.wordpress.com/2008/03/11/everything-changes/"&gt;http://jonathanlewis.wordpress.com/2008/03/11/everything-changes/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-3119703096471630797?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/3119703096471630797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=3119703096471630797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3119703096471630797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3119703096471630797'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/10/composite-index-selectivity.html' title='Composite index selectivity'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-5863136672323835017</id><published>2010-09-15T21:45:00.000-04:00</published><updated>2010-09-15T21:45:59.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Privileges to enable a non-DBA user to generate AWR report</title><content type='html'>The following privileges seem working for the stated purpose:&lt;br /&gt;&lt;br /&gt;GRANT SELECT ON SYS.V_$DATABASE TO  xxx &lt;br /&gt;/&lt;br /&gt;GRANT SELECT ON SYS.V_$INSTANCE TO  xxx &lt;br /&gt;/&lt;br /&gt;GRANT EXECUTE ON SYS.DBMS_WORKLOAD_REPOSITORY TO xxx &lt;br /&gt;/&lt;br /&gt;GRANT SELECT ON SYS.DBA_HIST_DATABASE_INSTANCE TO xxx &lt;br /&gt;/&lt;br /&gt;GRANT SELECT ON SYS.DBA_HIST_SNAPSHOT TO  xxx &lt;br /&gt;/&lt;br /&gt;GRANT ADVISOR TO xxx &lt;br /&gt;/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-5863136672323835017?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/5863136672323835017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=5863136672323835017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5863136672323835017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5863136672323835017'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/09/privileges-to-enable-non-dba-user-to.html' title='Privileges to enable a non-DBA user to generate AWR report'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-133130796038899192</id><published>2010-08-16T19:24:00.000-04:00</published><updated>2010-08-16T19:24:39.517-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cursor_sharing'/><title type='text'>CURSOR_SHARING and PL/SQL procedure</title><content type='html'>With cursor_sharing=FORCE, in most cases, Oracle will replace literal values with bind variables, however,this is not the case for PL/SQL blocks. See the following test case. When using CALL proc_name(), it can. This behavior is mentioned in Jonathen Lewis's book "Cost-based Oracle Fundamentals" p159.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt;alter session set cursor_sharing=force;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;drop table t;&lt;br /&gt;&lt;br /&gt;Table dropped.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;create table t(a number);&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;create or replace procedure denis_proc(a in number)&lt;br /&gt;  2   is&lt;br /&gt;  3  begin&lt;br /&gt;  4    insert into t values(a);&lt;br /&gt;  5   commit;&lt;br /&gt;  6  end;&lt;br /&gt;  7  /&lt;br /&gt;&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;exec denis_proc(1);&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;exec denis_proc(2);&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;exec denis_proc(3);&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;call denis_proc(4);&lt;br /&gt;&lt;br /&gt;Call completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;call denis_proc(5);&lt;br /&gt;&lt;br /&gt;Call completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;call denis_proc(6);&lt;br /&gt;&lt;br /&gt;Call completed.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;col sql_text format a30&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;select sql_id, executions, sql_text from v$sqlarea where sql_text like '%denis_proc%';&lt;br /&gt;&lt;br /&gt;SQL_ID1G        EXECUTIONS SQL_TEXT&lt;br /&gt;------------- ---------- ------------------------------&lt;br /&gt;1ms5rkrgwt28v          1 BEGIN denis_proc(1); END;&lt;br /&gt;0vcasv51bxgpv          1 BEGIN denis_proc(3); END;&lt;br /&gt;dcna79fxryrkx          1 BEGIN denis_proc(2); END;&lt;br /&gt;6skbuvu6fb9k0          3 call denis_proc(:"SYS_B_0")&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;select * from t;&lt;br /&gt;&lt;br /&gt;         A&lt;br /&gt;----------&lt;br /&gt;         1&lt;br /&gt;         2&lt;br /&gt;         3&lt;br /&gt;         4&lt;br /&gt;         5&lt;br /&gt;         6&lt;br /&gt;&lt;br /&gt;6 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-133130796038899192?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/133130796038899192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=133130796038899192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/133130796038899192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/133130796038899192'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/08/cursorsharing-and-plsql-procedure.html' title='CURSOR_SHARING and PL/SQL procedure'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2150432438283814558</id><published>2010-08-03T13:22:00.002-04:00</published><updated>2010-08-03T13:25:11.351-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Effect of a SQL* Plus environment variable: set pagesize 0</title><content type='html'>Last night, I troubleshooted a ksh shell script, in which a variable is assigned a value that is returned from SQL* Plus commands. I found that without 'set pagesize 0', the value&amp;nbsp;returned had an undesirable leading space. Below is a test case that demonstrate this effect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; select col1, col3 from t;&lt;br /&gt; &lt;br /&gt;      COL1 C&lt;br /&gt;---------- -&lt;br /&gt;         1 Y&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat test3.sh &lt;br /&gt;#!/bin/ksh &lt;br /&gt; &lt;br /&gt;RET1=` sqlplus -s  / &amp;lt;&amp;lt; EOF&lt;br /&gt;set  echo off head off feed off verify off term off  &lt;br /&gt;select col3 from t&lt;br /&gt;where  col1=1;&lt;br /&gt;EOF&lt;br /&gt;`&lt;br /&gt; &lt;br /&gt;echo "RET1  &amp;gt;&amp;gt;&amp;gt;&amp;gt;"$RET1"&amp;lt;&amp;lt;&amp;lt;&amp;lt;"&lt;br /&gt;if [[ $RET1 == 'Y' ]]; then&lt;br /&gt;  echo "Yes"&lt;br /&gt;else&lt;br /&gt;  echo "No"&lt;br /&gt;fi&lt;br /&gt; &lt;br /&gt;RET2=` sqlplus -s  / &amp;lt;&amp;lt; EOF&lt;br /&gt;set echo off head off feed off verify off term off &lt;br /&gt;set pagesize 0&lt;br /&gt;select col3 from t&lt;br /&gt;where  col1=1;&lt;br /&gt;EOF&lt;br /&gt;`&lt;br /&gt; &lt;br /&gt;echo "RET2  &amp;gt;&amp;gt;&amp;gt;&amp;gt;"$RET2"&amp;lt;&amp;lt;&amp;lt;&amp;lt;"&lt;br /&gt;if [[ $RET2 == 'Y' ]]; then&lt;br /&gt;  echo "Yes"&lt;br /&gt;else&lt;br /&gt;  echo "No"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ ./test3.sh &lt;br /&gt;RET1  &amp;gt;&amp;gt;&amp;gt;&amp;gt; Y&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;No&lt;br /&gt;RET2  &amp;gt;&amp;gt;&amp;gt;&amp;gt;Y&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;Yes&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2150432438283814558?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2150432438283814558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2150432438283814558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2150432438283814558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2150432438283814558'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/08/effect-of-sql-plus-environment-variable.html' title='Effect of a SQL* Plus environment variable: set pagesize 0'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-349503190758602437</id><published>2010-05-26T11:20:00.002-04:00</published><updated>2010-05-27T06:59:25.908-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>Tuning by cardinality feedback and understanding of  join cardinality and transitive closure</title><content type='html'>What comes out of my recent tuning experience of a 13-table join query is my deeper understanding of &lt;a href="http://www.centrexcc.com/Tuning%20by%20Cardinality%20Feedback.pdf"&gt;"Tuning by Cardinality Feedback",&lt;/a&gt; join cardinality and transitive closure. The problem for that 13-table join SQL is that Oracle predictes the join cardinality to be 1 always so it chooses nested loop join, whereas the hash join is able to bring the consistent gets from 400K to 6K.&lt;br /&gt;&lt;br /&gt;First of all, let's see where the cardinality estimation is wrong. Below are the estimated cardinality from each operations in the first 4-table join: PACKAGE_MARKETS -&amp;gt; MARKETS -&amp;gt; PACKAGE_CATEGORY -&amp;gt; PACKAGE_PRODUCTS&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;10    9       NESTED LOOPS (Cost=10 Card=1 Bytes=522)&lt;br /&gt;  11   10         NESTED LOOPS (Cost=9 Card=1 Bytes=325)&lt;br /&gt;  12   11           NESTED LOOPS (Cost=4 Card=1 Bytes=229)&lt;br /&gt;  13   12             NESTED LOOPS (Cost=3 Card=1 Bytes=224)&lt;br /&gt;  14   13               NESTED LOOPS (Cost=2 Card=1 Bytes=104)&lt;br /&gt;  15   14                 INDEX (UNIQUE SCAN) OF 'PK_PACKAGE_MARKETS' (UNIQUE) (Cost=1 Card=1 Bytes=12)&lt;br /&gt;  16   14                 TABLE ACCESS (BY INDEX ROWID) OF 'MARKETS' (Cost=1 Card=1 Bytes=92)&lt;br /&gt;  17   16                   INDEX (UNIQUE SCAN) OF 'PK_MARKETS' (UNIQUE)&lt;br /&gt;  18   13               TABLE ACCESS (BY INDEX ROWID) OF 'PACKAGES' (Cost=1 Card=1 Bytes=120)&lt;br /&gt;  19   18                 INDEX (UNIQUE SCAN) OF 'PK_PACKAGES' (UNIQUE)&lt;br /&gt;  20   12             TABLE ACCESS (BY INDEX ROWID) OF 'PACKAGE_CATEGORY' (Cost=1 Card=1 Bytes=5)&lt;br /&gt;  21   20               INDEX (UNIQUE SCAN) OF 'PK_PACKAGE_CATEGORY' (UNIQUE)&lt;br /&gt;  22   11           TABLE ACCESS (BY INDEX ROWID) OF &lt;span style="color: red;"&gt;'PACKAGE_PRODUCTS' (Cost=5 Card=1&lt;/span&gt; Bytes=96)&lt;br /&gt;  23   22             INDEX (RANGE SCAN) OF 'PK_PACKAGE_PRODUCTS' (UNIQUE) (Cost=2 Card=6)&lt;br /&gt;  24   10         TABLE ACCESS (BY INDEX ROWID) OF 'PRODUCTS' (Cost=1 Card=1 Bytes=197&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Below are the real cardinalities obtained from SQL_TRACE/TKPROF. we can see the real cardinality coming out of PACKAGE_PRODUCTS table is 2725 and the estimated one is 1 as shown above. This is where the whole execution plan becomes "wrong".&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;2725         NESTED LOOPS&lt;br /&gt;      1          NESTED LOOPS&lt;br /&gt;      1           NESTED LOOPS&lt;br /&gt;      1            NESTED LOOPS&lt;br /&gt;      1             INDEX UNIQUE SCAN PK_PACKAGE_MARKETS (object id 423961)&lt;br /&gt;      1             TABLE ACCESS BY INDEX ROWID MARKETS&lt;br /&gt;      1              INDEX UNIQUE SCAN PK_MARKETS (object id 423924)&lt;br /&gt;      1            TABLE ACCESS BY INDEX ROWID PACKAGES&lt;br /&gt;      1             INDEX UNIQUE SCAN PK_PACKAGES (object id 423954)&lt;br /&gt;      1           TABLE ACCESS BY INDEX ROWID PACKAGE_CATEGORY&lt;br /&gt;      1            INDEX UNIQUE SCAN PK_PACKAGE_CATEGORY (object id 423956)&lt;br /&gt;   &lt;span style="color: red;"&gt;2725          TABLE ACCESS BY INDEX ROWID PACKAGE_PRODUCTS&lt;/span&gt;&lt;br /&gt;   2811           INDEX RANGE SCAN PK_PACKAGE_PRODUCTS (object id 423963)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What I did is to add hints to force Oracle choose hash join instead of nested loop join for the remaining 9 tables.&lt;br /&gt;&lt;br /&gt;This execersie also arouse my insterest to understand how join cardinality is calculated, thus I re-read Chapter 10 of Jonanth Lewis's Cost-Based Oracle Fundamentals. I found what he says is true ( as always :-)). Below is a test case output for a two table join SQL that involves "transitive closure" - there is a filter on the join column:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt;select * from v$version;&lt;br /&gt;&lt;br /&gt;BANNER&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production&lt;br /&gt;PL/SQL Release 9.2.0.8.0 - Production&lt;br /&gt;CORE 9.2.0.8.0 Production&lt;br /&gt;TNS for Solaris: Version 9.2.0.8.0 - Production&lt;br /&gt;NLSRTL Version 9.2.0.8.0 - Production&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;-- from the count we know the acutual join cardinality should be 86&lt;br /&gt;SQL&amp;gt;select count(*) from packages where package_id='Y9995';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         1&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select count(*) from package_products where package_id='Y9995';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;        86&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;-- JL mentioned "query_reworte_enabled" has impact on join predicate removal&lt;br /&gt;SQL&amp;gt;-- prior to 10g in hist book "Cost-Based Oracle Fundamentals"&lt;br /&gt;SQL&amp;gt;-- I confirmed it is true in our 9i db. I also tested with rewrite/nowrite hints&lt;br /&gt;SQL&amp;gt;-- instead of session level "query_rewrite_enabled parameter". No impact&lt;br /&gt;SQL&amp;gt;-- from the hints.&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;show parameter query_rewrite_enabled&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;query_rewrite_enabled                string      TRUE&lt;br /&gt;SQL&amp;gt;alter session set query_rewrite_enabled=true;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;-- query_rewrite_enabled=true&lt;br /&gt;SQL&amp;gt;explain plan for&lt;br /&gt;  2  select  *&lt;br /&gt;  3    from  packages a,   -- NROWS 2656&lt;br /&gt;  4        package_products b   -- NROWS 284247&lt;br /&gt;  5   where a.package_id   -- NDV  2656 PK&lt;br /&gt;  6       = b.package_id   -- NDV  2610 NOT NULL&lt;br /&gt;  7   and a.package_id = 'Y9995'&lt;br /&gt;  8  ;&lt;br /&gt;&lt;br /&gt;Explained.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;select * from table(dbms_xplan.display);&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                    |  Name                | Rows  | Bytes | Cost  |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT             |                      |     1 |   240 |     5 |&lt;br /&gt;|   1 |  NESTED LOOPS                |                      |     1 |   240 |     5 |&lt;br /&gt;|   2 |   TABLE ACCESS BY INDEX ROWID| PACKAGES             |     1 |   144 |     2 |&lt;br /&gt;|*  3 |    INDEX UNIQUE SCAN         | PK_PACKAGES          |     1 |       |     1 |&lt;br /&gt;|   4 |   TABLE ACCESS BY INDEX ROWID| PACKAGE_PRODUCTS     |     1 |    96 |     3 |&lt;br /&gt;|*  5 |    INDEX RANGE SCAN          | PK_PACKAGE_PRODUCTS  |     1 |       |     2 |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   3 - access("A"."PACKAGE_ID"='Y9995')&lt;br /&gt;   5 - access("B"."PACKAGE_ID"='Y9995')&lt;br /&gt;       filter("A"."PACKAGE_ID"="B"."PACKAGE_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;20 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;alter session set query_rewrite_enabled=false;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;-- query_rewrite_enabled=false&lt;br /&gt;SQL&amp;gt;explain plan for&lt;br /&gt;  2  select  *&lt;br /&gt;  3    from  packages a,   -- NROWS 2656&lt;br /&gt;  4        package_products b   -- NROWS 284247&lt;br /&gt;  5   where a.package_id   -- NDV  2656 PK&lt;br /&gt;  6       = b.package_id   -- NDV  2610 NOT NULL&lt;br /&gt;  7   and a.package_id = 'Y9995'&lt;br /&gt;  8  ;&lt;br /&gt;&lt;br /&gt;Explained.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;&lt;br /&gt;SQL&amp;gt;select * from table(dbms_xplan.display);&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                    |  Name                | Rows  | Bytes | Cost  |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT             |                      |   109 | 26160 |    52 |&lt;br /&gt;|   1 |  NESTED LOOPS                |                      |   109 | 26160 |    52 |&lt;br /&gt;|   2 |   TABLE ACCESS BY INDEX ROWID| PACKAGES             |     1 |   144 |     2 |&lt;br /&gt;|*  3 |    INDEX UNIQUE SCAN         | PK_PACKAGES          |     1 |       |     1 |&lt;br /&gt;|   4 |   TABLE ACCESS BY INDEX ROWID| PACKAGE_PRODUCTS     |   109 | 10464 |    50 |&lt;br /&gt;|*  5 |    INDEX RANGE SCAN          | PK_PACKAGE_PRODUCTS  |   109 |       |     2 |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   3 - access("A"."PACKAGE_ID"='Y9995')&lt;br /&gt;   5 - access("B"."PACKAGE_ID"='Y9995')&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;19 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The test case showed two scenarios with same SQL and apparently obtained same execution plan, but&lt;br /&gt;1. with query_rewrite_enabled=true, the estimated cardinality is 1 &lt;br /&gt;2. with query_rewrite_enabled=false, the estimated cardinality is 109 &lt;br /&gt;3. There are differences in the "Predicate Information" section of the execution plan. With query_rewrite_enabled=false, there is no join predicate&lt;br /&gt;&lt;br /&gt;So how those cardinilities are calculated by Oracle? If we have two table join in the following form:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select *&lt;br /&gt;  from t1, t2&lt;br /&gt; where t1.c1 = t2.c2&lt;br /&gt;   and filter_predicates_of_t1&lt;br /&gt;   and filter_predicates_of_t2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The basic join cardinality formula is as follows (from "Cost-Based Oracle Fundamentals" p266):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Join Selectivity =&lt;br /&gt;  ((num_rows(t1) - num_nulls(t1.c1)) / num_rows(t1)) *&lt;br /&gt;  ((num_rows(t2) - num_nulls(t2.c2)) / num_rows(t2)) /&lt;br /&gt;  greater(num_distinct(t1.c1), num_distinct(t2.c2))&lt;br /&gt;&lt;br /&gt;Join Cardinality =&lt;br /&gt;   join selectivity *&lt;br /&gt;   filtered cardinality(t1) * filtered cardinality(t2)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In our scenario 1:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Join Selectivity = &lt;br /&gt;  (( 2656 -0) / 2656 ) *&lt;br /&gt;  (( 284247 - 0) / 284247) /&lt;br /&gt;  greater(2656, 2619)&lt;br /&gt;  = 1/2656&lt;br /&gt;&lt;br /&gt;Join Cardinaltiy =&lt;br /&gt;   (1/2656) *&lt;br /&gt;   (2656/2656) * ( 284247 /2610) &lt;br /&gt;   = 0.004 ( rounded to 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In our senario 2, notice we don't have join predicate actually, Oracle eliminated the Join Selectivity part:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Join Cardinlity =&lt;br /&gt;   (2656/2656) * ( 284247 /2610)&lt;br /&gt;   = 109&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;My production 9i database has set query_rewrite_enabled=true. So if I wrote&amp;nbsp;the SQL without the join condition as follows::&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select  *&lt;br /&gt; from  packages a,   -- NROWS 2656&lt;br /&gt;       package_products b   -- NROWS 284247&lt;br /&gt;where&lt;br /&gt;      b.package_id = 'Y9995'&lt;br /&gt;  and a.package_id = 'Y9995'&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I can get the correct cardinality as in the scenaro 2. &lt;br /&gt;&lt;br /&gt;BTW, for example, if a=b, and a=5;&lt;a_constant_value&gt; then b=5&lt;a_constan_value&gt;, this is called "transitive closure".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-349503190758602437?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/349503190758602437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=349503190758602437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/349503190758602437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/349503190758602437'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/05/tuning-by-cardinality-feedback-and.html' title='Tuning by cardinality feedback and understanding of  join cardinality and transitive closure'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2868854866374566717</id><published>2010-05-07T18:15:00.003-04:00</published><updated>2010-05-10T06:23:17.536-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><title type='text'>Play with my toy 10g RAC VII - Voting Disk</title><content type='html'>&lt;span style="background-color: white;"&gt;The voting disk is a shared raw disk partition or file on a clustered file system that is accessible to all nodes in the cluster. Its primary purpose is to help in situations where the private network communication fails. When that happens, the cluster is unable to have all nodes remain available because they are no longer able to synchronize I/O to the shared disks. Therefore, some of the nodes must go offline. The voting disk is then used to communicate the node state information used to determine which nodes go offline.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;If we have 3 nodes,&amp;nbsp; presumably to the voting disk each node will write message as follows:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 1 writes : I can see Node 2 &amp;amp; 3&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 2 writes : I can see Node 1 &amp;amp; 3&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 3 writes : I can see Node 1 &amp;amp; 2&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;If for example Node 3's private network has problem, the message may become:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 1 writes : I can see Node 2 only &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 2 writes : I can see Node 1 only &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Node 3 writes : I can not see either Node 1 or Node 2 ( or it does not write anything)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;In this situation, clearly Node 3 should be evicted from the cluster.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;To avoid a single point of failure, we can multiplex voting disk. By design, if strictly more than half of the voting disks are up and contain consistent information, the cluster will be fine. That is to say if we have 5 voting disks, we can have at most 2 voting disk failures. &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;So the number_of_voting_disk = number_of_tolerable_disk_failure * 2 + 1.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;This post is to document my test with the following task regarding voting disk administration:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Task - Recover from the lost of voting disks&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;1. Check the current voting disk configuration&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 backup]$ &lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; query &lt;span class="goog-spellcheck-word"&gt;css&lt;/span&gt; &lt;span class="goog-spellcheck-word"&gt;votedisk&lt;/span&gt;&lt;br /&gt; 0.     0    /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6&lt;br /&gt; 1.     0    /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7&lt;br /&gt; 2.     0    /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw8&lt;br /&gt;&lt;br /&gt;located 3 &lt;span class="goog-spellcheck-word"&gt;votedisk&lt;/span&gt;(s).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;2. Backup voting disk&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 backup]$ dd if=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6 of=/home/oracle/backup/&lt;span class="goog-spellcheck-word"&gt;votingdisk&lt;/span&gt;_050710&lt;br /&gt;80325+0 records in&lt;br /&gt;80325+0 records out&lt;br /&gt;[oracle@rac1 backup]$&lt;br /&gt;[oracle@rac1 backup]$ ls -&lt;span class="goog-spellcheck-word"&gt;lhtr&lt;/span&gt;&lt;br /&gt;total 40M&lt;br /&gt;-&lt;span class="goog-spellcheck-word"&gt;rw&lt;/span&gt;-r--r--  1 oracle &lt;span class="goog-spellcheck-word"&gt;oinstall&lt;/span&gt; 40M May  7 16:23 &lt;span class="goog-spellcheck-word"&gt;votingdisk&lt;/span&gt;_050710&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;3. Wipe out the first voting disk&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;dd if=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/zero of=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Note: I have three voting disk files, in my understanding, the cluster should survive with 1 voting disk failure, however,rac1 and rac2 reboot right after I issue this command. I don't know why.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;--------------- &lt;span class="goog-spellcheck-word"&gt;RAC&lt;/span&gt; 1 alert log  --------------------&lt;br /&gt; &lt;br /&gt;Fri May  7 16:25:21 2010&lt;br /&gt;Trace dumping is performing id=[&lt;span class="goog-spellcheck-word"&gt;cdmp&lt;/span&gt;_20100507162519]&lt;br /&gt;Fri May  7 16:25:23 2010&lt;br /&gt;Error: &lt;span class="goog-spellcheck-word"&gt;KGXGN&lt;/span&gt; aborts the instance (6)&lt;br /&gt;Fri May  7 16:25:24 2010&lt;br /&gt;Errors in file /u01/app/oracle/admin/&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;bdump&lt;/span&gt;/devdb1_&lt;span class="goog-spellcheck-word"&gt;lmon&lt;/span&gt;_10476.&lt;span class="goog-spellcheck-word"&gt;trc&lt;/span&gt;:&lt;br /&gt;ORA-29702: error occurred in Cluster Group Service operation&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;LMON&lt;/span&gt;: terminating instance due to error 29702&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------- &lt;span class="goog-spellcheck-word"&gt;RAC&lt;/span&gt; 2 alert log --------------------&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ri&lt;/span&gt; May  7 16:25:19 2010&lt;br /&gt;Error: &lt;span class="goog-spellcheck-word"&gt;KGXGN&lt;/span&gt; aborts the instance (6)&lt;br /&gt;Fri May  7 16:25:19 2010&lt;br /&gt;Error: unexpected error (6) from the Cluster Service (LCK0)&lt;br /&gt;Fri May  7 16:25:19 2010&lt;br /&gt;Errors in file /u01/app/oracle/admin/&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;bdump&lt;/span&gt;/devdb2_&lt;span class="goog-spellcheck-word"&gt;lmon&lt;/span&gt;_3150.&lt;span class="goog-spellcheck-word"&gt;trc&lt;/span&gt;:&lt;br /&gt;ORA-29702: error occurred in Cluster Group Service operation&lt;br /&gt;Fri May  7 16:25:19 2010&lt;br /&gt;Errors in file /u01/app/oracle/admin/&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;bdump&lt;/span&gt;/devdb2_lck0_3236.&lt;span class="goog-spellcheck-word"&gt;trc&lt;/span&gt;:&lt;br /&gt;ORA-29702: error occurred in Cluster Group Service operation&lt;br /&gt;Fri May  7 16:25:19 2010&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;LMON&lt;/span&gt;: terminating instance due to error 29702&lt;br /&gt;Fri May  7 16:25:21 2010&lt;br /&gt;System state dump is made for local instance&lt;br /&gt;System State dumped to trace file /u01/app/oracle/admin/&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;bdump&lt;/span&gt;/devdb2_&lt;span class="goog-spellcheck-word"&gt;diag&lt;/span&gt;_3146.&lt;span class="goog-spellcheck-word"&gt;trc&lt;/span&gt;&lt;br /&gt;Fri May  7 16:31:01 2010&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;4. Restart &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; stop &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Password:&lt;br /&gt;Stopping resources.&lt;br /&gt;&lt;br /&gt;Successfully stopped &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; resources&lt;br /&gt;Stopping &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;.&lt;br /&gt;Shutting down &lt;span class="goog-spellcheck-word"&gt;CSS&lt;/span&gt; daemon.&lt;br /&gt;Shutdown request successfully issued.&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; stop &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;Stopping resources.&lt;br /&gt;Successfully stopped &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; resources&lt;br /&gt;Stopping &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;.&lt;br /&gt;Shutting down &lt;span class="goog-spellcheck-word"&gt;CSS&lt;/span&gt; daemon.&lt;br /&gt;Shutdown request successfully issued.&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;ps&lt;/span&gt; -&lt;span class="goog-spellcheck-word"&gt;ef&lt;/span&gt; | grep d.bin&lt;br /&gt;oracle   14672 30539  0 16:56 &lt;span class="goog-spellcheck-word"&gt;pts&lt;/span&gt;/1    00:00:00 grep d.bin&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 &lt;span class="goog-spellcheck-word"&gt;ps&lt;/span&gt; -&lt;span class="goog-spellcheck-word"&gt;ef&lt;/span&gt; | grep d.bin&lt;br /&gt;[oracle@rac1 ~]$ ./&lt;span class="goog-spellcheck-word"&gt;crsstat&lt;/span&gt;.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;error connecting to &lt;span class="goog-spellcheck-word"&gt;CRSD&lt;/span&gt; at [(ADDRESS=(PROTOCOL=&lt;span class="goog-spellcheck-word"&gt;ipc&lt;/span&gt;)(KEY=&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;_&lt;span class="goog-spellcheck-word"&gt;crsqs&lt;/span&gt;))] &lt;span class="goog-spellcheck-word"&gt;clsccon&lt;/span&gt; 184&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; start &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Attempting to start &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack&lt;br /&gt;The &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack will be started shortly&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; start &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Attempting to start &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack&lt;br /&gt;The &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack will be started shortly&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;ps&lt;/span&gt; -&lt;span class="goog-spellcheck-word"&gt;ef&lt;/span&gt; | grep d.bin&lt;br /&gt;root     14242     1  0 16:54 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;.bin reboot&lt;br /&gt;oracle   15219 14240  2 16:58 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;evmd&lt;/span&gt;.bin&lt;br /&gt;oracle   15383 15357  2 16:58 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.bin&lt;br /&gt;oracle   15602 30539  0 16:58 &lt;span class="goog-spellcheck-word"&gt;pts&lt;/span&gt;/1    00:00:00 grep d.bin&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 &lt;span class="goog-spellcheck-word"&gt;ps&lt;/span&gt; -&lt;span class="goog-spellcheck-word"&gt;ef&lt;/span&gt; | grep d.bin&lt;br /&gt;root     23610     1  0 16:56 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;.bin reboot&lt;br /&gt;oracle   24394 23609  2 16:58 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;evmd&lt;/span&gt;.bin&lt;br /&gt;oracle   24575 24549  2 16:58 ?        00:00:00 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.bin&lt;br /&gt;[oracle@rac1 ~]$ ./&lt;span class="goog-spellcheck-word"&gt;crsstat&lt;/span&gt;.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.cs                             OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.devdb1.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                     OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.devdb2.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                     OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.cs                           OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.devdb1.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                   OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.devdb2.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                   OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.db                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.ASM1.&lt;span class="goog-spellcheck-word"&gt;asm&lt;/span&gt;                             ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.LISTENER_RAC1.&lt;span class="goog-spellcheck-word"&gt;lsnr&lt;/span&gt;                   ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;gsd&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;ons&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;vip&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.ASM2.&lt;span class="goog-spellcheck-word"&gt;asm&lt;/span&gt;                             ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.LISTENER_RAC2.&lt;span class="goog-spellcheck-word"&gt;lsnr&lt;/span&gt;                   ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;gsd&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;ons&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;vip&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;5. Check log&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 rac1]$ tail alertrac1.log&lt;br /&gt;2010-05-07 16:58:50.358&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(15383)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1601:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; Reconfiguration complete. Active nodes are rac1 rac2 .&lt;br /&gt;2010-05-07 16:58:54.722&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;(14242)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1201:&lt;span class="goog-spellcheck-word"&gt;CRSD&lt;/span&gt; started on node rac1.&lt;br /&gt;2010-05-07 16:59:45.626&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(15383)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1604:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is offline: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1 /log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:00:47.657&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(15383)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1604:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is offline: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1 /log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:01:49.730&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(15383)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1604:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is offline: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1 /log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;[oracle@rac1 rac1]$ tail /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:00:16.337 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x8358600) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x8389ac8) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:00:22.183 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x8358600) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x838eb90) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:00:30.776 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x8358600) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x838ee90) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:00:47.657 [62401440] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssnmDiskStateChange&lt;/span&gt;: state from 3 to 3 disk (0//&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/ raw6)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:01:07.263 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x8358600) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x837e6b8) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:01:09.009 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x8357dd8) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x8379340) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:01:49.730 [62401440] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssnmDiskStateChange&lt;/span&gt;: state from 3 to 3 disk (0//&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/ raw6)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:02:09.984 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x835a580) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x8365a50) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:02:51.784 [62401440] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssnmDiskStateChange&lt;/span&gt;: state from 3 to 3 disk (0//&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/ raw6)&lt;br /&gt;[    &lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt;]2010-05-07 17:03:12.292 [132250528] &amp;gt;TRACE:   &lt;span class="goog-spellcheck-word"&gt;clssgmClientConnectMsg&lt;/span&gt;: Connect from con(0x835a580) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proc&lt;/span&gt;( 0x8365a50) &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pid&lt;/span&gt;() &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;proto&lt;/span&gt;(10:2:1:1)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Note: similar message from rac2 alertrac2.log and &lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log. It can be seen with three voting disk files, if one of them unavailable, the &lt;span class="goog-spellcheck-word"&gt;RAC&lt;/span&gt; is still functioning.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white;"&gt;6. Wipe out the second voting disk&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;dd if=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/zero of=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;Two nodes reboot right after issuing above command. A&lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;fter&lt;/span&gt; reboot, only see &lt;span class="goog-spellcheck-word"&gt;evmd&lt;/span&gt; running:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;ps&lt;/span&gt; -&lt;span class="goog-spellcheck-word"&gt;ef&lt;/span&gt; | grep d.bin&lt;br /&gt;oracle    8139  6985  3 17:12 ?        00:00:14 /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/bin/&lt;span class="goog-spellcheck-word"&gt;evmd&lt;/span&gt;.&lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;binoracle&lt;/span&gt;   11075 10255  0 17:20 &lt;span class="goog-spellcheck-word"&gt;pts&lt;/span&gt;/1    00:00:00 grep d.bin&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;7. Check log:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;--- alertrac1.log   show two voting disk files are offline&lt;br /&gt;&lt;br /&gt;2010-05-07 17:12:14.926&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(8303)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1604:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is offline: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:12:15.099&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(8303)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1604:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is offline: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:12:15.147&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(8303)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1605:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is online: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw8. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;[oracle@rac1 rac1]$&lt;br /&gt;&lt;br /&gt;[oracle@rac1 &lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;]$ tail &lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;.log&lt;br /&gt;&lt;br /&gt;2010-05-07 17:14:04.532: [ &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;COMMCRS&lt;/span&gt;][36494240]&lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;clsc&lt;/span&gt;_connect: (0x8655528) no listener at (ADDRESS=(PROTOCOL=&lt;span class="goog-spellcheck-word"&gt;ipc&lt;/span&gt;)(KEY=&lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;OCSSD&lt;/span&gt;_LL_rac1_&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;2010-05-07 17:14:04.532: [ &lt;span class="goog-spellcheck-word"&gt;CSSCLNT&lt;/span&gt;][3086931648]&lt;span class="goog-spellcheck-word"&gt;clsssInitNative&lt;/span&gt;: connect failed, &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;rc&lt;/span&gt; 9&lt;br /&gt;&lt;br /&gt;2010-05-07 17:14:04.533: [  &lt;span class="goog-spellcheck-word"&gt;CRSRTI&lt;/span&gt;][3086931648]0CSS is not ready. Received status 3 from &lt;span class="goog-spellcheck-word"&gt;CSS&lt;/span&gt;. Waiting for good status ..&lt;br /&gt;&lt;br /&gt;2010-05-07 17:14:05.536: [ &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;CRSMAIN&lt;/span&gt;][3086931648][PANIC]0CRSD exiting: Could not &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;init&lt;/span&gt; the &lt;span class="goog-spellcheck-word"&gt;CSS&lt;/span&gt; context&lt;br /&gt;&lt;br /&gt;2010-05-07 17:14:05.540: [ default][3086931648]Terminating &lt;span class="goog-spellcheck-word"&gt;clsd&lt;/span&gt; session&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;8. Restore Voting &lt;span class="goog-spellcheck-word"&gt;Disk&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 ~]$ dd if=/home/oracle/backup/&lt;span class="goog-spellcheck-word"&gt;votingdisk&lt;/span&gt;_050710 of=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6&lt;br /&gt;80325+0 records in&lt;br /&gt;80325+0 records out&lt;br /&gt;[oracle@rac1 ~]$ dd if=/home/oracle/backup/&lt;span class="goog-spellcheck-word"&gt;votingdisk&lt;/span&gt;_050710 of=/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7&lt;br /&gt;dd: writing to `/&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7': No space left on device&lt;br /&gt;80263+0 records in&lt;br /&gt;80262+0 records out&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;9. Restart &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: white;"&gt;[oracle@rac1 ~]$ &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; start &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Password:&lt;br /&gt;Attempting to start &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack&lt;br /&gt;The &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack will be started shortly&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 &lt;span class="goog-spellcheck-word"&gt;sudo&lt;/span&gt; $ORA_&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;_HOME/bin/&lt;span class="goog-spellcheck-word"&gt;crsctl&lt;/span&gt; start &lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;Attempting to start &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack&lt;br /&gt;The &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; stack will be started shortly&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---- in alertrac1.log --------------------------&lt;br /&gt;&lt;br /&gt;[oracle@rac1 rac1]$ &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;pwd&lt;/span&gt;&lt;br /&gt;/u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1&lt;br /&gt;[oracle@rac1 rac1]$ tail -15 alertrac1.log&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(8303)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1605:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is online: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw8. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:29:31.679&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(13301)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1605:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is online: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw6. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:29:31.714&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(13301)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1605:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is online: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw7. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:29:31.729&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(13301)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1605:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; voting file is online: /&lt;span class="goog-spellcheck-word"&gt;dev&lt;/span&gt;/raw/raw8. Details in /u01/app/oracle/product/10.2.0/&lt;span class="goog-spellcheck-word"&gt;crs&lt;/span&gt;_1/log/rac1/&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;/&lt;span class="goog-spellcheck-word"&gt;ocssd&lt;/span&gt;.log.&lt;br /&gt;2010-05-07 17:29:35.433&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;cssd&lt;/span&gt;(13301)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1601:&lt;span class="goog-spellcheck-word"&gt;CSSD&lt;/span&gt; Reconfiguration complete. Active nodes are rac1 rac2 .&lt;br /&gt;2010-05-07 17:29:38.247&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;(8910)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1012:The OCR service started on node rac1.&lt;br /&gt;2010-05-07 17:29:38.287&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;evmd&lt;/span&gt;(13364)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1401:&lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;EVMD&lt;/span&gt; started on node rac1.&lt;br /&gt;2010-05-07 17:31:02.432&lt;br /&gt;[&lt;span class="goog-spellcheck-word"&gt;crsd&lt;/span&gt;(8910)]&lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt;-1201:&lt;span class="goog-spellcheck-word"&gt;CRSD&lt;/span&gt; started on node rac1.&lt;br /&gt;&lt;br /&gt;---- &lt;span class="goog-spellcheck-word" style="background-attachment: scroll; background-image: none; background-position: 0% 0%; background-repeat: repeat;"&gt;CTS&lt;/span&gt; resource are on-line&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ~/&lt;span class="goog-spellcheck-word"&gt;crsstat&lt;/span&gt;.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.cs                             OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.devdb1.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                     OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SLBA&lt;/span&gt;.devdb2.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                     OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.cs                           OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.devdb1.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                   OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;SNOLBA&lt;/span&gt;.devdb2.&lt;span class="goog-spellcheck-word"&gt;srv&lt;/span&gt;                   OFFLINE    OFFLINE&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.db                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.&lt;span class="goog-spellcheck-word"&gt;devdb&lt;/span&gt;.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.ASM1.&lt;span class="goog-spellcheck-word"&gt;asm&lt;/span&gt;                             ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.LISTENER_RAC1.&lt;span class="goog-spellcheck-word"&gt;lsnr&lt;/span&gt;                   ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;gsd&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;ons&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac1.&lt;span class="goog-spellcheck-word"&gt;vip&lt;/span&gt;                                  ONLINE     ONLINE on rac1&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.ASM2.&lt;span class="goog-spellcheck-word"&gt;asm&lt;/span&gt;                             ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.LISTENER_RAC2.&lt;span class="goog-spellcheck-word"&gt;lsnr&lt;/span&gt;                   ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;gsd&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;ons&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;span class="goog-spellcheck-word"&gt;ora&lt;/span&gt;.rac2.&lt;span class="goog-spellcheck-word"&gt;vip&lt;/span&gt;                                  ONLINE     ONLINE on rac2&lt;br /&gt;[oracle@rac1 ~]$ date&lt;br /&gt;Fri May  7 17:37:35 EDT 2010&lt;br /&gt; &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color: white; color: blue;"&gt;In conclusion, with 3 voting disks, my test did show &lt;span class="goog-spellcheck-word"&gt;RAC&lt;/span&gt; can be operational if one of them is offline; if two of them are not available, then the &lt;span class="goog-spellcheck-word"&gt;CRS&lt;/span&gt; daemon can not start at all. However, when zero-out one of the voting disks, the server reboots, this is not desirable, not sure if this is due to my particular environment.&lt;/span&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2868854866374566717?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2868854866374566717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2868854866374566717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2868854866374566717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2868854866374566717'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/05/play-with-my-toy-10g-rac-vii-voting.html' title='Play with my toy 10g RAC VII - Voting Disk'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8099071119426549840</id><published>2010-05-04T14:39:00.001-04:00</published><updated>2010-05-04T15:38:36.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OCR'/><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><title type='text'>Play with my toy 10g RAC VI - Failed to Start CRS Processes due to OCR Out-of-Sync</title><content type='html'>Today is the first time I am trying to play with my toy RAC again since I have moved OCR and voting disk files to the raw devices last time as described &lt;a href="http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-v-move-ocr-and.html"&gt;here&lt;/a&gt;. To my surprise, I can not start CRS processes (i.e. those seen from ps -ef | grep d.bin) ! First of all, they should be started automatically after server reboots, but they did not. Secondly they did not start after I issued "crsctl start crs" or "/etc/init.d/init.crs start" either. It took me quite a while to find the right log that indicates the problem:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 client]$ pwd&lt;br /&gt;/u01/app/oracle/product/10.2.0/crs_1/log/rac1/client&lt;br /&gt;[oracle@rac1 client]$&lt;br /&gt;[oracle@rac1 client]$ tail -10 css.log&lt;br /&gt;2010-04-05 10:15:01.231: [ CSSCLNT][3086931648]clsssInitNative: connect failed, rc 9&lt;br /&gt;&lt;br /&gt;2010-04-05 10:15:02.249: [ CSSCLNT][3086931648]clsssInitNative: connect failed, rc 9&lt;br /&gt;&lt;br /&gt;2010-04-21 13:44:32.807: [ default][3068479168]prlsndmain: olsnodes successful!!&lt;br /&gt;2010-04-28 11:13:01.999: [  OCRRAW][3086931648]propriogid:1: INVALID FORMAT&lt;br /&gt;2010-04-28 12:02:36.960: [  OCRRAW][3086931648]propriogid:1: INVALID FORMAT&lt;br /&gt;2010-05-04 10:58:31.850: [  OCRRAW][3068479168]propriogid:1: INVALID FORMAT&lt;br /&gt;2010-05-04 10:58:31.932: [ default][3068479168]prlsndmain: olsnodes successful!!&lt;br /&gt;2010-05-04 11:06:06.374: [  OCRRAW][3086931648]propriogid:1: INVALID FORMAT&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It showed that OCR had problems. I then noticed "&lt;em&gt;Device/File needs to be synchronized with the other device&lt;/em&gt;" in the ocrcheck output:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/u01/app/oracle/product/10.2.0/crs_1/log/rac1/client [devdb1]# ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     505928&lt;br /&gt;         Used space (kbytes)      :       5372&lt;br /&gt;         Available space (kbytes) :     500556&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /dev/raw/raw4&lt;br /&gt;                                    Device/File needs to be synchronized with the other device&lt;br /&gt;         Device/File Name         : /dev/raw/raw5&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I executed the following command:&lt;br /&gt;&lt;br /&gt;# dd if=/dev/raw/raw5 of=/dev/raw/raw4&lt;br /&gt;&lt;br /&gt;Then, I found ocrcheck was good again. &lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     505928&lt;br /&gt;         Used space (kbytes)      :       5348&lt;br /&gt;         Available space (kbytes) :     500580&lt;br /&gt;         ID                       :  219149972&lt;br /&gt;         Device/File Name         : /dev/raw/raw4&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;         Device/File Name         : /dev/raw/raw5&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I am not sure it is the right or best way to fix this problem, but it worked. BTW, I tried "ocrconfig -replace ocr /dev/raw/raw5", not working. After that, I was able to bring everything back to normal. Actually, the problem was there when I created ocr and ocrmirror on the raw devices, but I did not notice it at that time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8099071119426549840?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8099071119426549840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8099071119426549840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8099071119426549840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8099071119426549840'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/05/play-with-my-toy-10g-rac-vi-failed-to.html' title='Play with my toy 10g RAC VI - Failed to Start CRS Processes due to OCR Out-of-Sync'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1656559130594452888</id><published>2010-04-30T15:55:00.002-04:00</published><updated>2010-04-30T16:08:01.906-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>Execution Plan of a Subquery inside CASE statement</title><content type='html'>I found that in our 9.2.0.8 database the execution plan of a subquery inside CASE statement can not be seen in the SQL_TRACE/TKPROF report or from the excution plan extracted from the shared pool. However, it can be seen from Autotrace explain plan. I constructed a test case to demonstrate this as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;rem script: xplan_diff.sql&lt;br /&gt;rem   execution plan for the subquery in the CASE statement not shown in SQL_TRACE/TKPROF in 9i&lt;br /&gt;rem&lt;br /&gt;rem&lt;br /&gt;&lt;br /&gt;spool xplan_diff.log&lt;br /&gt;set echo on&lt;br /&gt;&lt;br /&gt;drop table t;&lt;br /&gt;drop table t2;&lt;br /&gt;&lt;br /&gt;create table t &lt;br /&gt;as &lt;br /&gt;select rownum id,&lt;br /&gt;       'GOOD' val&lt;br /&gt;from all_objects&lt;br /&gt;where rownum &amp;lt;=20;&lt;br /&gt; &lt;br /&gt;update t set val='BAD' where mod(id,2) = 0;&lt;br /&gt;commit;&lt;br /&gt;&lt;br /&gt;create table t2&lt;br /&gt;as&lt;br /&gt;select rownum id,&lt;br /&gt;       'TEST' val&lt;br /&gt;from all_objects&lt;br /&gt;where rownum &amp;lt;=20; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;alter session set tracefile_identifier = test;&lt;br /&gt;alter session set timed_statistics=true;&lt;br /&gt;alter session set events '10046 trace name context forever, level 12';&lt;br /&gt;set autotrace traceonly&lt;br /&gt;select id,&lt;br /&gt;       case when  val = 'GOOD' then &lt;br /&gt;  (select t2.val &lt;br /&gt;  from t, t2&lt;br /&gt;  where t.id = t2.id&lt;br /&gt;    and rownum = 1&lt;br /&gt;         )&lt;br /&gt;       else 'NO TEST'&lt;br /&gt;       END  as IS_TEST&lt;br /&gt;from t;&lt;br /&gt;set autotrace off&lt;br /&gt;alter session set events '10046 trace name context forever, level 12';&lt;br /&gt;spool off&lt;br /&gt;exit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;set doc off&lt;br /&gt;doc&lt;br /&gt;&lt;br /&gt;---- 9.2.0.8 Autotrace xplan  ---------------------------&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;   1    0   COUNT (STOPKEY)&lt;br /&gt;   2    1     MERGE JOIN&lt;br /&gt;   3    2       SORT (JOIN)&lt;br /&gt;   4    3         TABLE ACCESS (FULL) OF 'T2'&lt;br /&gt;   5    2       SORT (JOIN)&lt;br /&gt;   6    5         TABLE ACCESS (FULL) OF 'T'&lt;br /&gt;   7    0   TABLE ACCESS (FULL) OF 'T'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----- 9.2.0.8  tkprof  -----------------------------------&lt;br /&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;     20  TABLE ACCESS FULL T&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;------ 10.2.0.4  Autotrace  xplan -------------------------------------------&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT    |      |    20 |   380 |     2   (0)| 00:00:01 |&lt;br /&gt;|*  1 |  COUNT STOPKEY      |      |       |       |            |          |&lt;br /&gt;|*  2 |   HASH JOIN         |      |    20 |   640 |     5  (20)| 00:00:01 |&lt;br /&gt;|   3 |    TABLE ACCESS FULL| T    |    20 |   260 |     2   (0)| 00:00:01 |&lt;br /&gt;|   4 |    TABLE ACCESS FULL| T2   |    20 |   380 |     2   (0)| 00:00:01 |&lt;br /&gt;|   5 |  TABLE ACCESS FULL  | T    |    20 |   380 |     2   (0)| 00:00:01 |&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt; &lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt; &lt;br /&gt;   1 - filter(ROWNUM=1)&lt;br /&gt;   2 - access("T"."ID"="T2"."ID")&lt;br /&gt;&lt;br /&gt;------ 10.2.0.4  tkprof ------------&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      1  COUNT STOPKEY (cr=6 pr=0 pw=0 time=1435 us)&lt;br /&gt;      1   HASH JOIN  (cr=6 pr=0 pw=0 time=1417 us)&lt;br /&gt;     20    TABLE ACCESS FULL T (cr=3 pr=0 pw=0 time=109 us)&lt;br /&gt;      1    TABLE ACCESS FULL T2 (cr=3 pr=0 pw=0 time=64 us)&lt;br /&gt;     20  TABLE ACCESS FULL T (cr=4 pr=0 pw=0 time=72 us)&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: in 10.2.0.4 no such problem.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I was puzzled the other day about a similar sql to that in the above test case in our 9i &amp;nbsp;production database, which has two cursors with very different&amp;nbsp; sql_plan_hash_value and&amp;nbsp;gets_per_exections when I checked it from v$sql. But when I pulled the execution plan out from v$sql_plan, the execution plan from both cursors are exactly same. Now I understand the subquery execution plan parts are missing. The different cost is due to the join order swapped in the subquery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1656559130594452888?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1656559130594452888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1656559130594452888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1656559130594452888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1656559130594452888'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/execution-plan-of-subquery-inside-case.html' title='Execution Plan of a Subquery inside CASE statement'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8985133778940627826</id><published>2010-04-28T13:18:00.002-04:00</published><updated>2010-05-04T14:45:07.322-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><category scheme='http://www.blogger.com/atom/ns#' term='raw device'/><title type='text'>Play with my toy 10g RAC V - Move OCR and voting disk from OCFS2 to RAW device</title><content type='html'>My toy 10g RAC was set up based on &lt;a href="http://www.scribd.com/doc/320791/Install-Oracle-RAC-10g-on-Oracle-Enterprise-Linux-Using-VMware"&gt;Vincent Chan's article&lt;/a&gt; originally, in which OCFS2 filesystem was used for the shared OCR and votingdisk files.&amp;nbsp; In this post, I document steps I have taken to move them to RAW devices. &lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Create a new shared virtual SCSI hard disk&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a. Add a virtual disk (3GB) for RAC1&lt;br /&gt;&lt;br /&gt;b. In the "Add Hardward Wizard" and "Hard Disk" windows for RAC2, Select the following option:&lt;br /&gt;Use an Existing Virtual Disk - Choose this option to reuse or share a hard disk from another Virtual Machine&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Modify virtual machine configuration file &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Additional parameters are required to enable disk sharing between the two virtual RAC nodes. (Details see Vincent's article). Additonal reference is &lt;a href="http://www.vmware.com/support/gsx3/doc/ha_configs_novell_adddisk_gsx.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. Identify the device name for the disk&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In RAC1 and RAC2, login as root, run command: &lt;em&gt;&lt;strong&gt;fdisk -l&lt;/strong&gt;&lt;/em&gt;, the following message can be seen:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Disk /dev/sdf: 3221 MB, 3221225472 bytes&lt;br /&gt;255 heads, 63 sectors/track, 391 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;&lt;br /&gt;Disk /dev/sdf doesn't contain a valid partition table&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Create disk partitions&lt;/strong&gt;&lt;br /&gt;General reference about fdisk can be seen &lt;a href="http://tldp.org/HOWTO/Partition/fdisk_partitioning.html"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;At the end, I created partitions for /dev/sdf shown as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Disk /dev/sdf: 3221 MB, 3221225472 bytes&lt;br /&gt;255 heads, 63 sectors/track, 391 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;&lt;br /&gt;   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;/dev/sdf1               1          63      506016   83  Linux&lt;br /&gt;/dev/sdf2              64         126      506047+  83  Linux&lt;br /&gt;/dev/sdf3             127         131       40162+  83  Linux&lt;br /&gt;/dev/sdf4             132         391     2088450    5  Extended&lt;br /&gt;/dev/sdf5             132         136       40131   83  Linux&lt;br /&gt;/dev/sdf6             137         141       40131   83  Linux&lt;br /&gt;/dev/sdf7             142         391     2008093+  83  Linux&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: in reality, OCR, OCRMIRROR and each votingdisk file should be placed on seperate physical disks. Here I placed them in the same disk but different partitions. This is just for learning purpose.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Binding the partition&lt;/strong&gt;&lt;br /&gt;To map the raw devices to the shared partitions created, I did the following:&lt;br /&gt;&lt;br /&gt;a. Edit /etc/sysconfig/rawdevices on both nodes, add the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;/dev/raw/raw4 /dev/sdf1             &lt;br /&gt;/dev/raw/raw5 /dev/sdf2             &lt;br /&gt;/dev/raw/raw6 /dev/sdf3             &lt;br /&gt;/dev/raw/raw7 /dev/sdf5             &lt;br /&gt;/dev/raw/raw8 /dev/sdf6             &lt;br /&gt;/dev/raw/raw9 /dev/sdf7             &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;b. Issue: /sbin/service rawdevices restart&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/dev/raw [devdb1]# /sbin/service rawdevices restart&lt;br /&gt;Assigning devices:&lt;br /&gt;           /dev/raw/raw1  --&amp;gt;   /dev/sdc1&lt;br /&gt;/dev/raw/raw1:  bound to major 8, minor 33&lt;br /&gt;           /dev/raw/raw2  --&amp;gt;   /dev/sdd1&lt;br /&gt;/dev/raw/raw2:  bound to major 8, minor 49&lt;br /&gt;           /dev/raw/raw3  --&amp;gt;   /dev/sde1&lt;br /&gt;/dev/raw/raw3:  bound to major 8, minor 65&lt;br /&gt;           /dev/raw/raw4  --&amp;gt;   /dev/sdf1&lt;br /&gt;/dev/raw/raw4:  bound to major 8, minor 81&lt;br /&gt;           /dev/raw/raw5  --&amp;gt;   /dev/sdf2&lt;br /&gt;/dev/raw/raw5:  bound to major 8, minor 82&lt;br /&gt;           /dev/raw/raw6  --&amp;gt;   /dev/sdf3&lt;br /&gt;/dev/raw/raw6:  bound to major 8, minor 83&lt;br /&gt;           /dev/raw/raw7  --&amp;gt;   /dev/sdf5&lt;br /&gt;/dev/raw/raw7:  bound to major 8, minor 85&lt;br /&gt;           /dev/raw/raw8  --&amp;gt;   /dev/sdf6&lt;br /&gt;/dev/raw/raw8:  bound to major 8, minor 86&lt;br /&gt;           /dev/raw/raw9  --&amp;gt;   /dev/sdf7&lt;br /&gt;/dev/raw/raw9:  bound to major 8, minor 87&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: when issuing above command in RAC2, I recieve message: /dev/sdfn (n=1-7) is not a block device.&lt;br /&gt;After reboot both node, everything is fine:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:~ [devdb1]# raw -qa&lt;br /&gt;/dev/raw/raw1:  bound to major 8, minor 33&lt;br /&gt;/dev/raw/raw2:  bound to major 8, minor 49&lt;br /&gt;/dev/raw/raw3:  bound to major 8, minor 65&lt;br /&gt;/dev/raw/raw4:  bound to major 8, minor 81&lt;br /&gt;/dev/raw/raw5:  bound to major 8, minor 82&lt;br /&gt;/dev/raw/raw6:  bound to major 8, minor 83&lt;br /&gt;/dev/raw/raw7:  bound to major 8, minor 85&lt;br /&gt;/dev/raw/raw8:  bound to major 8, minor 86&lt;br /&gt;/dev/raw/raw9:  bound to major 8, minor 87&lt;br /&gt;&lt;br /&gt;[root@rac2 ~]# raw -qa&lt;br /&gt;/dev/raw/raw1:  bound to major 8, minor 33&lt;br /&gt;/dev/raw/raw2:  bound to major 8, minor 49&lt;br /&gt;/dev/raw/raw3:  bound to major 8, minor 65&lt;br /&gt;/dev/raw/raw4:  bound to major 8, minor 81&lt;br /&gt;/dev/raw/raw5:  bound to major 8, minor 82&lt;br /&gt;/dev/raw/raw6:  bound to major 8, minor 83&lt;br /&gt;/dev/raw/raw7:  bound to major 8, minor 85&lt;br /&gt;/dev/raw/raw8:  bound to major 8, minor 86&lt;br /&gt;/dev/raw/raw9:  bound to major 8, minor 87&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;c. Edit /etc/udev/permissions.d/50-udev.permissions, add the following entries, and reboot&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;raw/raw1:oracle:dba:0660&lt;br /&gt;raw/raw2:oracle:dba:0660&lt;br /&gt;raw/raw3:oracle:dba:0660&lt;br /&gt;raw/raw4:root:dba:0640&lt;br /&gt;raw/raw5:root:dba:0640&lt;br /&gt;raw/raw6:oracle:dba:0640&lt;br /&gt;raw/raw7:oracle:dba:0640&lt;br /&gt;raw/raw8:oracle:dba:0640&lt;br /&gt;raw/raw9:oracle:dba:0660&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: my intended use of raw devices is raw4 and raw5 for OCR and OCRMIRROR; raw6, raw7, raw8 for voting disk files.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6. Moving OCR file from OCFS to raw devices&lt;/strong&gt;&lt;br /&gt;a. shutdown CRS resource&lt;br /&gt;b. Determine current OCR configuration:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac2 ~]$ ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     262144&lt;br /&gt;         Used space (kbytes)      :       5364&lt;br /&gt;         Available space (kbytes) :     256780&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /ocfs/clusterware/ocr&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;                                    Device/File not configured&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;c. Relocate ocr and add ocr mirror&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:~ [devdb1]# ocrconfig -replace ocrmirror /dev/raw/raw5&lt;br /&gt;root@rac1:~ [devdb1]# ocrconfig -replace ocr /dev/raw/raw4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: if ocrmirror is not added first, the following errors will be seen:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:~ [devdb1]# ocrconfig -replace ocr /dev/raw/raw4&lt;br /&gt;PROT-16: Internal Error&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;d. Verify and start CRS resources&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     505928&lt;br /&gt;         Used space (kbytes)      :       5364&lt;br /&gt;         Available space (kbytes) :     500564&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /dev/raw/raw4&lt;br /&gt;                                    Device/File needs to be synchronized with the other device&lt;br /&gt;         Device/File Name         : /dev/raw/raw5&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;[May 4,2010, update: I did not notice "Device/File needs to be synchronized&amp;nbsp; ..." in the above ocrcheck output on Apr 28. CRS processes could be started despite of this. But today I have to fix this to get CRS started. see &lt;a href="http://oracle-study-notes.blogspot.com/2010/05/play-with-my-toy-10g-rac-vi-failed-to.html"&gt;http://oracle-study-notes.blogspot.com/2010/05/play-with-my-toy-10g-rac-vi-failed-to.html&lt;/a&gt; ]&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7. Moving voting disk files from OCFS to raw devices&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a. Determine the current voting disk location&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;oracle@rac1:~ [devdb1]$ crsctl query css votedisk&lt;br /&gt; 0.     0    /ocfs/clusterware/votingdisk&lt;br /&gt;&lt;br /&gt;located 1 votedisk(s).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;b. Shutdown Oracle Clusterware on both node;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;oracle@rac1:~ [devdb1]$ sudo $ORA_CRS_HOME/bin/crsctl stop crs&lt;br /&gt;Password:&lt;br /&gt;Stopping resources.&lt;br /&gt;Successfully stopped CRS resources&lt;br /&gt;Stopping CSSD.&lt;br /&gt;Shutting down CSS daemon.&lt;br /&gt;Shutdown request successfully issued.&lt;br /&gt;oracle@rac1:~ [devdb1]$ ssh rac2 sudo $ORA_CRS_HOME/bin/crsctl stop crs&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;Stopping resources.&lt;br /&gt;Successfully stopped CRS resources&lt;br /&gt;Stopping CSSD.&lt;br /&gt;Shutting down CSS daemon.&lt;br /&gt;Shutdown request successfully issued.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;c. Take a backup of all voting disk:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;oracle@rac1:~ [devdb1]$ dd if=/ocfs/clusterware/votingdisk of=/home/oracle/backup/votingdisk_042810&lt;br /&gt;20000+0 records in&lt;br /&gt;20000+0 records out&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;d. Move &lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:~ [devdb1]# crsctl delete votedisk css /ocfs/clusterware/votingdisk -force&lt;br /&gt;Unexpected parameter: votedisk&lt;br /&gt;root@rac1:~ [devdb1]# crsctl delete css votedisk /ocfs/clusterware/votingdisk -force&lt;br /&gt;only one votedisk /ocfs/clusterware/votingdisk configured.&lt;br /&gt;please add another disk before removing the last one.&lt;br /&gt;root@rac1:~ [devdb1]# crsctl add  css votedisk  /dev/raw/raw7 -force&lt;br /&gt;Now formatting voting disk: /dev/raw/raw7&lt;br /&gt;successful addition of votedisk /dev/raw/raw7.&lt;br /&gt;root@rac1:~ [devdb1]# crsctl delete css votedisk /ocfs/clusterware/votingdisk -force&lt;br /&gt;successful deletion of votedisk /ocfs/clusterware/votingdisk.&lt;br /&gt;root@rac1:~ [devdb1]# crsctl add  css votedisk  /dev/raw/raw6 -force&lt;br /&gt;Now formatting voting disk: /dev/raw/raw6&lt;br /&gt;successful addition of votedisk /dev/raw/raw6.&lt;br /&gt;root@rac1:~ [devdb1]# crsctl add  css votedisk  /dev/raw/raw8 -force&lt;br /&gt;Now formatting voting disk: /dev/raw/raw8&lt;br /&gt;successful addition of votedisk /dev/raw/raw8.&lt;br /&gt;root@rac1:~ [devdb1]# crsctl query css votedisk&lt;br /&gt; 0.     0    /dev/raw/raw6&lt;br /&gt; 1.     0    /dev/raw/raw7&lt;br /&gt; 2.     0    /dev/raw/raw8&lt;br /&gt;&lt;br /&gt;located 3 votedisk(s).&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e. Start Oracle Clusterware and verify everything is ok&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;oracle@rac1:~ [devdb1]$ sudo $ORA_CRS_HOME/bin/crsctl start crs&lt;br /&gt;Password:&lt;br /&gt;Attempting to start CRS stack&lt;br /&gt;The CRS stack will be started shortly&lt;br /&gt;oracle@rac1:~ [devdb1]$ ssh rac2 sudo $ORA_CRS_HOME/bin/crsctl start crs&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;Attempting to start CRS stack&lt;br /&gt;The CRS stack will be started shortly&lt;br /&gt;&lt;br /&gt;--- Wait for several min here  -----------&lt;br /&gt;&lt;br /&gt;oracle@rac1:~ [devdb1]$&lt;br /&gt;oracle@rac1:~ [devdb1]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.SLBA.cs                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb1.srv                     ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb2.srv                     ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.SNOLBA.cs                           ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb1.srv                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb2.srv                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.db                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac1.ASM1.asm                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.gsd                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.ons                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.vip                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac2.ASM2.asm                             ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.gsd                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.ons                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.vip                                  ONLINE     ONLINE on rac2&lt;br /&gt;oracle@rac1:~ [devdb1]$ crsctl query css votingdisk&lt;br /&gt;Unexpected parameter: votingdisk&lt;br /&gt;oracle@rac1:~ [devdb1]$ crsctl query css votedisk&lt;br /&gt; 0.     0    /dev/raw/raw6&lt;br /&gt; 1.     0    /dev/raw/raw7&lt;br /&gt; 2.     0    /dev/raw/raw8&lt;br /&gt;&lt;br /&gt;located 3 votedisk(s).&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8985133778940627826?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8985133778940627826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8985133778940627826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8985133778940627826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8985133778940627826'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-v-move-ocr-and.html' title='Play with my toy 10g RAC V - Move OCR and voting disk from OCFS2 to RAW device'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8805235460979097447</id><published>2010-04-21T18:55:00.000-04:00</published><updated>2010-04-21T18:55:35.700-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OCR'/><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><title type='text'>Play with my toy 10g RAC IV - Test two OCR adminstration tasks</title><content type='html'>The OCR contains information about the cluster node list, instance-to-node mapping information, and information about Oracle Clusterware resource profiles for applications that may&amp;nbsp;have been customized&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Task 1 - Mirror the OCR&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Oracle RAC environments do not support more than two OCRs, at most a primary OCR and a second OCR. As my OCR is on the OCFS2 filesystem, I need to first create a new OCR file to complete the task of mirroring the OCR&lt;br /&gt;&lt;br /&gt;1). Verify&amp;nbsp;I don't have ocrmirror:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:~ [devdb1]# ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     262144&lt;br /&gt;         Used space (kbytes)      :       5348&lt;br /&gt;         Available space (kbytes) :     256796&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /ocfs/clusterware/ocr&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;                                    Device/File not configured&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) Create a new OCR file:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;dd if=/dev/zero of=/ocfs/clusterware/ocrmirror.dbf bs=1M count=128&lt;br /&gt;&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# dd if=/dev/zero of=/ocfs/clusterware/ocrmirror.dbf bs=1M count=128&lt;br /&gt;128+0 records in&lt;br /&gt;128+0 records out&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# ls -lh&lt;br /&gt;total 144M&lt;br /&gt;-rw-r-----  1 root   oinstall 5.5M Apr 15 10:15 ocr&lt;br /&gt;-rw-r--r--  1 root   root     128M Apr 20 16:10 ocrmirror.dbf&lt;br /&gt;-rw-r--r--  1 oracle oinstall 9.8M Apr 20 16:10 votingdisk&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) Add the OCRMIRROR&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# ocrconfig -replace ocrmirror /ocfs/clusterware/ocrmirror.dbf&lt;br /&gt;&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# ls -lhtr&lt;br /&gt;total 397M&lt;br /&gt;-rw-r-----  1 root   oinstall 5.5M Apr 15 10:15 ocr&lt;br /&gt;-rw-r--r--  1 root   root     381M Apr 20 16:13 ocrmirror.dbf&lt;br /&gt;-rw-r--r--  1 oracle oinstall 9.8M Apr 20 16:14 votingdisk&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: the size of ocrmirror.dbf becomes 381M, this is quite unusal. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4) Verify:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     262144&lt;br /&gt;         Used space (kbytes)      :       5348&lt;br /&gt;         Available space (kbytes) :     256796&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /ocfs/clusterware/ocr&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;         Device/File Name         : /ocfs/clusterware/ocrmirror.dbf&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5) Remove OCRMRROR if we want&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# ocrconfig -replace ocrmirror&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# ocrcheck&lt;br /&gt;Status of Oracle Cluster Registry is as follows :&lt;br /&gt;         Version                  :          2&lt;br /&gt;         Total space (kbytes)     :     262144&lt;br /&gt;         Used space (kbytes)      :       5348&lt;br /&gt;         Available space (kbytes) :     256796&lt;br /&gt;         ID                       :  645781380&lt;br /&gt;         Device/File Name         : /ocfs/clusterware/ocr&lt;br /&gt;                                    Device/File integrity check succeeded&lt;br /&gt;&lt;br /&gt;                                    Device/File not configured&lt;br /&gt;&lt;br /&gt;         Cluster registry integrity check succeeded&lt;br /&gt;&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# rm ocrmirror.dbf&lt;br /&gt;rm: remove regular file `ocrmirror.dbf'? yes&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]#&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# df -h .&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/dev/sdb1             512M   90M  423M  18% /ocfs&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Task 2 - Backup and restore an OCR file&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1) For security purpose, generate a logical OCR backup file&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ sudo /u01/app/oracle/product/10.2.0/crs_1/bin/ocrconfig -export ./backup/logicalocrbak&lt;br /&gt;Password:&lt;br /&gt;[oracle@rac1 ~]$ ls -lh ./backup/&lt;br /&gt;total 128K&lt;br /&gt;-rw-r--r--  1 root root 122K Apr 21 15:16 logicalocrbak&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) Delete the OCR file to simulate lost of OCR&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# ls -lhtr&lt;br /&gt;total 138M&lt;br /&gt;-rw-r--r--  1 root   root     128M Apr 21 15:17 ocr&lt;br /&gt;-rw-r--r--  1 oracle oinstall 9.8M Apr 21 15:17 votingdisk&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# rm -f ocr&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# ls -lhtr&lt;br /&gt;total 9.8M&lt;br /&gt;-rw-r--r--  1 oracle oinstall 9.8M Apr 21 15:17 votingdisk&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ocrcheck&lt;br /&gt;PROT-602: Failed to retrieve data from the cluster registry&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) Locate a physical backup of OCR&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ ocrconfig -showbackup&lt;br /&gt;&lt;br /&gt;rac2     2010/04/20 17:58:54     /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;&lt;br /&gt;rac2     2010/04/19 19:47:53     /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;&lt;br /&gt;rac2     2010/04/19 15:47:51     /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;&lt;br /&gt;rac2     2010/04/19 11:47:47     /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;&lt;br /&gt;rac2     2010/04/19 15:47:51     /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 ls -lhtr /u01/app/oracle/product/10.2.0/crs_1/cdata/crs&lt;br /&gt;total 37M&lt;br /&gt;-rw-r--r--  1 root root 4.6M Apr 12 21:14 week_.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 19 11:47 day.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 19 15:47 backup02.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 19 15:47 week.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 19 19:47 backup01.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 20 17:58 backup00.ocr&lt;br /&gt;-rw-r--r--  1 root root 5.4M Apr 20 17:58 day_.ocr&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: The Oracle Clusterware automatically creates OCR backups every four hours. Default location: CRS_home/cdata/cluster_name &lt;br /&gt;&lt;br /&gt;4) Stop CRS resources on both nodes&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ crs_stop -all&lt;br /&gt;Attempting to stop `ora.devdb.SNOLBA.devdb1.srv` on member `rac1`&lt;br /&gt;Attempting to stop `ora.devdb.SLBA.devdb1.srv` on member `rac1`&lt;br /&gt;Attempting to stop `ora.devdb.SNOLBA.cs` on member `rac1`&lt;br /&gt;Attempting to stop `ora.rac1.gsd` on member `rac1`&lt;br /&gt;Attempting to stop `ora.devdb.SLBA.cs` on member `rac1`&lt;br /&gt;Attempting to stop `ora.devdb.SLBA.devdb2.srv` on member `rac2`&lt;br /&gt;Attempting to stop `ora.devdb.SNOLBA.devdb2.srv` on member `rac2`&lt;br /&gt;Stop of `ora.rac1.gsd` on member `rac1` succeeded.&lt;br /&gt;Stop of `ora.devdb.SLBA.devdb2.srv` on member `rac2` succeeded.&lt;br /&gt;Stop of `ora.devdb.SLBA.devdb1.srv` on member `rac1` succeeded.&lt;br /&gt;Stop of `ora.devdb.SNOLBA.devdb2.srv` on member `rac2` succeeded.&lt;br /&gt;Stop of `ora.devdb.SNOLBA.devdb1.srv` on member `rac1` succeeded.&lt;br /&gt;Attempting to stop `ora.rac1.ons` on member `rac1`&lt;br /&gt;Attempting to stop `ora.rac2.gsd` on member `rac2`&lt;br /&gt;Attempting to stop `ora.rac2.ons` on member `rac2`&lt;br /&gt;Stop of `ora.rac2.gsd` on member `rac2` succeeded.&lt;br /&gt;Attempting to stop `ora.devdb.db` on member `rac2`&lt;br /&gt;Stop of `ora.rac1.ons` on member `rac1` succeeded.&lt;br /&gt;Stop of `ora.rac2.ons` on member `rac2` succeeded.&lt;br /&gt;Stop of `ora.devdb.SLBA.cs` on member `rac1` succeeded.&lt;br /&gt;Stop of `ora.devdb.SNOLBA.cs` on member `rac1` succeeded.&lt;br /&gt;Stop of `ora.devdb.db` on member `rac2` succeeded.&lt;br /&gt;Attempting to stop `ora.rac1.LISTENER_RAC1.lsnr` on member `rac1`&lt;br /&gt;Attempting to stop `ora.rac2.LISTENER_RAC2.lsnr` on member `rac2`&lt;br /&gt;Stop of `ora.rac1.LISTENER_RAC1.lsnr` on member `rac1` succeeded.&lt;br /&gt;`ora.devdb.devdb1.inst` is already OFFLINE.&lt;br /&gt;Attempting to stop `ora.rac1.ASM1.asm` on member `rac1`&lt;br /&gt;Stop of `ora.rac2.LISTENER_RAC2.lsnr` on member `rac2` succeeded.&lt;br /&gt;`ora.devdb.devdb2.inst` is already OFFLINE.&lt;br /&gt;Attempting to stop `ora.rac2.ASM2.asm` on member `rac2`&lt;br /&gt;Stop of `ora.rac1.ASM1.asm` on member `rac1` succeeded.&lt;br /&gt;Attempting to stop `ora.rac1.vip` on member `rac1`&lt;br /&gt;Stop of `ora.rac2.ASM2.asm` on member `rac2` succeeded.&lt;br /&gt;Stop of `ora.rac1.vip` on member `rac1` succeeded.&lt;br /&gt;Attempting to stop `ora.rac2.vip` on member `rac2`&lt;br /&gt;Stop of `ora.rac2.vip` on member `rac2` succeeded.&lt;br /&gt;CRS-0216: Could not stop resource 'ora.devdb.devdb1.inst'.&lt;br /&gt;&lt;br /&gt;CRS-0216: Could not stop resource 'ora.devdb.devdb2.inst'.&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.SLBA.cs                             OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SLBA.devdb1.srv                     OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SLBA.devdb2.srv                     OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.cs                           OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.devdb1.srv                   OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.devdb2.srv                   OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.db                                  OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.devdb1.inst                         OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.devdb2.inst                         OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.ASM1.asm                             OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.gsd                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.ons                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.vip                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.ASM2.asm                             OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.gsd                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.ons                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.vip                                  OFFLINE    OFFLINE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5) Stop CRS on both node&lt;br /&gt;&lt;br /&gt;The following command has failed due to OCR was deleted:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ sudo $ORA_CRS_HOME/bin/crsctl stop crs&lt;br /&gt;Password:&lt;br /&gt;OCR initialization failed accessing OCR device: PROC-26: Error while accessing the physical storage Operating System error [No such file or directory] [2]&lt;br /&gt;&lt;br /&gt;Note: normally we should see:&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 sudo $ORA_CRS_HOME/bin/crsctl stop crs&lt;br /&gt;Stopping resources.&lt;br /&gt;Successfully stopped CRS resources&lt;br /&gt;Stopping CSSD.&lt;br /&gt;Shutting down CSS daemon.&lt;br /&gt;Shutdown request successfully issued.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tried to kill ocssd.bin processes on both nodes at OS level. Server reboot automatically after they are killed.&lt;br /&gt;After reboot, no CRS procesess are running.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ ps -ef | grep d.bin&lt;br /&gt;oracle    8887  8391  0 15:36 pts/1    00:00:00 grep d.bin&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 ps -ef | grep d.bin&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6) Restore OCR using the backup identified at step 3 &lt;br /&gt;&lt;br /&gt;Due to my OCR resides on OCFS2 filesystem, I need to create the file at first.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;root@rac1:/ocfs/clusterware [devdb1]# dd if=/dev/zero of=/ocfs/clusterware/ocr bs=1M count=128&lt;br /&gt;128+0 records in&lt;br /&gt;128+0 records out&lt;br /&gt;root@rac1:/ocfs/clusterware [devdb1]# ls -lhtr&lt;br /&gt;total 138M&lt;br /&gt;-rw-r--r--  1 oracle oinstall 9.8M Apr  5 10:17 votingdisk&lt;br /&gt;-rw-r--r--  1 root   root     128M Apr 21 15:41 ocr&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then I can do a restore from backup:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 clusterware]$ ssh rac2 sudo $ORA_CRS_HOME/bin/ocrconfig -restore /u01/app/oracle/product/10.2.0/crs_1/cdata/crs/backup00.ocr&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ cluvfy comp ocr -n all -verbose&lt;br /&gt;&lt;br /&gt;Verifying OCR integrity&lt;br /&gt;&lt;br /&gt;Checking OCR integrity...&lt;br /&gt;&lt;br /&gt;Checking the absence of a non-clustered configuration...&lt;br /&gt;All nodes free of non-clustered, local-only configurations.&lt;br /&gt;&lt;br /&gt;Uniqueness check for OCR device passed.&lt;br /&gt;&lt;br /&gt;Checking the version of OCR...&lt;br /&gt;OCR of correct Version "2" exists.&lt;br /&gt;&lt;br /&gt;Checking data integrity of OCR...&lt;br /&gt;Data integrity check for OCR passed.&lt;br /&gt;&lt;br /&gt;OCR integrity check passed.&lt;br /&gt;&lt;br /&gt;Verification of OCR integrity was successful.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: the syntax for restore from logical backup is: ocrconfig -import /home/oracle/backup/ocrlogicbackup &lt;br /&gt;&lt;br /&gt;7) Restart CRS on both nodes&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ sudo $ORA_CRS_HOME/bin/crsctl start crs&lt;br /&gt;Password:&lt;br /&gt;Attempting to start CRS stack&lt;br /&gt;The CRS stack will be started shortly&lt;br /&gt;[oracle@rac1 ~]$ ssh rac2 sudo $ORA_CRS_HOME/bin/crsctl start crs&lt;br /&gt;Password:vz123ys&lt;br /&gt;&lt;br /&gt;Attempting to start CRS stack&lt;br /&gt;The CRS stack will be started shortly&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ps -ef | grep d.bin&lt;br /&gt;root      6591     1  0 15:29 ?        00:00:04 /u01/app/oracle/product/10.2.0/crs_1/bin/crsd.bin reboot&lt;br /&gt;oracle    9941  6589  0 15:45 ?        00:00:01 /u01/app/oracle/product/10.2.0/crs_1/bin/evmd.bin&lt;br /&gt;oracle   10071 10045  0 15:45 ?        00:00:01 /u01/app/oracle/product/10.2.0/crs_1/bin/ocssd.bin&lt;br /&gt;oracle   20444  8391  0 15:51 pts/1    00:00:00 grep d.bin&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After serveral trials using SRVCTL to shutdown/bring up individual commponent and manually shutdown ASM and RAC2 instances, finally I got:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.SLBA.cs                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb1.srv                     ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb2.srv                     ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.SNOLBA.cs                           ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb1.srv                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb2.srv                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.db                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac1.ASM1.asm                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.gsd                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.ons                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.vip                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac2.ASM2.asm                             ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.gsd                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.ons                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.vip                                  ONLINE     ONLINE on rac2&lt;br /&gt;[oracle@rac1 ~]$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ref: &lt;br /&gt;(1) &lt;a href="http://download.oracle.com/docs/cd/B19306_01/rac.102/b14197/votocr.htm#BABIHADG"&gt;http://download.oracle.com/docs/cd/B19306_01/rac.102/b14197/votocr.htm#BABIHADG&lt;/a&gt;&lt;br /&gt;(2) OCR / Vote disk Maintenance Operations: (ADD/REMOVE/REPLACE/MOVE), including moving from RAW Devices to Block Devices. [MOS ID 428681.1]&lt;br /&gt;(3) 'ocrconfig -replace ocr' Fails With PROT-16 [MOS ID 444757.1]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8805235460979097447?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8805235460979097447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8805235460979097447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8805235460979097447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8805235460979097447'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-iv-test-two.html' title='Play with my toy 10g RAC IV - Test two OCR adminstration tasks'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1323849099647814</id><published>2010-04-16T14:14:00.005-04:00</published><updated>2010-04-19T11:08:13.396-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><category scheme='http://www.blogger.com/atom/ns#' term='Load Balancing'/><title type='text'>Play with my toy 10g RAC III - Demonstrate Load Balancing Advisory</title><content type='html'>By design, RAC involves multiple instances accessing the same database. By analogy, a database can be thought of as an island, which is accessible by multiple brigdes (i.e. instances). If there were two brigdes and 10 incoming cars that are being driven to the island, and if the 10 cars are directed randomly toward one of the bridges,&amp;nbsp; each bridge will be added 5 cars roughly, this is so-called &lt;a href="http://download.oracle.com/docs/cd/B19306_01/rac.102/b28759/configwlm.htm#CHDGCCDI"&gt;Client-side connect-time load balancing&lt;/a&gt; . That is to say regardless of how busy a brigde is, how many cars already on that brigde, and how much longer to travel through that bridge etc, each brige is treated equally. We can easily&amp;nbsp;imagine that if we have a mechanizm to monitor the condition of each brigde and direct the incoming cars based on the current traffic conditions,&amp;nbsp;we will be much better in providing the service. Such a mechanizm in Oracle RAC is called &lt;a href="http://download.oracle.com/docs/cd/B19306_01/rac.102/b14197/hafeats.htm#BABICAJC"&gt;Load balancing Advisory&lt;/a&gt;, which can be used in the Server-side connect-time load balancing.&amp;nbsp;&amp;nbsp;Both client-side and server-side load balancings are applied to the time when a physical connection to a database is initially opened. Since opening a connection is an expensive operation, ideally application should be able to open a connection once, then reuse it for as many times as needed. There is a function called &lt;a href="http://download.oracle.com/docs/cd/B10501_01/java.920/a96654/connpoca.htm#1057365"&gt;connection pooling&lt;/a&gt; at the application server layer, which establishs physical connections once and never close them. With respect to connection pools, there is a feature called "&lt;a href="http://download.oracle.com/docs/cd/B19306_01/rac.102/b28759/configwlm.htm#CHDBCGEJ"&gt;Runtime Connection Load Balancing&lt;/a&gt;", esstially it allocates logical connections among the physical connections in the connection pool at the transaction level instead of load balancing at the time of the initial database connection.&lt;br /&gt;&lt;br /&gt;In this post, I will describe a test which is to demonstrate server-side connect-time load balancing with load balancing advisory feature. The idea used in this&amp;nbsp;test&amp;nbsp;was inspired from &lt;a href="http://www.databasejournal.com/features/oracle/article.php/10893_3666396_2/Oracle-10gR2-RAC-Load-Balancing-Features.htm"&gt;Jim Czuprynski's article&lt;/a&gt; , as well as in his Oracle University RAC class, which I attended about two and half years ago.&lt;br /&gt;&lt;br /&gt;First of all, a "job" in this test is defined as a workload that involves:&lt;br /&gt;&lt;br /&gt;(1) connect to the database as user "DENIS"&lt;br /&gt;(2) do an insert and&amp;nbsp; an delete to a table 1000 times&lt;br /&gt;(3) disconnect&lt;br /&gt;(4) repeat (1) to (3) during predefined time period, e.g 20 min.&lt;br /&gt;&lt;br /&gt;So if I submit 100 such jobs, I would expect 100 sessions count by username "DENIS"&lt;br /&gt;&lt;br /&gt;Secondly, I created a service called 'SLBA', which is used for the job to connect to the database. The details about how to create a LBA-enabled service can be seen in Jim's article or Oracle documentation.&lt;br /&gt;&lt;br /&gt;The steps are as follows:&lt;br /&gt;&lt;br /&gt;1. Query GV$SERVICEMEATIC for instance goodness before starting any jobs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:39:59 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:40:00   12:40:05       2     100     100&lt;br /&gt;         12:39:58   12:40:01       1     100     100&lt;br /&gt;         12:38:58   12:39:58       1     100     100&lt;br /&gt;         12:38:53   12:39:53       2     100     100&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: In Oracle 10.2 and above, the GOODNESS indicates how attractive the instance is with respect to processing the workload presented to the database service. Lower numbers are preferred. The umber is internally calculated based on any goal (long or short) that was specified for that database service. In Oracle 10.2 and above, the DELTA column predicts how much GOODNESS will increase for every&lt;br /&gt;additional session that connects to the instance. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Start 10 jobs using SERVICE SLBA at RAC2&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac2 ~]$ startSLBAload.sh 20&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;12:41:18 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;       Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:41:27     1          3&lt;br /&gt;2010-04-16 12:41:27     2          7&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;12:42:30 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:42:39   12:42:45       2     416    9998&lt;br /&gt;         12:42:33   12:42:38       1     384    9844&lt;br /&gt;         12:40:58   12:41:58       1     384    9844&lt;br /&gt;         12:40:53   12:41:54       2     416    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Start CPU LOAD at RAC2&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac2 ~]$ cpu_load.sh &amp;amp;&lt;br /&gt;[1] 8882&lt;br /&gt;[oracle@rac2 ~]$ ps -ef | grep zip&lt;br /&gt;oracle    8883  8882 16 12:43 pts/1    00:00:01 gzip video1.mpg&lt;br /&gt;oracle    8884  8882  8 12:43 pts/1    00:00:00 gzip video2.mpg&lt;br /&gt;&lt;/pre&gt;Note: I created two gzip/guzip jobs at RAC2 to increase CPU utilization at RAC2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Query GV$SERVICEMEATIC for instance goodness&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:44:46 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:44:48   12:44:54       2    1666    9998&lt;br /&gt;         12:44:43   12:44:49       1     500    9994&lt;br /&gt;         12:43:54   12:44:54       2    1666    9998&lt;br /&gt;         12:42:58   12:43:58       1     500    9994&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Note: it is expected to see "Goodness" increasing in RAC2, compared to RAC1, RAC2&amp;nbsp;should be&amp;nbsp;less attractive to the incomming connections.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. Start 10 jobs using SERVICE SLBA at RAC2 - total 20 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:45:55 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:46:11     1          7&lt;br /&gt;2010-04-16 12:46:11     2         13&lt;br /&gt;&lt;br /&gt;12:46:03 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:46:10   12:46:14       2   12500    9998&lt;br /&gt;         12:46:03   12:46:07       1     588    9998&lt;br /&gt;         12:44:57   12:45:58       1     588    9998&lt;br /&gt;         12:44:54   12:45:54       2   12500    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;6. Start 10 jobs using SERVICE SLBA at RAC2 - total 30 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:47:52 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:48:06     1         15&lt;br /&gt;2010-04-16 12:48:06     2         15&lt;br /&gt;&lt;br /&gt;12:47:58 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:48:05   12:48:10       2   12500    9998&lt;br /&gt;         12:47:43   12:47:48       1     750    9998&lt;br /&gt;         12:46:54   12:47:55       2   12500    9998&lt;br /&gt;         12:45:58   12:46:58       1     750    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;7. Start 10 jobs using SERVICE SLBA at RAC2 - total 40 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:50:14 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:50:19   12:50:22       1    1428    9998&lt;br /&gt;         12:50:19   12:50:23       2   12500    9998&lt;br /&gt;         12:48:58   12:49:58       1    1428    9998&lt;br /&gt;         12:48:55   12:49:54       2   12500    9998&lt;br /&gt;&lt;br /&gt;12:50:21 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:50:39     1         15&lt;br /&gt;2010-04-16 12:50:39     2         25&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;12:51:23 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;8. Start 10 jobs using SERVICE SLBA at RAC2 - total 50 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:51:37     1         26&lt;br /&gt;2010-04-16 12:51:37     2         24&lt;br /&gt;&lt;br /&gt;12:51:30 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:51:40   12:51:43       2   12500    9998&lt;br /&gt;         12:51:28   12:51:33       1    2500    9998&lt;br /&gt;         12:49:58   12:50:58       1    2500    9998&lt;br /&gt;         12:49:54   12:50:55       2   12500    9998&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: We started to see # of session in RAC1 greater than that in RAC2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8. Start 10 jobs using SERVICE SLBA at RAC2 - total 60 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:53:15     1         34&lt;br /&gt;2010-04-16 12:53:15     2         26&lt;br /&gt;&lt;br /&gt;12:53:09 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:53:15   12:53:20       2   12500    9998&lt;br /&gt;         12:53:08   12:53:13       1    1700    9998&lt;br /&gt;         12:51:58   12:52:58       1    1700    9998&lt;br /&gt;         12:51:55   12:52:55       2   12500    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9. Start 10 jobs using SERVICE SLBA at RAC2 - total 70 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:54:23     1         42&lt;br /&gt;2010-04-16 12:54:23     2         28&lt;br /&gt;&lt;br /&gt;12:54:15 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:54:19   12:54:24       2   12500    9998&lt;br /&gt;         12:54:13   12:54:18       1    2100    9998&lt;br /&gt;         12:52:58   12:53:58       1    2100    9998&lt;br /&gt;         12:52:55   12:53:54       2   12500    9998&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9. Start 10 jobs using SERVICE SLBA at RAC2 - total 80 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:55:37 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:55:55     1         53&lt;br /&gt;2010-04-16 12:55:55     2         27&lt;br /&gt;&lt;br /&gt;12:55:50 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:55:55   12:55:59       2   12500    9998&lt;br /&gt;         12:55:48   12:55:52       1    2650    9998&lt;br /&gt;         12:54:52   12:55:55       2   12500    9998&lt;br /&gt;         12:53:58   12:54:58       1    2650    9998&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9. Start 10 jobs using SERVICE SLBA at RAC2 - total 90 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:56:48 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:56:59     1         59&lt;br /&gt;2010-04-16 12:56:59     2         31&lt;br /&gt;&lt;br /&gt;12:56:52 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:56:55   12:57:00       2   12500    9998&lt;br /&gt;         12:56:48   12:56:53       1    5000    9998&lt;br /&gt;         12:55:55   12:56:55       2   12500    9998&lt;br /&gt;         12:54:58   12:55:57       1    5000    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;10. Start 10 jobs using SERVICE SLBA at RAC2 - total 100 jobs&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;12:58:55 system@DEVDB&amp;gt; @ct&lt;br /&gt;count # of session by username DENIS&lt;br /&gt;&lt;br /&gt;                     Inst&lt;br /&gt;SYSDATE                ID   COUNT(*)&lt;br /&gt;------------------- ----- ----------&lt;br /&gt;2010-04-16 12:59:08     1         65&lt;br /&gt;2010-04-16 12:59:08     2         35&lt;br /&gt;&lt;br /&gt;12:59:01 system@DEVDB&amp;gt; @servicemetric.sql SLBA&lt;br /&gt;&lt;br /&gt;Service                         Inst    Good&lt;br /&gt;Name     Start Time End Time      ID    ness   DELTA&lt;br /&gt;-------- ---------- ---------- ----- ------- -------&lt;br /&gt;SLBA     12:59:05   12:59:10       2   12500    9998&lt;br /&gt;         12:58:54   12:58:57       1   12500    9998&lt;br /&gt;         12:57:58   12:58:57       1   12500    9998&lt;br /&gt;         12:57:52   12:58:52       2   12500    9998&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Note: At total jobs 100, the GOODNESS of two instances were evened out. The change of GOODNESS inidicated the LBA was working and somehow was used to direct the incomming connections to the less-loaded instance.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Scripts used in this test can be found &lt;a href="http://sites.google.com/site/denissunsite/code/script_sim_RAC_LBA.txt"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1323849099647814?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1323849099647814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1323849099647814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1323849099647814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1323849099647814'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-iii.html' title='Play with my toy 10g RAC III - Demonstrate Load Balancing Advisory'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-6378946373928365688</id><published>2010-04-12T12:03:00.003-04:00</published><updated>2011-04-12T17:03:29.044-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><title type='text'>Play with my toy 10g RAC II - Familiar with SRVCTL</title><content type='html'>In this post, I continue to describe the experiences I have gained through playing with my little toy RAC. First of all, I found my RAC database&amp;nbsp;could not fully function after restarting the VM servers, i.e. after my VM RAC1 and RAC2 nodes are powered on, the status of the cluster is usually shown as following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.CRM.cs                              OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.CRM.devdb1.srv                      OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.db                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac1.ASM1.asm                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   ONLINE     UNKNOWN on rac1&lt;br /&gt;ora.rac1.gsd                                  ONLINE     UNKNOWN on rac1&lt;br /&gt;ora.rac1.ons                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.vip                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac2.ASM2.asm                             ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   ONLINE     UNKNOWN on rac2&lt;br /&gt;ora.rac2.gsd                                  ONLINE     UNKNOWN on rac2&lt;br /&gt;ora.rac2.ons                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.vip                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It can be seen that the status of gsd and listener rescours are unknown. The service CRM is not started. I have to follow the following steps, which use SRVCTL exlusively to get the RAC work:&lt;br /&gt;&lt;br /&gt;- Stop application resources&lt;br /&gt;&lt;br /&gt;srvctl stop database -d devdb &lt;br /&gt;srvctl stop asm -n&amp;nbsp;rac1&lt;br /&gt;srvctl stop asm -n rac2&lt;br /&gt;srvctl stop nodeapps -n rac1&lt;br /&gt;srvctl stop nodeapps -n rac2&lt;br /&gt;- Start application resources&lt;br /&gt;&lt;br /&gt;srvctl start nodeapps -n rac1&lt;br /&gt;&lt;br /&gt;srvctl start nodeapps -n rac2&lt;br /&gt;srvctl start asm -n rac1&lt;br /&gt;srvctl start asm -n rac2&lt;br /&gt;srvctl start database -d devdb&lt;br /&gt;srvctl start service -d&amp;nbsp;devdb -s CRM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here I list some other srvctl commands which may be useful for reference:&lt;br /&gt;&lt;br /&gt;- Start and stop instances&lt;br /&gt;srvctl start instance -d devdb -i devdb1&lt;br /&gt;srvctl stop instance -d devdb -i devdb1&lt;br /&gt;&lt;br /&gt;- Start and stop listeners&lt;br /&gt;srvctl start listener -n devdb1 -l LISTENER_RAC1&lt;br /&gt;srvctl stop listener -n devdb2 -l LISTENER_RAC2&lt;br /&gt;&lt;br /&gt;- View current configuration for the entire cluster database&lt;br /&gt;srvctl config database -d devdb -a &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[oracle@rac1 ~]$ srvctl config database -d devdb -a&lt;br /&gt;rac1 devdb1 /u01/app/oracle/product/10.2.0/db_1&lt;br /&gt;rac2 devdb2 /u01/app/oracle/product/10.2.0/db_1&lt;br /&gt;DB_NAME: devdb&lt;br /&gt;ORACLE_HOME: /u01/app/oracle/product/10.2.0/db_1&lt;br /&gt;SPFILE: +DG1/devdb/spfiledevdb.ora&lt;br /&gt;DOMAIN: null&lt;br /&gt;DB_ROLE: null&lt;br /&gt;START_OPTIONS: null&lt;br /&gt;POLICY:  AUTOMATIC&lt;br /&gt;ENABLE FLAG: DB ENABLED&lt;br /&gt;&lt;/pre&gt;- View the configuration for all node applications for node rac2&lt;br /&gt;srvctl config nodeapps -n rac2&lt;br /&gt;&lt;br /&gt;- Create a new service&lt;br /&gt;srvctl add service -d devdb -s CRM&lt;br /&gt;&lt;br /&gt;- Start a service on the whole cluster&lt;br /&gt;srvctl start service -d devdb -s CRM&lt;br /&gt;&lt;br /&gt;- Stop a service on both instance, force it to stop (-f)&lt;br /&gt;srvctl stop service -d devdb -s CRM -i devdb1,devdb2 -f&lt;br /&gt;&lt;br /&gt;Note: it does not work, I have to do:&lt;br /&gt;srvctl stop service -d devdb -s CRM -i devdb1 -f&lt;br /&gt;srvctl stop service -d devdb -s CRM -i devdb2 -f&lt;br /&gt;&lt;br /&gt;- Enable a service on the devdb2 instance only&lt;br /&gt;srvctl enable service -d devdb -s CRM -i devdb2&lt;br /&gt;&lt;br /&gt;- Disable a service on the devdb1 instance only&lt;br /&gt;srvctl disable service -d devdb -s CRM -i devdb1&lt;br /&gt;&lt;br /&gt;- Modify a service so that devdb2 becomes preferred instance&lt;br /&gt;srvctl modify service -d devdb -s CRM -i devdb2 -r&lt;br /&gt;&lt;br /&gt;- Remove a service&lt;br /&gt;srvctl remove service -d devdb -s CRM&lt;br /&gt;&lt;br /&gt;- View config for a service&lt;br /&gt;srvctl config service -d devdb -s CRM -a&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;strong&gt;&lt;em&gt;Apr 17,2010 Update:&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After all CRS resource offline, I was able to bring everything up by: &lt;span style="color: blue;"&gt;&lt;strong&gt;crs_start -all&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.SLBA.cs                             OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SLBA.devdb1.srv                     OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SLBA.devdb2.srv                     OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.cs                           OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.devdb1.srv                   OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.SNOLBA.devdb2.srv                   OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.db                                  OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.devdb1.inst                         OFFLINE    OFFLINE&lt;br /&gt;ora.devdb.devdb2.inst                         OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.ASM1.asm                             OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.gsd                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.ons                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac1.vip                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.ASM2.asm                             OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.gsd                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.ons                                  OFFLINE    OFFLINE&lt;br /&gt;ora.rac2.vip                                  OFFLINE    OFFLINE&lt;br /&gt;oracle@rac1 ~]$ crs_start -all&lt;br /&gt;Attempting to start `ora.rac1.vip` on member `rac1`&lt;br /&gt;Attempting to start `ora.rac2.vip` on member `rac2`&lt;br /&gt;Start of `ora.rac2.vip` on member `rac2` succeeded.&lt;br /&gt;Start of `ora.rac1.vip` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.rac1.ASM1.asm` on member `rac1`&lt;br /&gt;Attempting to start `ora.rac2.ASM2.asm` on member `rac2`&lt;br /&gt;Start of `ora.rac2.ASM2.asm` on member `rac2` succeeded.&lt;br /&gt;Attempting to start `ora.devdb.devdb2.inst` on member `rac2`&lt;br /&gt;Start of `ora.rac1.ASM1.asm` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.devdb.devdb1.inst` on member `rac1`&lt;br /&gt;Start of `ora.devdb.devdb2.inst` on member `rac2` succeeded.&lt;br /&gt;Attempting to start `ora.rac2.LISTENER_RAC2.lsnr` on member `rac2`&lt;br /&gt;Start of `ora.rac2.LISTENER_RAC2.lsnr` on member `rac2` succeeded.&lt;br /&gt;Start of `ora.devdb.devdb1.inst` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.rac1.LISTENER_RAC1.lsnr` on member `rac1`&lt;br /&gt;Start of `ora.rac1.LISTENER_RAC1.lsnr` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.devdb.SLBA.cs` on member `rac1`&lt;br /&gt;Attempting to start `ora.devdb.SLBA.devdb2.srv` on member `rac2`&lt;br /&gt;Attempting to start `ora.devdb.SLBA.devdb1.srv` on member `rac1`&lt;br /&gt;Start of `ora.devdb.SLBA.devdb2.srv` on member `rac2` succeeded.&lt;br /&gt;Attempting to start `ora.devdb.SNOLBA.cs` on member `rac1`&lt;br /&gt;Attempting to start `ora.devdb.SNOLBA.devdb1.srv` on member `rac1`&lt;br /&gt;Start of `ora.devdb.SLBA.cs` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.rac1.gsd` on member `rac1`&lt;br /&gt;CRS-1002: Resource 'ora.rac1.ons' is already running on member 'rac1'&lt;br /&gt;&lt;br /&gt;Attempting to start `ora.devdb.SNOLBA.devdb2.srv` on member `rac2`&lt;br /&gt;Start of `ora.devdb.SNOLBA.devdb2.srv` on member `rac2` succeeded.&lt;br /&gt;Start of `ora.rac1.gsd` on member `rac1` succeeded.&lt;br /&gt;CRS-1002: Resource 'ora.devdb.db' is already running on member 'rac1'&lt;br /&gt;&lt;br /&gt;CRS-1002: Resource 'ora.rac2.ons' is already running on member 'rac2'&lt;br /&gt;&lt;br /&gt;Start of `ora.devdb.SLBA.devdb1.srv` on member `rac1` succeeded.&lt;br /&gt;Attempting to start `ora.rac2.gsd` on member `rac2`&lt;br /&gt;Start of `ora.devdb.SNOLBA.cs` on member `rac1` succeeded.&lt;br /&gt;Start of `ora.rac2.gsd` on member `rac2` succeeded.&lt;br /&gt;Start of `ora.devdb.SNOLBA.devdb1.srv` on member `rac1` succeeded.&lt;br /&gt;CRS-0223: Resource 'ora.devdb.db' has placement error.&lt;br /&gt;&lt;br /&gt;CRS-0223: Resource 'ora.rac1.ons' has placement error.&lt;br /&gt;&lt;br /&gt;CRS-0223: Resource 'ora.rac2.ons' has placement error.&lt;br /&gt;&lt;br /&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.SLBA.cs                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb1.srv                     ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SLBA.devdb2.srv                     ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.SNOLBA.cs                           ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb1.srv                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.SNOLBA.devdb2.srv                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.db                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac1.ASM1.asm                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.gsd                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.ons                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.vip                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac2.ASM2.asm                             ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.gsd                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.ons                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.vip                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-6378946373928365688?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/6378946373928365688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=6378946373928365688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6378946373928365688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6378946373928365688'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-ii-familiar.html' title='Play with my toy 10g RAC II - Familiar with SRVCTL'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-203934524525742333</id><published>2010-04-06T17:24:00.004-04:00</published><updated>2010-04-28T12:46:26.678-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TAF'/><category scheme='http://www.blogger.com/atom/ns#' term='RAC'/><title type='text'>Play with my toy 10g RAC - Test Transparent Application Failover  (TAF)</title><content type='html'>Finally I got my first toy 10g RAC set up based on &lt;a href="http://www.scribd.com/doc/320791/Install-Oracle-RAC-10g-on-Oracle-Enterprise-Linux-Using-VMware"&gt;Vincent Chan's excellent document&lt;/a&gt; (published in 2007, this doc has been not availabe on the original OTN websitr any more). This toy RAC has two nodes, which are VMWare server 2.0 Virtual Machines with CentOS 4.7 hosted on Windows XP. The next steps are of course to explore various RAC specific features on it as much as possible. I plan to re-visit all the hands-on labs I experienced when I was in an Oracle University Course "Oracle Database 10g: RAC for Adminstrators" about 2.5 years ago. I have been planning to set up a RAC since then, however, the actual action has been delayed again and again. Now the world is talking about 11g RAC though, I am still excited that I finally got this little out-dated toy done. &lt;br /&gt;&lt;br /&gt;Vicent's document also provided a test to demonstrate TAF, which I repeated here as a warm-up for my exploration:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1) Create a Service and start it&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Service Name : CRM &lt;br /&gt;Database Name : devdb&lt;br /&gt;Preferred Instance : devdb1&lt;br /&gt;Available Instance : devdb2&lt;br /&gt;TAF Policy : BASIC&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ srvctl add service -d devdb -s CRM -r devdb1 -a devdb2 -P BASIC&lt;br /&gt;[oracle@rac1 ~]$ srvctl config service -d devdb -s CRM -a&lt;br /&gt;CRM PREF: devdb1 AVAIL: devdb2 TAF: BASIC&lt;br /&gt;[oracle@rac1 ~]$ srvctl start service -d devdb -s CRM&lt;br /&gt;[oracle@rac1 ~]$ ./crs_rep.sh&lt;br /&gt;HA Resource                                   Target     State&lt;br /&gt;-----------                                   ------     -----&lt;br /&gt;ora.devdb.CRM.cs                              ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.CRM.devdb1.srv                      ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.CRM.devdb2.srv                      ONLINE     ONLINE on rac2&lt;br /&gt;ora.devdb.db                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb1.inst                         ONLINE     ONLINE on rac1&lt;br /&gt;ora.devdb.devdb2.inst                         ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac1.ASM1.asm                             ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.LISTENER_RAC1.lsnr                   ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.gsd                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.ons                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac1.vip                                  ONLINE     ONLINE on rac1&lt;br /&gt;ora.rac2.ASM2.asm                             ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.LISTENER_RAC2.lsnr                   ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.gsd                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.ons                                  ONLINE     ONLINE on rac2&lt;br /&gt;ora.rac2.vip                                  ONLINE     ONLINE on rac2&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(2) Add the following entry in the client tnsnames.ora&lt;br /&gt;&lt;pre class="sq" name="code"&gt;CRM =&lt;br /&gt;(DESCRIPTION =&lt;br /&gt;   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.31)(PORT = 1521))&lt;br /&gt;   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.32)(PORT = 1521))&lt;br /&gt;   (LOAD_BALANCE = yes)&lt;br /&gt;   (CONNECT_DATA =&lt;br /&gt;     (SERVER = DEDICATED)&lt;br /&gt;     (SERVICE_NAME = CRM)&lt;br /&gt;     (FAILOVER_MODE =&lt;br /&gt;        (TYPE = SELECT)&lt;br /&gt;        (METHOD = BASIC)&lt;br /&gt;        (RETRIES = 180)&lt;br /&gt;        (DELAY = 5)&lt;br /&gt;     )&lt;br /&gt;   )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(3) Connect the first session using CRM Service&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;C:\Documents and Settings\denis&amp;gt;sqlplus denis@CRM&lt;br /&gt;&lt;br /&gt;SQL*Plus: Release 11.1.0.6.0 - Production on Tue Apr 6 14:48:54 2010&lt;br /&gt;&lt;br /&gt;Copyright (c) 1982, 2007, Oracle.  All rights reserved.&lt;br /&gt;&lt;br /&gt;Enter password:&lt;br /&gt;&lt;br /&gt;Connected to:&lt;br /&gt;Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production&lt;br /&gt;With the Partitioning, Real Application Clusters, OLAP and Data Mining options&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select&lt;br /&gt;  2   failover_type,&lt;br /&gt;  3   failover_method,&lt;br /&gt;  4   failed_over&lt;br /&gt;  5   from v$session&lt;br /&gt;  6   where username='DENIS';&lt;br /&gt;&lt;br /&gt;FAILOVER_TYPE FAILOVER_M FAI&lt;br /&gt;------------- ---------- ---&lt;br /&gt;SELECT        BASIC      NO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select&lt;br /&gt;  2   instance_number instance#,&lt;br /&gt;  3   instance_name,&lt;br /&gt;  4   host_name,&lt;br /&gt;  5   status&lt;br /&gt;  6   from v$instance;&lt;br /&gt;&lt;br /&gt; INSTANCE# INSTANCE_NAME    HOST_NAME            STATUS&lt;br /&gt;---------- ---------------- -------------------- ------------&lt;br /&gt;         1 devdb1           rac1.localdomain     OPEN&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(4) Shutdwon instance devdb1 from another session login as SYS&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;sys@DEVDB&amp;gt; select&lt;br /&gt;  2   instance_number instance#,&lt;br /&gt;  3   instance_name,&lt;br /&gt;  4   host_name,&lt;br /&gt;  5   status&lt;br /&gt;  6  from v$instance;&lt;br /&gt;&lt;br /&gt; INSTANCE# INSTANCE_NAME    HOST_NAME            STATUS&lt;br /&gt;---------- ---------------- -------------------- ------------&lt;br /&gt;         1 devdb1           rac1.localdomain     OPEN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sys@DEVDB&amp;gt; shutdown abort&lt;br /&gt;ORACLE instance shut down.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(5) Verify the session has failed over.&lt;br /&gt;In the first session:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; select&lt;br /&gt;  2   instance_number instance#,&lt;br /&gt;  3   instance_name,&lt;br /&gt;  4   host_name,&lt;br /&gt;  5   status&lt;br /&gt;  6  from v$instance;&lt;br /&gt;&lt;br /&gt; INSTANCE# INSTANCE_NAME    HOST_NAME            STATUS&lt;br /&gt;---------- ---------------- -------------------- ------------&lt;br /&gt;         2 devdb2           rac2.localdomain     OPEN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select&lt;br /&gt;  2    failover_type,&lt;br /&gt;  3    failover_method,&lt;br /&gt;  4    failed_over&lt;br /&gt;  5   from v$session&lt;br /&gt;  6  where username='DENIS';&lt;br /&gt;&lt;br /&gt;FAILOVER_TYPE FAILOVER_M FAI&lt;br /&gt;------------- ---------- ---&lt;br /&gt;SELECT        BASIC      YES&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(6) Relocate the CRM service back to the preferred instance. &lt;br /&gt;&lt;br /&gt;After devdb1 is brought back up, the CRM service does not automatically relocate &lt;br /&gt;back to the preferred instance. This means any new connections using CRM service will be on devdb2, instead of the preferred instance&lt;br /&gt;devdb1. This can be achieved by the following command:&lt;br /&gt;&lt;br /&gt;$ srvctl relocate service -d devdb -s CRM -i devdb2 -t devdb1&lt;br /&gt;&lt;br /&gt;The meaning of the command options can be seen here:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;[oracle@rac1 ~]$ srvctl relocate service -h&lt;br /&gt;Usage: srvctl relocate service -d &amp;lt;name&amp;gt; -s &amp;lt;service_name&amp;gt; -i &amp;lt;old_inst_name&amp;gt; -t &amp;lt;new_inst_name&amp;gt; [-f]&lt;br /&gt;    -d &amp;lt;name&amp;gt;           Unique name for the database&lt;br /&gt;    -s &amp;lt;service&amp;gt;        Service name&lt;br /&gt;    -i &amp;lt;old_inst&amp;gt;       Old instance name&lt;br /&gt;    -t &amp;lt;new_inst&amp;gt;       New instance name&lt;br /&gt;    -f                  Disconnect all sessions during stop or relocate service operations&lt;br /&gt;    -h                  Print usage&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-203934524525742333?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/203934524525742333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=203934524525742333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/203934524525742333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/203934524525742333'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/play-with-my-toy-10g-rac-test.html' title='Play with my toy 10g RAC - Test Transparent Application Failover  (TAF)'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1283695932187814684</id><published>2010-04-01T14:15:00.003-04:00</published><updated>2010-04-06T19:58:21.552-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='block corruption'/><category scheme='http://www.blogger.com/atom/ns#' term='dbverify'/><category scheme='http://www.blogger.com/atom/ns#' term='nologging'/><title type='text'>Data block was loaded using the NOLOGGING option</title><content type='html'>A production database went live last weekend through cloning and applying archived logs by similiar approach as described in &lt;a href="http://oracle-study-notes.blogspot.com/2008/06/clone-prodution-database-for-disaster.html"&gt;this post&lt;/a&gt;. However, when users did an insert into a table, they recieved &lt;em&gt;&lt;span style="color: blue;"&gt;" ORA-26040: Data block was loaded using the NOLOGGING option", "ORA-01578: ORACLE data block corrupted (file # xx, block # xxx)"&lt;/span&gt;&lt;/em&gt;. By querying DBA_EXTENTS with file # and block #, I identfied this block belongs to an index segment.&amp;nbsp; After discussing with app DBAs, I realized that during cloning period, at source database, rebuild indexes for that table has been performed and those indexes have nologging option turned on. During dissussion, app DBAs also suggested to use DBVERIFY to check other&amp;nbsp;possible&amp;nbsp;block corruption, I was not so sure it could work. I was under assumption that DBVEFRIFY can only detect physical block corruptions, not logical block corruptions. As we have already identified the root cause, we have not done DBV for all data files, we just dropped the table and re-created all indexes (app DBA confirms that we don't need the data in the new database acutally).&lt;br /&gt;&lt;br /&gt;Today, I did a test to see if DBV is supposed to catch such kind of block corruption. The overall test steps is described as follows:&lt;br /&gt;&lt;br /&gt;1. Create a test tablespace, idx_temp&lt;br /&gt;2. Create a table and an index on idx_temp tablespace&lt;br /&gt;3. Backup idx_temp tablespace&lt;br /&gt;4. Rebuild the index with nologging&lt;br /&gt;5. Some&amp;nbsp;DML activities&lt;br /&gt;6. Lost of idx_temp tablespace datafile&lt;br /&gt;7. Recover tablespace &lt;br /&gt;8. Full scan the index&lt;br /&gt;9. Identify corrupted block by DBV and analyze statement &lt;br /&gt;&lt;br /&gt;Note: during test I have learned that&amp;nbsp; FORCE_LOGGING&amp;nbsp; should not be&amp;nbsp;turned on at database level, otherwise the test will fail to demonstrate the points.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; drop table t;&lt;br /&gt;drop table t&lt;br /&gt;           *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00942: table or view does not exist&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;SQL&amp;gt; drop tablespace idx_temp including contents and datafiles;&lt;br /&gt; &lt;br /&gt;Tablespace dropped.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; create tablespace idx_temp datafile '/tmp/idx_temp_data_1.dbf' size 200M;&lt;br /&gt; &lt;br /&gt;Tablespace created.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; create table t as select rownum id, a.* from dba_objects a;&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; create index t_idx on t(id) tablespace idx_temp nologging;&lt;br /&gt; &lt;br /&gt;Index created.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; alter tablespace idx_temp begin backup;&lt;br /&gt; &lt;br /&gt;Tablespace altered.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; ho cp /tmp/idx_temp_data_1.dbf /tmp/idx_temp_data_1.dbf.bak&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; alter tablespace idx_temp end backup;&lt;br /&gt; &lt;br /&gt;Tablespace altered.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; alter index t_idx rebuild;&lt;br /&gt; &lt;br /&gt;Index altered.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; update t set object_name=lower(object_name);&lt;br /&gt; &lt;br /&gt;50842 rows updated.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; ho rm -f /tmp/idx_temp_data_1.dbf&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; alter tablespace idx_temp offline immediate;&lt;br /&gt; &lt;br /&gt;Tablespace altered.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; ho cp /tmp/idx_temp_data_1.dbf.bak /tmp/idx_temp_data_1.dbf&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; recover tablespace idx_temp;&lt;br /&gt;Media recovery complete.&lt;br /&gt;SQL&amp;gt; alter tablespace idx_temp online;&lt;br /&gt; &lt;br /&gt;Tablespace altered.&lt;br /&gt; &lt;br /&gt;SQL&amp;gt; select count(id) from t;&lt;br /&gt;select count(id) from t&lt;br /&gt;                      *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01578: ORACLE data block corrupted (file # 14, block # 141)&lt;br /&gt;ORA-01110: data file 14: '/tmp/idx_temp_data_1.dbf'&lt;br /&gt;ORA-26040: Data block was loaded using the NOLOGGING option&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;SQL&amp;gt; analyze index t_idx validate structure;&lt;br /&gt;analyze index t_idx validate structure&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01578: ORACLE data block corrupted (file # 14, block # 141)&lt;br /&gt;ORA-01110: data file 14: '/tmp/idx_temp_data_1.dbf'&lt;br /&gt;ORA-26040: Data block was loaded using the NOLOGGING option&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It can be seen that full scan the index blocks or using analyze validate structure can identify the block corruption. Let's see how DBVERIFY utility can tell us.&lt;br /&gt;&lt;br /&gt;This utility can run against the data file:&lt;br /&gt;dbv file='/tmp/idx_temp_data_1.dbf' logfile='dbv.log'&lt;br /&gt;&lt;br /&gt;From the screen, I can see:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;DBVERIFY: Release 10.2.0.1.0 - Production on Thu Apr 1 09:09:50 2010&lt;br /&gt; &lt;br /&gt;Copyright (c) 1982, 2005, Oracle.  All rights reserved.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;DBV-00200: Block, dba 58720397, already marked corrupted&lt;br /&gt; &lt;br /&gt;DBV-00200: Block, dba 58720398, already marked corrupted&lt;br /&gt; &lt;br /&gt;DBV-00200: Block, dba 58720399, already marked corrupted&lt;br /&gt; &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;DBV-00200: Block, dba 58720513, already marked corrupted&lt;br /&gt; &lt;br /&gt;DBV-00200: Block, dba 58720514, already marked corrupted&lt;br /&gt; &lt;br /&gt;DBV-00200: Block, dba 58720515, already marked corrupted&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the log file, I have:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;DBVERIFY: Release 10.2.0.1.0 - Production on Thu Apr 1 09:09:50 2010&lt;br /&gt; &lt;br /&gt;Copyright (c) 1982, 2005, Oracle.  All rights reserved.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;DBVERIFY - Verification starting : FILE = /tmp/idx_temp_data_1.dbf&lt;br /&gt; &lt;br /&gt;DBVERIFY - Verification complete&lt;br /&gt; &lt;br /&gt;Total Pages Examined         : 25600&lt;br /&gt;Total Pages Processed (Data) : 0&lt;br /&gt;Total Pages Failing   (Data) : 0&lt;br /&gt;Total Pages Processed (Index): 114&lt;br /&gt;Total Pages Failing   (Index): 0&lt;br /&gt;Total Pages Processed (Other): 140&lt;br /&gt;Total Pages Processed (Seg)  : 0&lt;br /&gt;Total Pages Failing   (Seg)  : 0&lt;br /&gt;Total Pages Empty            : 25346&lt;br /&gt;Total Pages Marked Corrupt   : 112&lt;br /&gt;Total Pages Influx           : 0&lt;br /&gt;Highest block SCN            : 1781276169 (2536.1781276169)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, the DBVERIFY utility did catch corrupted blocks.To find out which segments having corrupted blocks, I have to convert DBA to file# and block# by following, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; SELECT dbms_utility.data_block_address_block(58720399) "BLOCK",&lt;br /&gt;       dbms_utility.data_block_address_file(58720399) "FILE"&lt;br /&gt;FROM dual;&lt;br /&gt;  2    3  &lt;br /&gt;     BLOCK       FILE&lt;br /&gt;---------- ----------&lt;br /&gt;       143         14&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; SELECT owner, segment_name&lt;br /&gt;  FROM DBA_EXTENTS&lt;br /&gt; WHERE file_id = &amp;amp;p1&lt;br /&gt;   AND &amp;amp;p2 between block_id AND block_id + blocks - 1 ;&lt;br /&gt;  2    3    4  Enter value for p1: 14&lt;br /&gt;old   3:  WHERE file_id = &amp;amp;p1&lt;br /&gt;new   3:  WHERE file_id = 14&lt;br /&gt;Enter value for p2: 143&lt;br /&gt;old   4:    AND &amp;amp;p2 between block_id AND block_id + blocks - 1&lt;br /&gt;new   4:    AND 143 between block_id AND block_id + blocks - 1&lt;br /&gt; &lt;br /&gt;OWNER&lt;br /&gt;------------------------------&lt;br /&gt;SEGMENT_NAME&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;OPS$ORACLE&lt;br /&gt;T_IDX&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The DBVERIFY can also be used to check segments using segment_id as input. Per Oracle document:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SEGMENT_ID Specifies the segment that you want to verify. It is composed of the tablespace ID number (tsn), segment header file number (segfile), and segment header block number (segblock). You can get this information from SYS_USER_SEGS. The relevant columns are TABLESPACE_ID, HEADER_FILE, and HEADER_BLOCK. You must have SYSDBA privileges to query SYS_USER_SEGS. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;However, in my test case, I can not find anything from SYS_USER_SEGS. Don't know why yet.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; select TABLESPACE_ID, HEADER_FILE, HEADER_BLOCK from SYS_USER_SEGS where segment_name='T_IDX';&lt;br /&gt; &lt;br /&gt;no rows selected&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To obtain the segment_id, I have to do:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SQL&amp;gt; select segment_name, tablespace_name, header_file, header_block   &lt;br /&gt;from dba_segments      &lt;br /&gt;where segment_name='T_IDX';  &lt;br /&gt;  2    3  &lt;br /&gt;SEGMENT_NAME         TABLESPACE_NAME       HEADER_FILE HEADER_BLOCK&lt;br /&gt;-------------------- --------------------- ----------- ------------&lt;br /&gt;T_IDX                IDX_TEMP                       14          139&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select ts#,name from v$tablespace where name='IDX_TEMP';&lt;br /&gt; &lt;br /&gt;       TS# NAME&lt;br /&gt;---------- ------------------------------&lt;br /&gt;        17 IDX_TEMP&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally I can do: &lt;strong&gt;dbv user/pass segment_id=17.14.139&lt;/strong&gt; , and in this case, I received same info as in the case of running against the data file.&lt;br /&gt;&lt;br /&gt;In retrospective, "anaylyze validate structure" probably was the best option to check table and index block corruption for that database if we suspected there were other corruptions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1283695932187814684?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1283695932187814684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1283695932187814684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1283695932187814684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1283695932187814684'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/04/data-block-was-loaded-using-nologging.html' title='Data block was loaded using the NOLOGGING option'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-7967409638589286331</id><published>2010-03-24T17:11:00.001-04:00</published><updated>2010-03-24T17:12:34.129-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='sequence'/><title type='text'>Bump up sequences</title><content type='html'>I got a requirement to bump up more than 200 sequences in a database. Initially I developed SQL scripts to bump up based on the difference between the target value and the dba_sequneces.last_number column for each of the sequences. However, I soon found out that the last_number does  not necessarily equal to the seq.nextval. This is apparently due to the cache_size option. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;TESTDB&amp;gt; create sequence temp_seq;&lt;br /&gt;&lt;br /&gt;Sequence created.&lt;br /&gt;&lt;br /&gt;TESTDB&amp;gt; select temp_seq.nextval from dual;&lt;br /&gt;&lt;br /&gt;   NEXTVAL&lt;br /&gt;----------&lt;br /&gt;         1&lt;br /&gt;&lt;br /&gt;TESTDB&amp;gt; select temp_seq.nextval from dual;&lt;br /&gt;&lt;br /&gt;   NEXTVAL&lt;br /&gt;----------&lt;br /&gt;         2&lt;br /&gt;&lt;br /&gt;TESTDB&amp;gt; select SEQUENCE_NAME, cache_size, last_number from user_sequences;&lt;br /&gt;&lt;br /&gt;SEQUENCE_NAME                  CACHE_SIZE LAST_NUMBER&lt;br /&gt;------------------------------ ---------- -----------&lt;br /&gt;TEMP_SEQ                               20          21&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I finally decdied to adopt a PL/SQL solution. I first created a helper table (seq_bump), which stores the target values. Then, I created the following PL/SQL procedure:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code" &gt;declare&lt;br /&gt;  cursor c is &lt;br /&gt;   select seq_owner, seq_name, bump_number &lt;br /&gt;   from seq_bump;&lt;br /&gt;&lt;br /&gt;  stmt varchar2(300);&lt;br /&gt;  l_seq_owner seq_bump.seq_owner%type;&lt;br /&gt;  l_seq_name seq_bump.seq_name%type;&lt;br /&gt;  l_bump_number seq_bump.bump_number%type;&lt;br /&gt;  l_nextval number;&lt;br /&gt;  l_inc   number;&lt;br /&gt;  l_count number :=0;&lt;br /&gt;begin&lt;br /&gt;  open c;&lt;br /&gt;  loop&lt;br /&gt;   -- l_count := l_count + 1;&lt;br /&gt;   --  dbms_output.put_line('**** conunter = ' || l_count );&lt;br /&gt;    fetch c into l_seq_owner, l_seq_name, l_bump_number;&lt;br /&gt;    stmt:= 'select ' || l_seq_owner || '.' || l_seq_name || '.nextval from dual';&lt;br /&gt;    execute immediate stmt into l_nextval;&lt;br /&gt;   --  dbms_output.put_line('next values is ' || l_nextval);&lt;br /&gt;    l_inc := l_bump_number - l_nextval;&lt;br /&gt;    stmt:= 'alter sequence ' || l_seq_owner || '.' || l_seq_name || ' increment by ' || l_inc ;&lt;br /&gt;   --  dbms_output.put_line(stmt);&lt;br /&gt;    execute immediate stmt;&lt;br /&gt;    stmt:= 'select ' || l_seq_owner || '.' || l_seq_name || '.nextval from dual';&lt;br /&gt;  --  dbms_output.put_line(stmt);&lt;br /&gt;    execute immediate stmt into l_nextval;&lt;br /&gt;    stmt:= 'alter sequence ' || l_seq_owner || '.' || l_seq_name || ' increment by 1 ';&lt;br /&gt;    execute immediate stmt;&lt;br /&gt;    exit when c%notfound;&lt;br /&gt;  end loop;&lt;br /&gt;  close c;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I tested above procedure and this will be implemented in production this weekend, hopefully it will work as I expect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-7967409638589286331?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/7967409638589286331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=7967409638589286331' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7967409638589286331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/7967409638589286331'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/03/bump-up-sequences.html' title='Bump up sequences'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1384798327337671873</id><published>2010-03-22T19:13:00.005-04:00</published><updated>2010-05-11T13:35:10.879-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cursor_sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='sql tuning'/><title type='text'>Demonstrate a function-based index is unable to be used due to cursor_sharing setting</title><content type='html'>&lt;pre class="sql" name="code"&gt;rem  Demonstrate a function-based index is unable to be used&lt;br /&gt;rem  due to cursor_sharing setting&lt;br /&gt;rem&lt;br /&gt;rem  The function is substr(col, 1,6), when cursor_sharing = &lt;br /&gt;rem  FORCE or SIMILAR, the literals, i,e, 1 and 6 are replaced &lt;br /&gt;rem  by system-generated variables. This may casued mis-match &lt;br /&gt;rem  against the index definition&lt;br /&gt;rem&lt;br /&gt;rem  When we use autotrace to check the exection plan,&lt;br /&gt;rem  we do see the index is used; however, at run time, this is &lt;br /&gt;rem  not the case as shown by 10046 trace. &lt;br /&gt;rem&lt;br /&gt;rem  Test env: 9.2.0.8 &lt;br /&gt;&lt;br /&gt;set echo on&lt;br /&gt;spool fun_idx&lt;br /&gt;&lt;br /&gt;drop table t;&lt;br /&gt;create table t as&lt;br /&gt;select rownum id,&lt;br /&gt;       object_name name,&lt;br /&gt;       rpad('x',8) val&lt;br /&gt;from all_objects &lt;br /&gt;where rownum &amp;lt;=2000;&lt;br /&gt;&lt;br /&gt;create index t_idx on t(substr(name, 1,6));&lt;br /&gt;exec dbms_stats.gather_table_stats(user,'t', cascade=&amp;gt;true);&lt;br /&gt;&lt;br /&gt;select * from v$version;&lt;br /&gt;&lt;br /&gt;alter session set tracefile_identifier=fun;&lt;br /&gt;alter session set timed_statistics=true;&lt;br /&gt;alter session set events '10046 trace name context forever, level 12';&lt;br /&gt;&lt;br /&gt;alter session set cursor_sharing=force;&lt;br /&gt;select /* force */ * &lt;br /&gt;from t &lt;br /&gt;where substr(name,1,6)='ABCDEF';&lt;br /&gt;&lt;br /&gt;alter session set cursor_sharing=similar;&lt;br /&gt;select /* similar */ * &lt;br /&gt;from t &lt;br /&gt;where substr(name,1,6)='ABCDEF';&lt;br /&gt;&lt;br /&gt;alter session set cursor_sharing=exact;&lt;br /&gt;select /* exact */ * &lt;br /&gt;from t &lt;br /&gt;where substr(name,1,6)='ABCDEF';&lt;br /&gt;&lt;br /&gt;exit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;set doc off&lt;br /&gt;doc&lt;br /&gt;&lt;br /&gt;--- force  ----&lt;br /&gt;&lt;br /&gt;select /* force */ *&lt;br /&gt;from t&lt;br /&gt;where substr(name,:"SYS_B_0",:"SYS_B_1")=:"SYS_B_2"&lt;br /&gt; &lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.00       0.00          0          0          0           0&lt;br /&gt;Execute      1      0.00       0.00          0          0          0           0&lt;br /&gt;Fetch        1      0.00       0.00          0         13          0           0&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;total        3      0.00       0.00          0         13          0           0&lt;br /&gt; &lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Optimizer goal: CHOOSE&lt;br /&gt;Parsing user id: 183&lt;br /&gt; &lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      0  TABLE ACCESS FULL T&lt;br /&gt;&lt;br /&gt;--- similar ----&lt;br /&gt; &lt;br /&gt;select /* similar */ *&lt;br /&gt;from t&lt;br /&gt;where substr(name,:"SYS_B_0",:"SYS_B_1")=:"SYS_B_2"&lt;br /&gt; &lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.01       0.00          0          0          0           0&lt;br /&gt;Execute      1      0.00       0.00          0          0          0           0&lt;br /&gt;Fetch        1      0.00       0.00          0         13          0           0&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;total        3      0.01       0.00          0         13          0           0&lt;br /&gt; &lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Optimizer goal: CHOOSE&lt;br /&gt;Parsing user id: 183&lt;br /&gt; &lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      0  TABLE ACCESS FULL T&lt;br /&gt;&lt;br /&gt;--- exact ---&lt;br /&gt;&lt;br /&gt;select /* exact */ *&lt;br /&gt;from t&lt;br /&gt;where substr(name,1,6)='ABCDEF'&lt;br /&gt; &lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.00       0.00          0          0          0           0&lt;br /&gt;Execute      1      0.00       0.00          0          0          0           0&lt;br /&gt;Fetch        1      0.00       0.00          0          2          0           0&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;total        3      0.00       0.00          0          2          0           0&lt;br /&gt; &lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Optimizer goal: CHOOSE&lt;br /&gt;Parsing user id: 183&lt;br /&gt; &lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;      0  TABLE ACCESS BY INDEX ROWID T&lt;br /&gt;      0   INDEX RANGE SCAN T_IDX (object id 224130)&lt;br /&gt;# &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;May 11, 2010 updated: Original post ended at the previous line, all below&amp;nbsp;is added today:&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I was pinged by one of my colleagues the other day saying "Jonathan Lewis referred to your blog". I was surprized to hear that. Then I found out that Coskan first included this post in his &lt;a href="http://coskan.wordpress.com/2010/05/03/blogroll-report-41/"&gt;blog&lt;/a&gt; , then Jonathan mentioned it in &lt;a href="http://jonathanlewis.wordpress.com/2010/05/03/cursor-sharing-3/"&gt;one of his blog posts&lt;/a&gt;&amp;nbsp;(footnote section), which describes the same issue but of course includes deeper technical insights. I regarded Jonathan as my mentor secretly :-). First of all, I learned a lot from his blog and website, and his book "Cost-based Oracle Fundenmental" as well. In my LinkedIn profile "Reading List by Amazon" section, I commented "I read it through when I was on bench in Fall 2007. Even 20% of understanding of it helped me gain some respect from app team and peer DBAs by showing I was able to tune sqls . I will read it again and again utill fully digest it hopefully one day. " Secondly, I once listened to &lt;a href="http://communities.bmc.com/communities/community/historical/dbazine/podcasts;jsessionid=2E847EEBFA7BB0AA5B4C509C86D75311.node0"&gt;a podcast&lt;/a&gt; of his interview with DBAZine, in which he emphasized how the approach of building test cases can help one become better DBA or troubleshooter. I kept this in mind and have been trying practise this tip always. The test case I showed &amp;nbsp;in this post is a proof :-). The style of this test case is actually somewhat mimicing the code examples of the above mentioned book. Especially the "set doc off" syntax, which I did not know until I read his book. &lt;br /&gt;&lt;br /&gt;This test case was resulted from my trouble-shooting experience for a real production issue&amp;nbsp;at the posting date.&amp;nbsp;A production database&amp;nbsp;&amp;nbsp;server CPU utilization reached 100% from time to time from the morning&amp;nbsp;and some jobs were slower than normal. Top SQL during the problem period was an update statement, supposedly using a function-based index. I was called by a fellow DBA to check why full table scan was actually used instead. From the shared pool, we knew it&amp;nbsp;has been&amp;nbsp;executed by FTS .&lt;br /&gt;&lt;br /&gt;My favorite tool to check the execution plan at the first round is Autotrace :&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;** Autotrace showing index scan but consistent gets = 148626&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;myusrid@MYPRDDB1&amp;gt; set autotrace traceonly&lt;br /&gt;myusrid@MYPRDDB1&amp;gt; select * from&lt;br /&gt;2 XYZ_UVW.ABC_ABCDEFG_ABCDEF_ABCDEF&lt;br /&gt;3 WHERE substr(DEPENDANT_ORDER,1,13) = '123456789012'&lt;br /&gt;4 ;&lt;br /&gt;&lt;br /&gt;o rows selected&lt;br /&gt;&lt;br /&gt;ecution Plan&lt;br /&gt;---------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=18 Bytes=1494)&lt;br /&gt;1 0 TABLE ACCESS (BY INDEX ROWID) OF 'ABC_ABCDEFG_ABCDEF_ABCDEF' (Cost=4 Card=18 Bytes=1494)&lt;br /&gt;2 1 INDEX (RANGE SCAN) OF 'ABC_ABCDEFG_ABCDEF_ABCDE_IDX5N' (NON-UNIQUE) (Cost=Card=1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;statistics&lt;br /&gt;---------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;&lt;span style="color: blue;"&gt;148626 consistent gets&lt;/span&gt;&lt;br /&gt;135926 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;490 bytes sent via SQL*Net to client&lt;br /&gt;229 bytes received via SQL*Net from client&lt;br /&gt;1 SQL*Net roundtrips to/from client&lt;br /&gt;0 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;0 rows processed &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I knew parse-time execution plan could be different from run-time. So from Autotrace, I confirmed index scan was considered favarable, however from the "consistent gets", I knew at run time Oracle did FTS as it matched stackpack "Gets per Execution":&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;** From statspack during problem period, Gets Per Exec = 149314&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value&lt;br /&gt;--------------- ------------ -------------- ------ -------- --------- ----------&lt;br /&gt;98,995,283 663 &lt;span style="color: blue;"&gt;149,314.2&lt;/span&gt; 49.0 ######## 10769.86 3803649956&lt;br /&gt;Module: JDBC Thin Client&lt;br /&gt;UPDATE ABC_ABCDEFG_ABCDEF_ABCDEF SET DEPENDANT_ORDER =:1 WHERE S&lt;br /&gt;UBSTR(DEPENDANT_ORDER,:"SYS_B_0",:"SYS_B_1") =:2&lt;br /&gt;&lt;br /&gt;It took me quite a while to realize what happened was due to CURSOR_SHARING setting:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;** Autotrace showing index scan and consistent gets = 3 after seting cursor_sharing=exact&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;myusrid@MYPRDDB1&amp;gt; alter session set cursor_sharing=exact;&lt;br /&gt;&lt;br /&gt;Session altered. &lt;br /&gt;&lt;br /&gt;myusrid@MYPRDDB1&amp;gt; select * from&lt;br /&gt;2 XYZ_UVW.ABC_ABCDEFG_ABCDEF_ABCDEF&lt;br /&gt;3 WHERE substr(DEPENDANT_ORDER,1,13) = '123456789012'&lt;br /&gt;4 ;&lt;br /&gt;&lt;br /&gt;no rows selected&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=18 Bytes=1494)&lt;br /&gt;1 0 TABLE ACCESS (BY INDEX ROWID) OF 'ABC_ABCDEFG_ABCDEF_ABCDEF' (Cost=4 Card=18 Bytes=1494)&lt;br /&gt;2 1 INDEX (RANGE SCAN) OF 'ABC_ABCDEFG_ABCDEF_ABCDE_IDX5N' (NON-UNIQUE) (Cost=3 Card=1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;3 consistent gets&lt;br /&gt;2 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;490 bytes sent via SQL*Net to client&lt;br /&gt;229 bytes received via SQL*Net from client&lt;br /&gt;1 SQL*Net roundtrips to/from client&lt;br /&gt;0 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;0 rows processed &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I took a&amp;nbsp;brave step to solve the prodution issue as during the middle of the day code change was not possible and also it was subjected to some change management processes in my working envrionment. I told the development team, I was going to change CURSOR_SHARING from FORCE to EXACT in the production database as an emergent performance&amp;nbsp;stablizing measure ( as this change&amp;nbsp;should be&amp;nbsp;subjected to change management process too), and if we saw problems after the change, I would revert it back and they still needed to plan code change to fix that update statment (Dev think they should have used bind variables appropriately, but no one could really gurantee this change would not cause other more serious problems). So I changed it to EXACT, so far so good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1384798327337671873?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1384798327337671873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1384798327337671873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1384798327337671873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1384798327337671873'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/03/demonstrate-function-based-index-is.html' title='Demonstrate a function-based index is unable to be used due to cursor_sharing setting'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-5888415497393565701</id><published>2010-03-19T16:23:00.003-04:00</published><updated>2010-03-19T16:36:25.012-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snapshot too old'/><category scheme='http://www.blogger.com/atom/ns#' term='ORA-01555'/><category scheme='http://www.blogger.com/atom/ns#' term='trigger'/><title type='text'>How to find out which session caused ORA-01555?</title><content type='html'>Some times ago, my colleague asked me this question since we frequently recieved ORA-01555 alert email from our reporting database. The alerts came from the alert log monitoring job, which contains sql text but nothing more than that. I searched the internet and was excited to find a &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:469085348564906::::P11_QUESTION_ID:40115659055475"&gt;thread&lt;/a&gt;&amp;nbsp;on the AskTom site, which appeared to be exactly addressing our needs. &lt;br /&gt;&lt;br /&gt;Based on that thread, I tested and installed the following database event trigger in our reporting database:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace trigger servererror_trig&lt;br /&gt;after servererror on database&lt;br /&gt;declare&lt;br /&gt;   var_id        number; &lt;br /&gt;   var_user      varchar2(30);&lt;br /&gt;   var_osuser    varchar2(30);&lt;br /&gt;   var_machine   varchar2(64);&lt;br /&gt;   var_process   varchar2(8);&lt;br /&gt;   var_program   varchar2(48);&lt;br /&gt;   var_txt       varchar2(4000);&lt;br /&gt;   l_sql_text    ora_name_list_t;&lt;br /&gt;   l_n           number;&lt;br /&gt;begin&lt;br /&gt;  if ( is_servererror(1555) )&lt;br /&gt;  then&lt;br /&gt;     select&lt;br /&gt;      username,&lt;br /&gt;      osuser,&lt;br /&gt;      machine,&lt;br /&gt;      process,&lt;br /&gt;      program&lt;br /&gt;    into&lt;br /&gt;      var_user,&lt;br /&gt;      var_osuser,&lt;br /&gt;      var_machine,&lt;br /&gt;      var_process,&lt;br /&gt;      var_program&lt;br /&gt;    from&lt;br /&gt;      v$session&lt;br /&gt;    where&lt;br /&gt;     audsid=userenv('sessionid');&lt;br /&gt; &lt;br /&gt;     l_n := ora_sql_txt( l_sql_text );&lt;br /&gt;     var_txt :=  'ora_sysevent = ' || ora_sysevent || ' ora_login_user = ' || ora_login_user || &lt;br /&gt;                   ' ora_server_error = ' || ora_server_error(1) || chr(10); &lt;br /&gt; &lt;br /&gt;     for i in 1 .. l_n&lt;br /&gt;     loop&lt;br /&gt;        var_txt := var_txt || l_sql_text(i); &lt;br /&gt;     end loop;&lt;br /&gt; &lt;br /&gt;     insert into&lt;br /&gt;      db_admin.servererror_log&lt;br /&gt;     values(&lt;br /&gt;      dbms_standard.server_error(1),&lt;br /&gt;      sysdate,&lt;br /&gt;      var_user,&lt;br /&gt;      var_osuser,&lt;br /&gt;      var_machine,&lt;br /&gt;      var_process,&lt;br /&gt;      var_program,&lt;br /&gt;      var_txt);&lt;br /&gt;  end if;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At begining, it looked good, however, soon I found that not all ORA-01555s that were appeared in the alert log were captured by this trigger. Being aware that some tables in the reporting database are referred by remote SQLs through dblink, I set up a test to see if this trigger workes for remote queries.&lt;br /&gt;&lt;br /&gt;First of all, I did everything in the local database:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;denis@DBWRKEV1&amp;gt; -- create undo tablespace small datafile  '/tmp/small.dbf' size 2m autoextend OFF;&lt;br /&gt;denis@DBWRKEV1&amp;gt; drop table ora_1555;&lt;br /&gt; &lt;br /&gt;Table dropped.&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; create table ora_1555 as select * from all_objects;&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; alter system set undo_tablespace = small;&lt;br /&gt; &lt;br /&gt;System altered.&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; --  Now open a cursor -- it is read consistent as of NOW&lt;br /&gt;denis@DBWRKEV1&amp;gt; variable x refcursor&lt;br /&gt;denis@DBWRKEV1&amp;gt; exec open :x for select * from ora_1555;&lt;br /&gt; &lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; -- generate lots of undo and commit and do it over again and again,&lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; begin&lt;br /&gt;  2    for i in 1 .. 10&lt;br /&gt;  3    loop&lt;br /&gt;  4         loop&lt;br /&gt;  5            delete from ora_1555 where rownum &amp;lt;= 1000;&lt;br /&gt;  6            exit when sql%rowcount = 0;&lt;br /&gt;  7            commit;&lt;br /&gt;  8         end loop;&lt;br /&gt;  9             commit;&lt;br /&gt; 10      insert into ora_1555 select * from all_objects;&lt;br /&gt; 11      commit;&lt;br /&gt; 12    end loop;&lt;br /&gt; 13  end;&lt;br /&gt; 14  /&lt;br /&gt; &lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; print x&lt;br /&gt;ERROR:&lt;br /&gt;ORA-01555: snapshot too old: rollback segment number 19 with name "_SYSSMU19$" too small&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;no rows selected&lt;br /&gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; &lt;br /&gt;denis@DBWRKEV1&amp;gt; select * from db_admin.servererror_log;&lt;br /&gt; &lt;br /&gt;ERROR                                                             TIMESTAMP           USERNAME&lt;br /&gt;----------------------------------------------------------------- ------------------- ------------------------------&lt;br /&gt;OSUSER                         MACHINE                                                          PROCESS&lt;br /&gt;------------------------------ ---------------------------------------------------------------- --------&lt;br /&gt;PROGRAM&lt;br /&gt;------------------------------------------------&lt;br /&gt;SQL_TEXT&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;1555                                                              2010-03-19 12:12:01 DENIS&lt;br /&gt;oracle                         sjscqdd1                                                         19823&lt;br /&gt;sqlplus@sjscqdd1 (TNS V1-V3)&lt;br /&gt;ora_sysevent = SERVERERROR ora_login_user = DENIS ora_server_error = 1555&lt;br /&gt;SELECT * FROM ORA_1555&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Check the alert log, I can find:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;Fri Mar 19 12:12:01 2010&lt;br /&gt;ORA-01555 caused by SQL statement below (SQL ID: 0kj3gdzq34dk9, Query Duration=100 sec, SCN: 0x09e8.6a0a74a2):&lt;br /&gt;Fri Mar 19 12:12:01 2010&lt;br /&gt;SELECT * FROM ORA_1555&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I do a test from remote db:&lt;br /&gt;&lt;br /&gt;-- At remote, open a curor for the test table through db link&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;denis@REMOTEDB&amp;gt;variable x refcursor&lt;br /&gt;denis@REMOTEDB&amp;gt;exec open :x for select * from ora_1555@dbwrkev1;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;-- At local&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;denis@DBWRKEV1&amp;gt; begin&lt;br /&gt;  2    for i in 1 .. 10&lt;br /&gt;  3    loop&lt;br /&gt;  4         loop&lt;br /&gt;  5            delete from ora_1555 where rownum &amp;lt;= 1000;&lt;br /&gt;  6            exit when sql%rowcount = 0;&lt;br /&gt;  7            commit;&lt;br /&gt;  8         end loop;&lt;br /&gt;  9             commit;&lt;br /&gt; 10      insert into ora_1555 select * from all_objects;&lt;br /&gt; 11      commit;&lt;br /&gt; 12    end loop;&lt;br /&gt; 13  end;&lt;br /&gt; 14  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;-- At remote &lt;br /&gt;&lt;pre class="sql" name="code"&gt;denis@REMOTEDB&amp;gt;print x&lt;br /&gt;ERROR:&lt;br /&gt;ORA-01555: snapshot too old: rollback segment number 19 with name "_SYSSMU19$" too small&lt;br /&gt;ORA-02063: preceding line from DBWRKEV1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;no rows selected&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;-- Local alert log (PST) &lt;br /&gt;&lt;pre class="sql" name="code"&gt;Fri Mar 19 12:20:11 2010&lt;br /&gt;ORA-01555 caused by SQL statement below (SQL ID: 7xnnz01z88xhp, Query Duration=249 sec, SCN: 0x09e8.6a135bd3):&lt;br /&gt;Fri Mar 19 12:20:11 2010&lt;br /&gt;SELECT "A1"."OWNER","A1"."OBJECT_NAME","A1"."SUBOBJECT_NAME","A1"."OBJECT_ID","A1"."DATA_OBJECT_ID","A1"."OBJECT_TYPE","&lt;br /&gt;A1"."CREATED","A1"."LAST_DDL_TIME","A1"."TIMESTAMP","A1"."STATUS","A1"."TEMPORARY","A1"."GENERATED","A1"."SECONDARY" FRO&lt;br /&gt;M "ORA_1555" "A1"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Note: it is intereting to see Oracle rewrites the original SQL in such a way that the '*' is expanded to full column list and charaters are capitalized. &lt;br /&gt;&lt;br /&gt;-- Remote alert log &lt;br /&gt;Not see any 1555, I am a little surprized. &lt;br /&gt;&lt;br /&gt;-- at local note the ORA-01555 in alert log at time 12:20 not captured by the trigger. &lt;br /&gt;&lt;pre class="sql" name="code"&gt;denis@DBWRKEV1&amp;gt; select * from db_admin.servererror_log;&lt;br /&gt; &lt;br /&gt;ERROR                                                             TIMESTAMP           USERNAME&lt;br /&gt;----------------------------------------------------------------- ------------------- ------------------------------&lt;br /&gt;OSUSER                         MACHINE                                                          PROCESS&lt;br /&gt;------------------------------ ---------------------------------------------------------------- --------&lt;br /&gt;PROGRAM&lt;br /&gt;------------------------------------------------&lt;br /&gt;SQL_TEXT&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;1555                                                              2010-03-19 12:12:01 DENIS&lt;br /&gt;oracle                         sjscqdd1                                                         19823&lt;br /&gt;sqlplus@sjscqdd1 (TNS V1-V3)&lt;br /&gt;ora_sysevent = SERVERERROR ora_login_user = DENIS ora_server_error = 1555&lt;br /&gt;SELECT * FROM ORA_1555&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In conclusion, the database event trigger solution to identify sessions cause ORA-01555 has its limitation when the session is initiated by a remote query through dblink.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-5888415497393565701?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/5888415497393565701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=5888415497393565701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5888415497393565701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5888415497393565701'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/03/how-to-find-out-which-session-caused.html' title='How to find out which session caused ORA-01555?'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-3855512105885181692</id><published>2010-03-17T16:01:00.001-04:00</published><updated>2010-03-17T16:03:24.417-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transportable tablespace'/><title type='text'>Copy schema between databases through transportable tablespace</title><content type='html'>Today, I worked out a plan to copy a schema from one database to another using transportable tablespace feature.The schema objects&amp;nbsp;only reside in three tablespaces. Below are the steps: (as usual, real schema, server name etc are modified):&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Check if the tablespace is self-contained &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;conn / as sysdba&lt;br /&gt;execute dbms_tts.transport_set_check('TST_PCD_DATA_1,TST_PCD_DATA_2,TST_PCD_IDX_1', true);&lt;br /&gt;&lt;br /&gt;SELECT * FROM TRANSPORT_SET_VIOLATIONS;&lt;br /&gt;&lt;br /&gt;Note: we should see no rows returned.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Make the tablespace READ ONLY at source:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;alter tablespace TST_PCD_DATA_1 read only; &lt;br /&gt;alter tablespace TST_PCD_DATA_2 read only;&lt;br /&gt;alter tablespace TST_PCD_IDX_1 read only;&lt;br /&gt;&lt;br /&gt;select tablespace_name, status from dba_tablespaces where status='READ ONLY';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Export the tablespace&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;exp tablespaces=TST_PCD_DATA_1,TST_PCD_DATA_2,TST_PCD_IDX_1 transport_tablespace=y file=sch1_tts.dmp&lt;br /&gt;&lt;br /&gt;Username: / as sysdba&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Drop the tablespaces in the target database&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;drop tablespace TST_PCD_DATA_1 including contents and datafiles; &lt;br /&gt;drop tablespace TST_PCD_DATA_2 including contents and datafiles;&lt;br /&gt;drop tablespace TST_PCD_IDX_1 including contents and datafiles;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6. Copy the data files and dump file to target server&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;select file_name from dba_data_files &lt;br /&gt;where tablespace_name in ('TST_PCD_DATA_1','TST_PCD_DATA_2','TST_PCD_IDX_1');&lt;br /&gt;&lt;br /&gt;FILE_NAME&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;/db1/u01/oradata/sch1stg1/TST_PCD_IDX_1_01.dbf&lt;br /&gt;/db1/u01/oradata/sch1stg1/TST_PCD_DATA_2_01.dbf&lt;br /&gt;/db1/u01/oradata/sch1stg1/TST_PCD_DATA_1_01.dbf&lt;br /&gt;&lt;br /&gt;ssh2 srcserv 'cat /db1/u01/oradata/sch1stg1/TST_PCD_IDX_1_01.dbf | gzip -c' | gunzip -c &amp;gt; /db1st2/u07/oradata/trgtdbsid/TST_PCD_IDX_1_01.dbf &lt;br /&gt;ssh2 srcserv 'cat /db1/u01/oradata/sch1stg1/TST_PCD_DATA_2_01.dbf | gzip -c' | gunzip -c &amp;gt; /db1st2/u07/oradata/trgtdbsid/TST_PCD_DATA_2_01.dbf &lt;br /&gt;ssh2 srcserv 'cat /db1/u01/oradata/sch1stg1/TST_PCD_DATA_1_01.dbf | gzip -c' | gunzip -c &amp;gt; /db1st2/u07/oradata/trgtdbsid/TST_PCD_DATA_1_01.dbf &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7. Make the tablespace read write at source database&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;alter tablespace TST_PCD_DATA_1 read write; &lt;br /&gt;alter tablespace TST_PCD_DATA_2 read write;&lt;br /&gt;alter tablespace TST_PCD_IDX_1 read write;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;8. At the target host, plug the tablespace into the target database.&lt;/strong&gt; &lt;br /&gt;From the OS command prompt, issue:&lt;br /&gt;&lt;br /&gt;imp parfile=imp_tts.par &lt;br /&gt;&lt;br /&gt;-- imp_tts.par --------------------------------------------&lt;br /&gt;tablespaces=TST_PCD_DATA_1,TST_PCD_DATA_2,TST_PCD_IDX_1 &lt;br /&gt;transport_tablespace=y &lt;br /&gt;file=sch1_tts.dmp&lt;br /&gt;datafiles=( &lt;br /&gt;'/db1st2/u07/oradata/trgtdbsid/TST_PCD_IDX_1_01.dbf'&lt;br /&gt;,'/db1st2/u07/oradata/trgtdbsid/TST_PCD_DATA_2_01.dbf'&lt;br /&gt;,'/db1st2/u07/oradata/trgtdbsid/TST_PCD_DATA_1_01.dbf'&lt;br /&gt;)&lt;br /&gt;tts_owners=ssp2_sch1&lt;br /&gt;------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Note: enter / as sysdba for username&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-3855512105885181692?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/3855512105885181692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=3855512105885181692' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3855512105885181692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/3855512105885181692'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/03/copy-schema-between-databases-through.html' title='Copy schema between databases through transportable tablespace'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-5791768955072759056</id><published>2010-03-13T08:34:00.011-05:00</published><updated>2010-03-16T15:00:58.854-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Best practices and recommendations for preparing  SQL Scripts</title><content type='html'>We have code release for our Oracle databases frequently.&amp;nbsp;Typically it is implemented&amp;nbsp;by executing various SQL or PL/SQL scripits on servers&amp;nbsp;from SQL*Plus.&amp;nbsp;&amp;nbsp;Many times I have observed there are&amp;nbsp;simple syntax errors in the scripts we received from development team and also the format of the script is not consistent. I thus tried to compile a list of best practices and recommendations for preparing the release scripts for the team. Here are some points:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Add spool to every script in the following format as minimum:&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set echo on timing on&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; spool log/script_name&lt;script_name&gt;.log&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; spool off&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Separate DDL and DML SQL statements into different scripts.&lt;/span&gt;&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Recommend using suffix to distinguish DDL and DML script: e.g. script_ddl.sql, script_dml.sql. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Separate different type of object creation into different scripts:&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;i.e. table, index, package etc. Recommend using the following suffix to distinguish different script in&amp;nbsp;&amp;nbsp; the format: script_xxx.sql. The ‘&lt;strong&gt;xxx&lt;/strong&gt;’can be:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Package specification&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pks&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Package body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pkb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Package sepc and body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pkg&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Procdueure&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Trigger&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;trg&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fun &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create table script(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tab or&amp;nbsp;ddl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Synonym creation statements&amp;nbsp;&amp;nbsp; syn&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index definition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;idx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Constraint definitions&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Use lower case ".sql" as a suffix for all scripts&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt; [&lt;/span&gt;&lt;/strong&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;Mar 16,2010 Update - I tried to do: grep -i create *.sql yesterday, I failed to find a new table creation&amp;nbsp; due to the script ended with ".SQL". ]&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Recommend consolidating the script in the execution sequence of DDL first followed by DML&lt;/strong&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Recommend using some GUI tools such as TOAD, SQL Developer etc to minimize the syntax errors.&lt;/strong&gt; &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;At minimum, everyone should do the following:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Check if missing "schema" prefix for table, index names etc.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Check if missing ";" in SQL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Check if missing "/" as the end the PL/SQL begin/end block&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Check if comma used properly in the table column list for example&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Check if upper or lower cases are used consistently&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Recommend including the back out method (CTAS) for DML script&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Recommend formatting and aligning SQL statements properly whenever possible for improving readability&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Add "show error;" at the end of PL/SQL procedure, function, packages units.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Avoid using ampersand character ‘&amp;amp;’ within any comment lines in the SQL scripts&lt;/span&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Avoid using space in the script file name.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Avoid adding storage clause in the table or index creation statement&lt;/span&gt;&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Note: defer to primary DBA to make such a decision if defaults are not desirable &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Avoid using more than 30 characters for table name or column name.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: black;"&gt;Avoid using system-generated constraint names.&lt;/span&gt;&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;For example the following method to add a primary key constraint is not acceptable:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;alter table myschema.t modify (id primary key);&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Recommend using the following methods to create primary key&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1) Within CREATE TABLE statement&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CREATE TABLE t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( id number,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val varchar2(40),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; constraint t_pk primary key (id) using index tablespace tablespace_name&lt;tablespace_name&gt;&lt;tablespace_name&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) tablespace&amp;nbsp; tablespace_name&lt;tablespace_name&gt;&lt;tablespace_name&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2) Through ALTER TABLE statement&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CREATE TABLE t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( id number,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val varchar2(40)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) tablespace tablespace_name&amp;nbsp;&lt;tablespace_name&gt;&lt;tablespace_name&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALTER TABLE t &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add constraint t_pk primary key(id) using index tablespace tablespace_name&lt;tablespace_name&gt;&lt;tablespace_name&gt;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-5791768955072759056?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/5791768955072759056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=5791768955072759056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5791768955072759056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5791768955072759056'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/03/best-practice-and-recommendations-for.html' title='Best practices and recommendations for preparing  SQL Scripts'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-921950008540496368</id><published>2010-01-27T18:52:00.001-05:00</published><updated>2010-02-04T16:38:51.580-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='recovery'/><title type='text'>Complete recovery after lost of all control files and data files.</title><content type='html'>Assuming all of the control files and one or more data files are lost during media failure, but the online redo logs are intact, can we do a complete recovery? In a previous &lt;a href="http://oracle-study-notes.blogspot.com/2010/01/netapp-snapshot-backup-and-recovery-for.html"&gt;post&lt;/a&gt;, I have demonstrated that it is possible when I have backup control files though I have to open database by resetlogs. In this post, I will demonstrate in this case we can do complete recovery without resetlogs by re-creating the control files.&lt;br /&gt;&lt;br /&gt;Note: the scripts used see previous post.&lt;br /&gt;&lt;br /&gt;Steps&lt;br /&gt;&lt;br /&gt;1. perform hot backup&lt;br /&gt;&lt;br /&gt;#&amp;gt; hot_backup.sh &lt;br /&gt;&lt;br /&gt;2. Create a table with one row and switch logfile&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; drop table system.t;&lt;br /&gt;SQL&amp;gt; create table system.t as select * from all_tables where rownum &amp;lt;=1; SQL&amp;gt; alter system switch logfile;&lt;br /&gt;&lt;br /&gt;3. Insert the second row and switch logfile&lt;br /&gt;SQL&amp;gt; insert into system.t select * from all_tables where rownum &amp;lt;=1; SQL&amp;gt; commit;&lt;br /&gt;SQL&amp;gt; alter system switch logfile;&lt;br /&gt;&lt;br /&gt;4. Insert the third row and switch logfile&lt;br /&gt;5. Insert the forth row WITHOUT switch logfile&lt;br /&gt;&lt;br /&gt;At this point, we should see total 4 rows in the table t:&lt;br /&gt;&lt;br /&gt;sys@DBWRKEV1&amp;gt; select count(*) from system.t ;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;4&lt;br /&gt;&lt;br /&gt;6. Delete all data files to simulate media failure, shutdown instance&lt;br /&gt;&lt;br /&gt;rm /db1/u01/oradata/dbwrkev1/system01.dbf &lt;br /&gt;rm /db1/u04/oradata/dbwrkev1/undotbs01.dbf &lt;br /&gt;rm /db1/u02/oradata/dbwrkev1/sysaux01.dbf &lt;br /&gt;rm /db1/u02/oradata/dbwrkev1/users01.dbf &lt;br /&gt;&lt;br /&gt;7. Restore data files&lt;br /&gt;&lt;br /&gt;#&amp;gt; restore_data.sh&lt;br /&gt;&lt;br /&gt;8. Re-create control file&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;idle&amp;gt; conn / as sysdba&lt;br /&gt;Connected to an idle instance.&lt;br /&gt;idle&amp;gt; startup nomount;&lt;br /&gt;ORACLE instance started.&lt;br /&gt; &lt;br /&gt;Total System Global Area  473956352 bytes&lt;br /&gt;Fixed Size                  1979520 bytes&lt;br /&gt;Variable Size             314575744 bytes&lt;br /&gt;Database Buffers          150994944 bytes&lt;br /&gt;Redo Buffers                6406144 bytes&lt;br /&gt;idle&amp;gt; @ctl&lt;br /&gt; &lt;br /&gt;Control file created.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Below is the content of ctl.sql &lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE CONTROLFILE REUSE DATABASE "DBWRKEV1" NORESETLOGS FORCE LOGGING ARCHIVELOG&lt;br /&gt;    MAXLOGFILES 16&lt;br /&gt;    MAXLOGMEMBERS 3&lt;br /&gt;    MAXDATAFILES 100&lt;br /&gt;    MAXINSTANCES 8&lt;br /&gt;    MAXLOGHISTORY 292&lt;br /&gt;LOGFILE&lt;br /&gt;  GROUP 1 (&lt;br /&gt;    '/db1/u05/archive/dbwrkev1/redo01a.log',&lt;br /&gt;    '/db1/u06/archive/dbwrkev1/redo01b.log'&lt;br /&gt;  ) SIZE 50M,&lt;br /&gt;  GROUP 2 (&lt;br /&gt;    '/db1/u05/archive/dbwrkev1/redo02a.log',&lt;br /&gt;    '/db1/u06/archive/dbwrkev1/redo02b.log'&lt;br /&gt;  ) SIZE 50M,&lt;br /&gt;  GROUP 3 (&lt;br /&gt;    '/db1/u05/archive/dbwrkev1/redo03a.log',&lt;br /&gt;    '/db1/u06/archive/dbwrkev1/redo03b.log'&lt;br /&gt;  ) SIZE 50M&lt;br /&gt;-- STANDBY LOGFILE&lt;br /&gt;DATAFILE&lt;br /&gt;  '/db1/u01/oradata/dbwrkev1/system01.dbf',&lt;br /&gt;  '/db1/u04/oradata/dbwrkev1/undotbs01.dbf',&lt;br /&gt;  '/db1/u02/oradata/dbwrkev1/sysaux01.dbf',&lt;br /&gt;  '/db1/u02/oradata/dbwrkev1/users01.dbf'&lt;br /&gt;CHARACTER SET WE8ISO8859P1&lt;br /&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then I did:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;idle&amp;gt; recover database;&lt;br /&gt;ORA-00279: change 10467469165231 generated at 01/27/2010 13:36:56 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_7_709302414.arc&lt;br /&gt;ORA-00280: change 10467469165231 for thread 1 is in sequence #7&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469165563 generated at 01/27/2010 13:44:35 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_8_709302414.arc&lt;br /&gt;ORA-00280: change 10467469165563 for thread 1 is in sequence #8&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_7_709302414.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;Log applied.&lt;br /&gt;Media recovery complete.&lt;br /&gt;idle&amp;gt; alter database open;&lt;br /&gt; &lt;br /&gt;Database altered.&lt;br /&gt; &lt;br /&gt;idle&amp;gt; select count(*) from system.t;&lt;br /&gt; &lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         4&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;Updated Feb 3, 2010 - It seems RMAN recovery can automatically apply changes in the online redo logs. See: &lt;/span&gt;&lt;/em&gt;&lt;a href="http://oracle-study-notes.blogspot.com/2007/07/exercise-using-control-file-autobackup.html"&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;http://oracle-study-notes.blogspot.com/2007/07/exercise-using-control-file-autobackup.html&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-921950008540496368?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/921950008540496368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=921950008540496368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/921950008540496368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/921950008540496368'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/01/complete-recovery-after-lost-of-all.html' title='Complete recovery after lost of all control files and data files.'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-5862380398574766319</id><published>2010-01-26T17:41:00.004-05:00</published><updated>2010-01-27T21:36:07.700-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='recovery'/><title type='text'>NetApp Snapshot backup and recovery for Oracle databases</title><content type='html'>In my current working environment, we use &lt;a href="http://www.netapp.com/us/solutions/applications/oracle/oracle-backup-recovery.html"&gt;NetApp Snapshot technology&lt;/a&gt; to backup some of&amp;nbsp; our Oracle databases. I have recently participated in a Snapshot backup and recovery test for three production&amp;nbsp;databases that were migrated to new servers. In the tests, the Storage Admin team performed Snapshot backup and restore, the Unix Admin team performed diskgroup deport and import&amp;nbsp;operations, and we, DBAs, were responsible for the database&amp;nbsp;&amp;nbsp;recovery. &lt;br /&gt;&lt;br /&gt;The databases have file layout in such a way that all of&amp;nbsp; data files and control files is in the volumn /db1,&amp;nbsp; online redo log files are in the volumn /db1redo, and archived logs are saved in volumn&amp;nbsp; /db1arch. The Snapshot backups are performed on&amp;nbsp;all three&amp;nbsp;volumns mentioned. We tested two recovery scenarios:&lt;br /&gt;&lt;br /&gt;1. Restore /db1 and /db1redo&lt;br /&gt;2. Restore /db1 only&lt;br /&gt;&lt;br /&gt;I think if you are an experienced DBA, you will immediately question the practise of backup and restore of online redo logs. You are right. I had doubts at the time. Today, I have done simulations of these two scenarios in a test envrinment. I have been more clear that we should not do that at all.&lt;br /&gt;&lt;br /&gt;Below I will describe the test cases in more details, which are the simulations of what we did in the Snapshot backup and recoery test in the&amp;nbsp;production servers a few days ago.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Case 1 - Restore data files, control files and redo log files (e.g. /db1 and /db1redo)&lt;/strong&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;1. Perform hotbackup &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;gt; hot_backp.sh &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note: script see Appendix&lt;br /&gt;&lt;br /&gt;2. Create a table with one row and switch logfile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; drop table system.t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; create table system.t as select * from all_tables where rownum &amp;lt;=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; alter system switch logfile;&lt;br /&gt;&lt;br /&gt;3. Insert the second row and switch logfile&lt;br /&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; insert into system.t select * from all_tables where rownum &amp;lt;=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; commit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SQL&amp;gt; alter system switch logfile;&lt;br /&gt;&lt;br /&gt;4. Insert the third row and switch logfile&lt;br /&gt;&lt;br /&gt;5. Insert the forth row WITHOUT switch logfile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; At this point, we should see total 4 rows in the table t:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys@DBWRKEV1&amp;gt; select count(*) from system.t ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COUNT(*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;br /&gt;&lt;br /&gt;6. Delete all data files to simulate media failure, shutdown instance&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm /db1/u01/oradata/dbwrkev1/system01.dbf &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm /db1/u04/oradata/dbwrkev1/undotbs01.dbf &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm /db1/u02/oradata/dbwrkev1/sysaux01.dbf &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm /db1/u02/oradata/dbwrkev1/users01.dbf &lt;br /&gt;&lt;br /&gt;7. Restore data files, control files and redo log file&lt;br /&gt;&amp;nbsp;&amp;nbsp; #&amp;gt; restore_data.sh&lt;br /&gt;&amp;nbsp;&amp;nbsp; #&amp;gt; restore_ctl.sh &lt;br /&gt;&amp;nbsp;&amp;nbsp; #&amp;gt; restore_redo.sh&lt;br /&gt;&lt;br /&gt;8. Recover database&lt;br /&gt;&amp;nbsp;&amp;nbsp; After mount the database, I did: &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; idle&amp;gt; recover database;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Media recovery complete.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; idle&amp;gt; alter database open;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database altered.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; So here we observed the same in the real test a few days ago,&amp;nbsp;we thought we did a complete recovery, but really? &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idle&amp;gt; select count(*) from system.t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select count(*) from system.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR at line 1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORA-00942: table or view does not exist&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; We can see the table t does not exist at all. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Case 2 Restore data file and control files&lt;/strong&gt; &lt;strong&gt;(e.g. /db1)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Note: due to our data files and control files are both in /db1, with Snapshot restore we can not restore only one of them. This is one of the disavantages of NetApp Snapshot as I can see compared to&amp;nbsp;RMAN backup and restore.&lt;br /&gt;&lt;br /&gt;1-6. same as in&amp;nbsp;case 1&lt;br /&gt;&lt;br /&gt;7. Restore data files and control files&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;gt; restore_data.sh&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;gt; restore_ctl.sh &lt;br /&gt;&lt;br /&gt;8. Recover database&lt;br /&gt;&amp;nbsp;&amp;nbsp; After mount the database, I did:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;idle&amp;gt; recover database until cancel using backup controlfile;&lt;br /&gt;ORA-00279: change 10467469061882 generated at 01/26/2010 10:45:48 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_27_708088679.arc&lt;br /&gt;ORA-00280: change 10467469061882 for thread 1 is in sequence #27&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469062192 generated at 01/26/2010 10:51:40 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_28_708088679.arc&lt;br /&gt;ORA-00280: change 10467469062192 for thread 1 is in sequence #28&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_27_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064362 generated at 01/26/2010 11:43:01 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_29_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064362 for thread 1 is in sequence #29&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_28_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064390 generated at 01/26/2010 11:43:54 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_30_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064390 for thread 1 is in sequence #30&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_29_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064400 generated at 01/26/2010 11:44:17 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_31_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064400 for thread 1 is in sequence #31&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_30_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00308: cannot open archived log '/db1/archive/dbwrkev1/dbwrkev1_1_31_708088679.arc'&lt;br /&gt;ORA-27037: unable to obtain file status&lt;br /&gt;SVR4 Error: 2: No such file or directory&lt;br /&gt;Additional information: 3&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;idle&amp;gt; recover database until cancel using backup controlfile;&lt;br /&gt;ORA-00279: change 10467469064400 generated at 01/26/2010 11:44:17 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_31_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064400 for thread 1 is in sequence #31&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt;cancel&lt;br /&gt;Media recovery cancelled.&lt;br /&gt;idle&amp;gt; alter database open resetlogs;&lt;br /&gt; &lt;br /&gt;Database altered.&lt;br /&gt; &lt;br /&gt;idle&amp;gt; select count(*) from system.t;&lt;br /&gt; &lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;        3&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, obviously we lost the changes recorded in the online redo log. This is an imcomplete recvoery, corresponding to lost all control files and (some of) data files, but online redo logs are intact. However, if we know the current online redo log at the time of media failure ( We can find it out in the alert log file), we probably can recover more.&lt;br /&gt;&lt;br /&gt;For example, in my test, I knew the current online redo logs are those of group 2. So I did:&lt;br /&gt;&lt;br /&gt;#&amp;gt; cp redo02a.log /db1/archive/dbwrkev1/dbwrkev1_1_31_708088679.arc&lt;br /&gt;&lt;br /&gt;Then I repeated the steps 6,7,8 as in the test case 2, let's see what we got: &lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;idle&amp;gt; recover database until cancel using backup controlfile;&lt;br /&gt;ORA-00279: change 10467469061882 generated at 01/26/2010 10:45:48 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_27_708088679.arc&lt;br /&gt;ORA-00280: change 10467469061882 for thread 1 is in sequence #27&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469062192 generated at 01/26/2010 10:51:40 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_28_708088679.arc&lt;br /&gt;ORA-00280: change 10467469062192 for thread 1 is in sequence #28&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_27_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064362 generated at 01/26/2010 11:43:01 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_29_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064362 for thread 1 is in sequence #29&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_28_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064390 generated at 01/26/2010 11:43:54 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_30_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064390 for thread 1 is in sequence #30&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_29_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;ORA-00279: change 10467469064400 generated at 01/26/2010 11:44:17 needed for thread 1&lt;br /&gt;ORA-00289: suggestion : /db1/archive/dbwrkev1/dbwrkev1_1_31_708088679.arc&lt;br /&gt;ORA-00280: change 10467469064400 for thread 1 is in sequence #31&lt;br /&gt;ORA-00278: log file '/db1/archive/dbwrkev1/dbwrkev1_1_30_708088679.arc' no longer needed for this recovery&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Specify log: {&amp;lt;RET&amp;gt;=suggested | filename | AUTO | CANCEL}&lt;br /&gt; &lt;br /&gt;Log applied.&lt;br /&gt;Media recovery complete.&lt;br /&gt;idle&amp;gt; alter database open resetlogs;&lt;br /&gt; &lt;br /&gt;Database altered.&lt;br /&gt; &lt;br /&gt;idle&amp;gt; select count(*) from system.t;&lt;br /&gt; &lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         4&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;Bingo! It seemed I did a complete recovery!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;[Jan 27,2010 updated: this &lt;a href="http://oracle-study-notes.blogspot.com/2010/01/complete-recovery-after-lost-of-all.html"&gt;post&lt;/a&gt; shows another way to do a complete revcovery in this situation]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Another thing I want to point out is that if we only lost data files whereas the control files and online redo logs are intact, we can do a complete recovery easily as long as we have archived logs. However, in our envionment when we restore snapshot backup, we also overwrite the current control files. So we must be cautious and it is thus advisable to copy the intact control files to some other location. It is probaly a good idea that we should not place all the control files in the same volumn as data files. &lt;br /&gt;&lt;br /&gt;BTW, the information in the following two links gave me some ideas about this topic.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://freekdhooge.wordpress.com/2007/12/03/disaster-recovery-troubles/"&gt;http://freekdhooge.wordpress.com/2007/12/03/disaster-recovery-troubles/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B10501_01/server.920/a96519/strategy.htm#1004884"&gt;http://download.oracle.com/docs/cd/B10501_01/server.920/a96519/strategy.htm#1004884&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Appendix - Scripts used:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;#!/bin/ksh&lt;br /&gt;# script:  hot_backup.sh&lt;br /&gt;#&lt;br /&gt;sqlplus "/ as sysdba" &amp;lt;&amp;lt;EOF&lt;br /&gt;alter tablespace UNDOTBS1 begin backup;&lt;br /&gt;alter tablespace USERS    begin backup;&lt;br /&gt;alter tablespace SYSTEM   begin backup;&lt;br /&gt;alter tablespace SYSAUX   begin backup;&lt;br /&gt;EOF&lt;br /&gt;echo " -- tablespace begin backup mode "&lt;br /&gt;&lt;br /&gt;cp /db1/u01/oradata/dbwrkev1/system01.dbf    /db1/backup&lt;br /&gt;cp /db1/u04/oradata/dbwrkev1/undotbs01.dbf   /db1/backup&lt;br /&gt;cp /db1/u02/oradata/dbwrkev1/sysaux01.dbf    /db1/backup&lt;br /&gt;cp /db1/u02/oradata/dbwrkev1/users01.dbf     /db1/backup&lt;br /&gt;cp /db1/u05/archive/dbwrkev1/redo03a.log     /db1/backup&lt;br /&gt;cp /db1/u06/archive/dbwrkev1/redo03b.log     /db1/backup&lt;br /&gt;cp /db1/u05/archive/dbwrkev1/redo02a.log     /db1/backup&lt;br /&gt;cp /db1/u06/archive/dbwrkev1/redo02b.log     /db1/backup&lt;br /&gt;cp /db1/u05/archive/dbwrkev1/redo01a.log     /db1/backup&lt;br /&gt;cp /db1/u06/archive/dbwrkev1/redo01b.log     /db1/backup&lt;br /&gt;cp /db1/u01/oradata/dbwrkev1/control01.ctl   /db1/backup &lt;br /&gt;cp /db1/u02/oradata/dbwrkev1/control02.ctl   /db1/backup &lt;br /&gt;cp /db1/u03/oradata/dbwrkev1/control03.ctl   /db1/backup&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;echo " -- data file, control file and redo log backup done "&lt;br /&gt;&lt;br /&gt;sqlplus "/ as sysdba" &amp;lt;&amp;lt;EOF&lt;br /&gt;alter tablespace UNDOTBS1 end backup;&lt;br /&gt;alter tablespace USERS    end backup;&lt;br /&gt;alter tablespace SYSTEM   end backup;&lt;br /&gt;alter tablespace SYSAUX   end backup;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;echo " -- tablespace end backup mode "&lt;br /&gt;&lt;br /&gt;sqlplus "/ as sysdba" &amp;lt;&amp;lt;EOF&lt;br /&gt;alter system archive log current;&lt;br /&gt;alter database backup controlfile to '/tmp/backupctrl.ctl' reuse;&lt;br /&gt;EOF&lt;br /&gt;echo " -- archive current redo log and backup controlfile done"&lt;br /&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;# script: restore_data.sh&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;cp /db1/backup/system01.dbf  /db1/u01/oradata/dbwrkev1 &lt;br /&gt;cp /db1/backup/undotbs01.dbf /db1/u04/oradata/dbwrkev1 &lt;br /&gt;cp /db1/backup/sysaux01.dbf  /db1/u02/oradata/dbwrkev1 &lt;br /&gt;cp /db1/backup/users01.dbf   /db1/u02/oradata/dbwrkev1 &lt;br /&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;#   restore_ctl.sh &lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;cp /db1/backup/control01.ctl /db1/u01/oradata/dbwrkev1   &lt;br /&gt;cp /db1/backup/control02.ctl /db1/u02/oradata/dbwrkev1   &lt;br /&gt;cp /db1/backup/control03.ctl /db1/u03/oradata/dbwrkev1   &lt;br /&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;# script: restore_redo.sh&lt;br /&gt;#&lt;br /&gt;cp /db1/backup/redo03a.log   /db1/u05/archive/dbwrkev1    &lt;br /&gt;cp /db1/backup/redo03b.log   /db1/u06/archive/dbwrkev1    &lt;br /&gt;cp /db1/backup/redo02a.log   /db1/u05/archive/dbwrkev1    &lt;br /&gt;cp /db1/backup/redo02b.log   /db1/u06/archive/dbwrkev1     &lt;br /&gt;cp /db1/backup/redo01a.log   /db1/u05/archive/dbwrkev1     &lt;br /&gt;cp /db1/backup/redo01b.log   /db1/u06/archive/dbwrkev1  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-5862380398574766319?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/5862380398574766319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=5862380398574766319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5862380398574766319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/5862380398574766319'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/01/netapp-snapshot-backup-and-recovery-for.html' title='NetApp Snapshot backup and recovery for Oracle databases'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2070128875984885018</id><published>2010-01-13T14:08:00.001-05:00</published><updated>2010-01-13T14:09:21.460-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='standby'/><category scheme='http://www.blogger.com/atom/ns#' term='clone'/><category scheme='http://www.blogger.com/atom/ns#' term='archived log'/><title type='text'>Clone an online database - applying standby feature</title><content type='html'>In a previous &lt;a href="http://oracle-study-notes.blogspot.com/2008/06/clone-prodution-database-for-disaster.html"&gt;post&lt;/a&gt;, I described how to clone an online database by transferring data files through network. Since the cloned database should not be opened immediately after the copy, instead,&amp;nbsp;it needed to be opened one week later. This was to minimize the maintenance window needed to configure the cloned database. In this scenario, we need to ship the archived logs from source to target, and also apply them in the target during the whole week in order to keep the source and target database in sync. For that purpose, I wrote a shell script and put it in the cron to automatically transfer the archived logs and then manually applying the logs. &lt;br /&gt;&lt;br /&gt;Inspired by a fellow DBA recently, I have found that we can take advantage of Oracle standby&amp;nbsp;technology to achieve the log transportation and apply purpose automatically. I thus did a test on a testing 10g database&amp;nbsp;to demonstrate the concept, which consisted of the following steps:&lt;br /&gt;&lt;br /&gt;1. Copied selected tablespaces from source to target, using the same method as in the previous post &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tablespaces: SYSTEM, SYSAUX, USERS and UNDOTBS1 &lt;br /&gt;&lt;br /&gt;2. Created standby control file in source and copied them to the target.e.g&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. At source, alter database create standby controlfile as '/tmp/stby.ctl';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. scp from source to target server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c. At target, issue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cp /tmp/stby.ctl /db1/u01/oradata/orasid1/control01.ctl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cp /tmp/stby.ctl /db1/u02/oradata/orasid1/control02.ctl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cp /tmp/stby.ctl /db1/u03/oradata/orasid1/control03.ctl&lt;br /&gt;&lt;br /&gt;3. Added in the init.ora a parameter: standby_file_management = manual&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note: this is to take into account that data file directory may be different between source and targer server.&lt;br /&gt;&lt;br /&gt;4. Mount the target database with the standby controlfile.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I then did Offline drop all those data files that are not copied&lt;br /&gt;&amp;nbsp;&amp;nbsp; e.g.&amp;nbsp; alter database datafile 'filename' offline drop;&lt;br /&gt;&lt;br /&gt;5. In mount mode, issue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; RECOVER STANDBY DATABASE UNTIL CANCEL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note: this is to apply all available archived logs upto the current time manually.&lt;br /&gt;&lt;br /&gt;6. Started the managed recovery of the standby database at target server&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;&lt;br /&gt;&lt;br /&gt;7. In the source db issue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL&amp;gt; ALTER SYSTEM SET log_archive_dest_2='SERVICE=ORASID1_STBY LGWR ASYNC';&lt;br /&gt;&lt;br /&gt;8. Verify archived log are shiped and applied automatically.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for examples:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;&lt;br /&gt;&lt;br /&gt;9. Opened the standby database as a regular operational database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. At source issue: ALTER SYSTEM SET log_archive_dest_2=''&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. At target, cancel Redo Apply:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c. At target issue: alter database activate physical standby database&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d. ALTER DATABASE OPEN;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e. Drop those tablespace not copied and needed in the target server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-2070128875984885018?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/2070128875984885018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=2070128875984885018' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2070128875984885018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/2070128875984885018'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2010/01/clone-online-database-applying-standby.html' title='Clone an online database - applying standby feature'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1912386847750583717</id><published>2009-12-17T17:23:00.002-05:00</published><updated>2009-12-26T22:23:01.785-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle internal'/><title type='text'>Some hige-level concepts about transaction processing</title><content type='html'>I once read in a forum someone proposed an interview question for Oracle DBA. The question was like 'What kind of things Oracle do when issuing a 'COMMIT' ?'. I was very vague at that time. Now I am feeling better. I went through a chapter called "Transaction Processing" in an old Oracle University guide - Oracle 9i database: Space and Transaction Management (Student Guide). Here are some high-level concepts about transaction process, including something Oracle will do when&amp;nbsp;it commits a transaction.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sytem commit number (SCN)&lt;/strong&gt;&lt;br /&gt;- identifies the committed version of a database&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Change vector&lt;/strong&gt;&lt;br /&gt;- contains the information necessary to change one block from one consistent state to another consistent state&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Begin transaction&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Undo segment binding&lt;/li&gt;&lt;li&gt;Slot allocation in the transaction table&lt;/li&gt;&lt;li&gt;Undo block allocation&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Transaction Commit&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Finds an SCN value&lt;/li&gt;&lt;li&gt;&amp;nbsp;Updates the transaction table&lt;/li&gt;&lt;li&gt;&amp;nbsp;Puts the current undo block into the free block pool (under some condition)&lt;/li&gt;&lt;li&gt;&amp;nbsp;Creates a commit record in the redo log buffer&lt;/li&gt;&lt;li&gt;&amp;nbsp;Flushes the redo log buffer to disk (for durability)&lt;/li&gt;&lt;li&gt;&amp;nbsp;Releases locks held on rows and tables&lt;/li&gt;&lt;/ol&gt;&lt;span style="color: blue;"&gt;&lt;em&gt;[Dec 26,2009 Ed.]&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;Tom Kyte wrote a section "What Does a COMMIT Do?" in his book "Expert Oracle Database Architecture" (pp 292-98). There are two points I would like to add based on his&amp;nbsp;book. &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;&lt;strong&gt;1.&lt;/strong&gt; When Oracle issues a COMMIT, LGWR writes all of the &lt;strong&gt;remaining&lt;/strong&gt; redo log entries to disk.&amp;nbsp; Considering commit after inserting one row into a table&amp;nbsp;compared to&amp;nbsp;after inserting 1M rows, the time for commit in these two cases is almost same, why? Because redo info is being written to the disk during the inserting process batch by batch. At COMMIT, the remaining redo entries&amp;nbsp; be flushed is&amp;nbsp;thus small. The cost of COMMIT is not a function of the transaction size.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;&lt;strong&gt;2.&lt;/strong&gt; When COMMIT, some of the blocks the transaction modified will be visited and "cleaned out" in a fast mode if they are still in the buffer cache. Block cleanout refers to the cleaning out the transaction information stored in the database block header.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modifying a data block&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Find an interested transaction list (ITL) available in the block&lt;/li&gt;&lt;li&gt;&amp;nbsp;Lock the row you are modifying&lt;/li&gt;&lt;li&gt;&amp;nbsp;Generate the redo part of data describing the changes to the data block&lt;/li&gt;&lt;li&gt;&amp;nbsp;Generate the undo part of data describing&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;The inverse operation of data block user changes&lt;/li&gt;&lt;li&gt;&amp;nbsp;The undo block changes in the undo segment&lt;/li&gt;&lt;li&gt;&amp;nbsp;The undo segment block changes (if necessary)&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.&amp;nbsp;&amp;nbsp; Create the redo record and apply the changes to the blocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1912386847750583717?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1912386847750583717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1912386847750583717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1912386847750583717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1912386847750583717'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/12/some-hige-level-concepts-about.html' title='Some hige-level concepts about transaction processing'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-9160517854375757542</id><published>2009-11-25T12:28:00.003-05:00</published><updated>2010-02-28T07:48:17.009-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Don't use PL/SQL to Do the Job of SQL</title><content type='html'>Several days ago, I was asked to review scripts from development team for an application consolidation effort. There is a particular script that uses PL/SQL, which run more than 3 hours. After I reviewed it, I believed they can be written by SQL statment.&lt;br /&gt;&lt;br /&gt;For example, for the following PL/SQL block, it depends on the EXCEPTION condition to update a table. Though I am not an experienced PL/SQL programmer, I am suspicous this could be considered good practice in PL/SQL. &lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- PL/SQL block&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;   FOR bas_rec IN bas_cur LOOP&lt;br /&gt;      v_my_account_id:=bas_rec.my_account_id;&lt;br /&gt;&lt;br /&gt;      BEGIN &lt;br /&gt;  SELECT DISTINCT ms.state_id INTO v_state_id&lt;br /&gt;    FROM&lt;br /&gt;      my_sch.tab_ms ms&lt;br /&gt;    WHERE&lt;br /&gt;      ms.account_id = v_my_account_id AND&lt;br /&gt;      ms.state_id IS NOT NULL AND&lt;br /&gt;      ms.svc_node_type_id  NOT IN (203,204,206,208,218,402) AND&lt;br /&gt;      ms.is_pq ='N' AND&lt;br /&gt;      ms.svc_status_id = 2;&lt;br /&gt;     &lt;br /&gt;  EXCEPTION&lt;br /&gt;    WHEN TOO_MANY_ROWS THEN&lt;br /&gt;      UPDATE my_sch.conv_2 bas&lt;br /&gt;        SET bas.to_be_converted_status=v_exclusion_flag, &lt;br /&gt;     bas.exclusion_reason = v_exclusion_reason_multi, &lt;br /&gt;     bas.is_processed = v_processed_flag&lt;br /&gt;        WHERE bas.my_account_id = v_my_account_id;&lt;br /&gt;        v_is_updated:='Y';&lt;br /&gt;      COMMIT;&lt;br /&gt;    WHEN NO_DATA_FOUND THEN NULL; &lt;br /&gt;    WHEN OTHERS THEN &lt;br /&gt;    dbms_output.put_line('Multi State block OTHERS - v_ban:'||sqlerrm ); &lt;br /&gt;  COMMIT;&lt;br /&gt;      END; &lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Anyway, I know that " Don't use PL/SQL to Do the Job of SQL". So I translated the above PL/SQL to the following SQL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-- SQL code &lt;br /&gt;&lt;br /&gt;UPDATE my_sch.conv_2 bas&lt;br /&gt;SET bas.to_be_converted_status='N', &lt;br /&gt;    bas.exclusion_reason = 'SERVICES IN MULTIPLE STATES', &lt;br /&gt;    bas.is_processed ='Y' &lt;br /&gt;WHERE bas.is_processed is null&lt;br /&gt;  AND 1 &amp;lt; ( select count( DISTINCT ms.state_id)&lt;br /&gt;      from my_ord.tab_ms ms&lt;br /&gt;       WHERE ms.account_id =  bas.my_account_id&lt;br /&gt;  AND ms.state_id IS NOT NULL &lt;br /&gt;  AND ms.svc_node_type_id  NOT IN (203,204,206,208,218,402) &lt;br /&gt;  AND ms.is_pq ='N' &lt;br /&gt;  AND ms.svc_status_id = 2 )&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I also re-wrote the other part of the script with SQL. In a small scale test, original PL/SQL took 5 min. My SQL code took about 1.5 min. Sadly, developers are more comfortable with their PL/SQL code and are unwilling to do a thoroug test and verification about SQL method. So I will still use their PL/SQL code in the production implementation - just running 5 threads of them to speed up instead of 1 thread previously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-9160517854375757542?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/9160517854375757542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=9160517854375757542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/9160517854375757542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/9160517854375757542'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/11/dont-use-plsql-to-do-job-of-sql.html' title='Don&apos;t use PL/SQL to Do the Job of SQL'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-6798335790952169708</id><published>2009-11-23T16:12:00.004-05:00</published><updated>2010-04-30T13:36:17.145-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='constraint'/><category scheme='http://www.blogger.com/atom/ns#' term='DBMS_METADATA'/><title type='text'>DDL for CONSTRAINTS and DEFAULTS</title><content type='html'>When using a CTAS to create a table from an existing table, the new table won't have all the constraints as the exsiting table except that the NOT NULL constraints are preserved. Below is an example showing a CHECK constraint is not presented in a table created from CTAS:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;TESTDB&amp;gt; create table t (id number not null, val number check (val &amp;gt; 5));&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; insert into t values(1,7);&lt;br /&gt; &lt;br /&gt;1 row created.&lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; commit;&lt;br /&gt; &lt;br /&gt;Commit complete.&lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; insert into t values (2,4);&lt;br /&gt;insert into t values (2,4)&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-02290: check constraint (OPS$MYUSRID.SYS_C001214102) violated&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; desc t;&lt;br /&gt; Name                  Null?    Type     &lt;br /&gt; --------------------- -------- --------&lt;br /&gt; ID                    NOT NULL NUMBER&lt;br /&gt; VAL                            NUMBER&lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; create table t1 as select * from t;&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; desc t1;&lt;br /&gt; Name                 Null?    Type&lt;br /&gt; -------------------- -------- ----------&lt;br /&gt; ID                   NOT NULL NUMBER&lt;br /&gt; VAL                           NUMBER&lt;br /&gt; &lt;br /&gt;TESTDB&amp;gt; insert into t1 values (1, 4);&lt;br /&gt; &lt;br /&gt;1 row created.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;TESTDB&amp;gt; ;&lt;br /&gt;  1* select owner, constraint_name, constraint_type, table_name, search_condition from user_constraints&lt;br /&gt;TESTDB&amp;gt; /&lt;br /&gt; &lt;br /&gt;OWNER        CONSTRAINT_NAME                C TABLE_NAME SEARCH_CONDITION&lt;br /&gt;------------ ------------------------------ - ---------- ------------------------------&lt;br /&gt;OPS$MYUSRID  SYS_C001214102                 C T          val &amp;gt; 5&lt;br /&gt;OPS$MYUSRID  SYS_C001214101                 C T          "ID" IS NOT NULL&lt;br /&gt;OPS$MYUSRID  SYS_C001214103                 C T1         "ID" IS NOT NULL&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To create the constraints in the new table, I thus faced a task to extract all the DDL about constraints from the existing table. The approach I adopted after several tests was as follows.&lt;br /&gt;&lt;br /&gt;1. First, I created a table my_constraints to have CLOB datatype for search_conditon column since we can not use LIKE operater on a LONG type column.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create table my_constraints ( &lt;br /&gt;    owner varchar2(30)&lt;br /&gt;   , constraint_name varchar2(30)&lt;br /&gt;   , constraint_type varchar2(1)&lt;br /&gt;   , table_name varchar2(30)&lt;br /&gt;   , search_condition clob&lt;br /&gt;   ) ;&lt;br /&gt;&lt;br /&gt;   insert into my_constraints&lt;br /&gt;   select owner, constraint_name, constraint_type, table_name, to_lob(search_condition)&lt;br /&gt;     from dba_constraints &lt;br /&gt;   where owner =&amp;amp;owner ;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. For PK, UK and check constraints ( excluding NOT NULL), I used the following command to extract the DDL:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT DBMS_METADATA.GET_DDL('CONSTRAINT', t.constraint_name , t.owner ) ddl_string&lt;br /&gt;  from my_constraints t&lt;br /&gt; where table_name = upper('&amp;amp;table_name')&lt;br /&gt;  and  owner=upper('&amp;amp;owner')&lt;br /&gt;and constraint_type in ('P', 'U','C')&lt;br /&gt;and ( search_condition is null&lt;br /&gt;      or ( search is not null and search_condition not like '%NOT NULL')&lt;br /&gt;    )&lt;br /&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. For FK constraints, I used the following command to extract the DDL&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT to_char(DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT', table_name, owner)) DDL&lt;br /&gt;  FROM (SELECT DISTINCT b.table_name, b.owner&lt;br /&gt;           from dba_constraints b&lt;br /&gt;           where b.constraint_type = 'R'&lt;br /&gt;           AND b.owner = upper('&amp;amp;owner')&lt;br /&gt;           AND b.table_name = upper('&amp;amp;table_name')) ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;CTAS also does not preserve DEFAULT values of columns. I used the following to obtain the 'ALTER TABLE' statement for DAFAULTS:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;BEGIN&lt;br /&gt;        FOR r IN (&lt;br /&gt;             select owner, table_name, column_name, data_type, data_default&lt;br /&gt;               from dba_tab_columns&lt;br /&gt;             where owner = upper('&amp;amp;owner')&lt;br /&gt;               and table_name = upper('&amp;amp;table_name')&lt;br /&gt;               and data_default is not null&lt;br /&gt;        )&lt;br /&gt;        LOOP&lt;br /&gt;                DBMS_OUTPUT.PUT_LINE&lt;br /&gt;                ( 'ALTER TABLE ' || r.owner || '.' || r.table_name  ||&lt;br /&gt;                 ' modify  ' ||r.column_name ||&lt;br /&gt;                 ' default ' || r.data_default || ';');&lt;br /&gt;        END LOOP;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The reason we need to use PL/SQL instead of SQL is that DATA_DEFAULT column is LONG type. We can not use '||' with LONG type column.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-6798335790952169708?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/6798335790952169708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=6798335790952169708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6798335790952169708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/6798335790952169708'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/11/ddl-for-constraints.html' title='DDL for CONSTRAINTS and DEFAULTS'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-1817060371409032084</id><published>2009-11-20T14:31:00.001-05:00</published><updated>2009-11-20T14:34:50.678-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tablespace'/><category scheme='http://www.blogger.com/atom/ns#' term='online redifinition'/><title type='text'>Move table to different tablespace through online redefinition</title><content type='html'>Some times ago, I tested the steps of moving two tables to different tablespace through online redefiniton. I developed the steps based on the &lt;a href="http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/tables.htm#19772"&gt;Oracle online documentation.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;The background is that we need to do an online copy of a production database with subset data to another data center. These two tables are critical and need to be copied over and would be used to build other tables. However, these two tables reside in a tablespace hosting many other tables. Thus to put them into a separate tablespace would make our copy job&amp;nbsp;much easier.&lt;br /&gt;&lt;br /&gt;Below describes the steps and commands involved for reference. TAB_MA and TAB_MS are under schema SCH_SO. The tablespace to which we want to move them is called SCH_SO_DATA_R. (Those are not real production table names)&lt;br /&gt;&lt;br /&gt;Step:&lt;br /&gt;~~~~~&lt;br /&gt;&lt;br /&gt;1. Verify that the table is a candidate for online redefinition&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;DBMS_REDEFINITION.CAN_REDEF_TABLE('sch_so','tab_ma',&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;dbms_redefinition.cons_use_pk);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;DBMS_REDEFINITION.CAN_REDEF_TABLE('sch_so','tab_ms',&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;dbms_redefinition.cons_use_pk);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="background-color: white; color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Create an interim tables &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;create table sch_so.tab_ma_int&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;tablespace sch_so_data_r&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;as&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;select * from sch_so.tab_ma&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;where 1=0;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;create table sch_so.tab_ms_int&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;tablespace sch_so_data_r&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;as&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;select * from sch_so.tab_ms&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;where 1=0;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Start the redefinition process. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;DBMS_REDEFINITION.START_REDEF_TABLE(&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;'sch_so', 'tab_ma','tab_ma_int',&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;)&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;DBMS_REDEFINITION.START_REDEF_TABLE(&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;'sch_so', 'tab_ms','tab_ms_int',&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;)&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note:&lt;br /&gt;After redefinition finished, checked the segment size of interim tables:&lt;br /&gt;&lt;br /&gt;1 select owner, segment_name, tablespace_name, bytes/1024/1024/1024 size_G from dba_segments&lt;br /&gt;2* where tablespace_name='SCH_SO_DATA_R'&lt;br /&gt;SQL&amp;gt; /&lt;br /&gt;&lt;br /&gt;OWNER SEGMENT_NAME TABLESPACE_NAME SIZE_G&lt;br /&gt;---------------- ----------------------- ----------------- ----------&lt;br /&gt;SCH_SO TAB_MA_INT SCH_SO_DATA_R 4.9375&lt;br /&gt;SCH_SO TAB_MS_INT SCH_SO_DATA_R 9.1875&lt;br /&gt;&lt;br /&gt;time: 20 min&lt;br /&gt;&lt;br /&gt;4. Create any triggers, indexes and constraints on the interim tables&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. Optionally, synchronize the interim table hr.int_admin_emp. &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;em&gt;BEGIN &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;em&gt;DBMS_REDEFINITION.SYNC_INTERIM_TABLE('sch_so', 'tab_ms', 'tab_ms_int');&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;em&gt;END;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;em&gt;/&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;6. Complete the redefinition. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;DBMS_REDEFINITION.FINISH_REDEF_TABLE('sch_so', 'tab_ms', 'tab_ms_int');&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;DBMS_REDEFINITION.FINISH_REDEF_TABLE('sch_so', 'tab_ma', 'tab_ma_int');&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;END;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: blue;"&gt;/&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Note: The table is locked in the exclusive mode only for a small window toward the end of this step. After this call the table is redefined such that it has all the attributes of the interim table.&lt;br /&gt;&lt;br /&gt;7. Drop the interim table.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-1817060371409032084?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/1817060371409032084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=1817060371409032084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1817060371409032084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/1817060371409032084'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/11/move-table-to-different-tablespace.html' title='Move table to different tablespace through online redefinition'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-455828197059268298</id><published>2009-11-09T09:19:00.016-05:00</published><updated>2009-11-11T10:35:26.606-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='session_cached_cursors'/><category scheme='http://www.blogger.com/atom/ns#' term='parse'/><title type='text'>session_cached_cursors and parse</title><content type='html'>The following &amp;nbsp;test case demonstrated the effects of session_cached_cursors on&amp;nbsp;whether and how the PL/SQL caches cursors.&amp;nbsp;I tested with either session_cached_cursors=0 or 20 and with a static SQL or an 'execute immediate' statement in a PL/SQL procedure,&amp;nbsp;in a 9.2.0.8 database and a 10.2.0.1 database, respectively.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace procedure  proc_p&lt;br /&gt;is&lt;br /&gt;obj_no number;&lt;br /&gt;begin&lt;br /&gt;for i in 1..100&lt;br /&gt;loop&lt;br /&gt;execute immediate 'select count(*)  from all_objects where object_id = :1 ' into obj_no using i;&lt;br /&gt;dbms_output.put_line('i='  i  ' count='  obj_no);&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;create or replace procedure  proc_p2&lt;br /&gt;is&lt;br /&gt;obj_no number;&lt;br /&gt;begin&lt;br /&gt;for i in 1..100&lt;br /&gt;loop&lt;br /&gt;select count(*) into obj_no from all_objects where object_id = i;&lt;br /&gt;dbms_output.put_line('i='  i  ' count='  obj_no);&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;-- alter session set session_cached_cursors=0;&lt;br /&gt;alter session set session_cached_cursors=20;&lt;br /&gt;&lt;br /&gt;exec proc_p;&lt;br /&gt;exec proc_p2;&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=false;&lt;br /&gt;exit;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I used TKPROF to analyse the trace files. Below is the summary:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;----------------------------------------------------------------------------&lt;br /&gt;version  session_cached_cursors    SQL          # of parse    # of execution&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;9.2.0.8      0                     exe immed    100            100&lt;br /&gt;9.2.0.8      0                     static       100            100&lt;br /&gt;9.2.0.8      20                    exe immed    100            100&lt;br /&gt;9.2.0.8      20                    static       1              100&lt;br /&gt;10.2.0.1     0                     exe immed    100            100&lt;br /&gt;10.2.0.1     0                     static       100            100&lt;br /&gt;10.2.0.1     20                    exe immed    1              100&lt;br /&gt;10.2.0.1     20                    static       1              100&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It can be seen that with session_cached_cursors=0, no matter in which version and with what kind of SQL, Oracle needs to at least soft parse each&amp;nbsp;SQL for each execution. So session_cached_cursors=0 effectively disable the ability of PL/SQL to cache cursors. With session_cached_cursors=20 (nozero essentially),in 9.2.0.8, for the static SQL it can be achieved "parase once, execute many times"; in 10.2.0.1, for both type of SQL, same effect of "parse once, execute many times" is observed. Whenever possible, we should use static SQL in PL/SQL code; if not, we should try to use 'execute immediate' with bind variables. It seems from 10g, PL/SQL engine can cache cursors from 'execute immediate' statement also.&lt;br /&gt;&lt;br /&gt;I continued to experiment about the session_cached_cursors and the number of SQL that is repeatedly executed. The test code looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace procedure  proc_p2&lt;br /&gt;is&lt;br /&gt;obj_no number;&lt;br /&gt;obj_name all_objects.object_name%type;&lt;br /&gt;begin&lt;br /&gt;for i in 1..100&lt;br /&gt;loop&lt;br /&gt;-- sql a&lt;br /&gt;select count(*) into obj_no from all_objects where object_id = i; &lt;br /&gt;-- sql b&lt;br /&gt;select max(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;-- sql c &lt;br /&gt;select min(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;-- alter session set session_cached_cursors=1;&lt;br /&gt;alter session set session_cached_cursors=3;&lt;br /&gt;&lt;br /&gt;exec proc_p2;&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=false;&lt;br /&gt;exit;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I tested with session_cached_cursors from 1 to 3 and number of SQL from 1-3 as well. Here is the summary:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;-------------------------------------------------------------------------&lt;br /&gt;version  session_cached_    # static SQL      # of parse    # of execution&lt;br /&gt;cursors&lt;br /&gt;-------------------------------------------------------------------------&lt;br /&gt;10.2.0.1     1                      1                1             100&lt;br /&gt;10.2.0.1     1                      2   (a)          100           100&lt;br /&gt;                                        (b)          100           100&lt;br /&gt;10.2.0.1     2                      2   (a)          100           100&lt;br /&gt;10.2.0.1                                (b)          100           100&lt;br /&gt;10.2.0.1     3                      2   (a)          1             100&lt;br /&gt;                                        (b)          1             100&lt;br /&gt;10.2.0.1     3                      3   (a)          100           100&lt;br /&gt;                                        (b)          100           100&lt;br /&gt;                                        (c)          100           100&lt;br /&gt;-------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the case of session_cached_cursors=3 and three static SQLs, in the above test, I repeatedly executed all three SQLs together 100 times. How about repeatedly executing each SQL 100 times, for three SQLs total?. How about picking up the next SQL to be executed randomly? Can increase session_cached_cursors really help?. Below are the test codes and some results.&lt;br /&gt;&lt;br /&gt;Test code of excuting each static SQL 100 times, for three SQLs total:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace procedure  proc_p2&lt;br /&gt;is&lt;br /&gt;obj_no number;&lt;br /&gt;obj_name all_objects.object_name%type;&lt;br /&gt;begin&lt;br /&gt;for i in 1..100&lt;br /&gt;loop&lt;br /&gt;-- sql a&lt;br /&gt;select count(*) into obj_no from all_objects where object_id = i; &lt;br /&gt;end loop;     &lt;br /&gt;&lt;br /&gt;for i in 1..100&lt;br /&gt;loop  &lt;br /&gt;-- sql b&lt;br /&gt;select max(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;end loop;&lt;br /&gt;&lt;br /&gt;for i in 1..100&lt;br /&gt;loop &lt;br /&gt;-- sql c &lt;br /&gt;select min(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;-- alter session set session_cached_cursors=1;&lt;br /&gt;alter session set session_cached_cursors=3;&lt;br /&gt;&lt;br /&gt;exec proc_p2;&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=false;&lt;br /&gt;exit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test code of picking next static SQL to be executed randomly:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create or replace procedure  proc_p2&lt;br /&gt;is&lt;br /&gt;obj_no number;&lt;br /&gt;obj_name all_objects.object_name%type;&lt;br /&gt;r number;&lt;br /&gt;begin&lt;br /&gt;for i in 1..300&lt;br /&gt;loop&lt;br /&gt;r := dbms_random.value; &lt;br /&gt;if ( r &amp;lt;= 0.3333 ) then&lt;br /&gt;select count(*) into obj_no from all_objects where object_id = i; &lt;br /&gt;elsif ( r &amp;gt;= 0.6667 ) then&lt;br /&gt;select max(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;else &lt;br /&gt;select min(object_name) into obj_name from all_objects where rownum &amp;lt;= i;&lt;br /&gt;end if;&lt;br /&gt;end loop;     &lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;show errors;&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;-- alter session set session_cached_cursors=1;&lt;br /&gt;alter session set session_cached_cursors=20;&lt;br /&gt;&lt;br /&gt;exec proc_p2;&lt;br /&gt;&lt;br /&gt;alter session set sql_trace=false;&lt;br /&gt;-- exit;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is the result from TKPROF for above two cases:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;------------------------------------------------------------------------&lt;br /&gt;Order      session_cached_    # static SQL    # of parse  # of execution&lt;br /&gt;cursors&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;Each SQL&lt;br /&gt;100 times      3                   3   (a)         1          100&lt;br /&gt;                                       (b)         1          100&lt;br /&gt;                                       (c)         1          100&lt;br /&gt;Random         3                   3   (a)        33           90&lt;br /&gt;                                       (b)        33          104&lt;br /&gt;                                       (c)        33          106&lt;br /&gt;Random         20                  3   (a)         1           96&lt;br /&gt;                                       (b)         1          104&lt;br /&gt;                                       (c)         1          100&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-455828197059268298?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/455828197059268298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=455828197059268298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/455828197059268298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/455828197059268298'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/11/sessioncachedcursors-and-parse.html' title='session_cached_cursors and parse'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8264060464313219171</id><published>2009-10-30T14:59:00.005-04:00</published><updated>2009-10-30T15:38:15.009-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DBMS_STATS'/><category scheme='http://www.blogger.com/atom/ns#' term='mistake'/><title type='text'>DBMS_STATS mistake</title><content type='html'>In 10g I know, by default, Oracle will decide if the histogram is needed for a column. If we don't want to collect histogram, we should specify: method_opt=&gt;'FOR ALL COLUMNS SIZE 1'.&lt;br /&gt;&lt;br /&gt;I find I have maken a mistake in a pre-production 10g database. I omitted the 'ALL' keyword in the job for gathering table stats. So what could happen?&lt;br /&gt;&lt;br /&gt;Here is the demonstration by a test:&lt;br /&gt;&lt;br /&gt;SQL&gt;select * from v$version;&lt;br /&gt;&lt;br /&gt;BANNER&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi&lt;br /&gt;PL/SQL Release 10.2.0.1.0 - Production&lt;br /&gt;CORE 10.2.0.1.0 Production&lt;br /&gt;TNS for Solaris: Version 10.2.0.1.0 - Production&lt;br /&gt;NLSRTL Version 10.2.0.1.0 - Production&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;drop table t;&lt;br /&gt;drop table t&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00942: table or view does not exist&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt;create table t as select * from dba_objects;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;begin&lt;br /&gt;2 dbms_stats.gather_table_stats(user,'T',&lt;br /&gt;3 estimate_percent =&gt;30,&lt;br /&gt;4 cascade =&gt; TRUE,degree =&gt; 8,&lt;br /&gt;5 method_opt =&gt; 'FOR COLUMNS SIZE 1');&lt;br /&gt;6 end;&lt;br /&gt;7 /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select table_name, column_name, density,num_buckets, last_analyzed&lt;br /&gt;2 from dba_tab_columns where owner=user and table_name='T';&lt;br /&gt;&lt;br /&gt;TABLE_NAME COLUMN_NAME DENSITY NUM_BUCKETS LAST_ANAL&lt;br /&gt;------------------------------ ------------------------------ ---------- ----------- ---------&lt;br /&gt;T OWNER&lt;br /&gt;T OBJECT_NAME&lt;br /&gt;T SUBOBJECT_NAME&lt;br /&gt;T OBJECT_ID&lt;br /&gt;T DATA_OBJECT_ID&lt;br /&gt;T OBJECT_TYPE&lt;br /&gt;T CREATED&lt;br /&gt;T LAST_DDL_TIME&lt;br /&gt;T TIMESTAMP&lt;br /&gt;T STATUS&lt;br /&gt;T TEMPORARY&lt;br /&gt;T GENERATED&lt;br /&gt;T SECONDARY&lt;br /&gt;&lt;br /&gt;13 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;begin&lt;br /&gt;2 dbms_stats.gather_table_stats(user,'T',&lt;br /&gt;3 estimate_percent =&gt;30,&lt;br /&gt;4 cascade =&gt; TRUE,degree =&gt; 8,&lt;br /&gt;5 method_opt =&gt; 'FOR ALL COLUMNS SIZE 1');&lt;br /&gt;6 end;&lt;br /&gt;7 /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt;select table_name, column_name, density,num_buckets, last_analyzed&lt;br /&gt;2 from dba_tab_columns where owner=user and table_name='T';&lt;br /&gt;&lt;br /&gt;TABLE_NAME COLUMN_NAME DENSITY NUM_BUCKETS LAST_ANAL&lt;br /&gt;------------------------------ ------------------------------ ---------- ----------- ---------&lt;br /&gt;T OWNER .03125 1 30-OCT-09&lt;br /&gt;T OBJECT_NAME .000035967 1 30-OCT-09&lt;br /&gt;T SUBOBJECT_NAME .005847953 1 30-OCT-09&lt;br /&gt;T OBJECT_ID .000019563 1 30-OCT-09&lt;br /&gt;T DATA_OBJECT_ID .000208203 1 30-OCT-09&lt;br /&gt;T OBJECT_TYPE .027777778 1 30-OCT-09&lt;br /&gt;T CREATED .000393236 1 30-OCT-09&lt;br /&gt;T LAST_DDL_TIME .000394789 1 30-OCT-09&lt;br /&gt;T TIMESTAMP .000388651 1 30-OCT-09&lt;br /&gt;T STATUS .5 1 30-OCT-09&lt;br /&gt;T TEMPORARY .5 1 30-OCT-09&lt;br /&gt;T GENERATED .5 1 30-OCT-09&lt;br /&gt;T SECONDARY .5 1 30-OCT-09&lt;br /&gt;&lt;br /&gt;13 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We can see that no column stats will be gathered if that 'ALL' is missing, though no errors thrown out. This will cause bad execution plan in some situations.&lt;br /&gt;&lt;br /&gt;DBA makes mistake. The question is how to reduce and avoid serious one. Some are due to carelessness and some are due to lack of experinece or knowledge. I should say the above mentioned mistake belongs to the first category. ( Though, I did not realize that all column stats would be missing) . Another example, the other day, I forgot to lift the restricted session mode after I was done a maitenance job. I do have this step in my checklist, the situation was that I was distracted by a production issue and have not come back to verify every steps in my checklist. Chris Foot has written an execent blog: &lt;a href="http://www.remotedbaexperts.com/Blog/2009/09/the-art-of-being-a-successful-dba-poka-yoke-and-paranoid-dba-best-practices/"&gt;The Art of Being a Successful DBA – Poka-Yoke and Paranoid DBA Best Practices&lt;/a&gt;, which I may want to read from time to time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8264060464313219171?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8264060464313219171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8264060464313219171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8264060464313219171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8264060464313219171'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/10/dbmsstats-mistake.html' title='DBMS_STATS mistake'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-8902767900712801814</id><published>2009-10-13T08:24:00.003-04:00</published><updated>2011-04-12T17:02:24.979-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='constraint'/><title type='text'>Truncate a parent table</title><content type='html'>I overlooked the operations required to truncate a parent table. I thought I only need to&lt;br /&gt;truncate all of its child tables first, then truncate itself. The following test demonstrated&lt;br /&gt;that constraints have to be taken care of in addition:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; @fk_child&lt;br /&gt;Enter value for 1: z9xxx94&lt;br /&gt;Enter value for 2: p&lt;br /&gt;----- Children of z9xxx94 p -------&lt;br /&gt;&lt;br /&gt;Owner Table Name Constraint Name Ref Constraint Name Status&lt;br /&gt;-------------- ----------------- ------------------ ------------------------ --------&lt;br /&gt;Z9xxx94 C C_FK P_PK ENABLED&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; truncate table c;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; truncate table p;&lt;br /&gt;truncate table p&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;&lt;span style="color: #3333ff;"&gt;ORA-02266: unique/primary keys in table referenced by enabled foreign keys&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;We have to disable child table FK constraint first:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter table c modify constraint C_FK disable;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; truncate table p;&lt;br /&gt;&lt;br /&gt;Table truncated.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; alter table c modify constraint C_FK enable;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select count(*) from c;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;0&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select count(*) from p;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-8902767900712801814?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/8902767900712801814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=8902767900712801814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8902767900712801814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/8902767900712801814'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/10/truncate-parent-table.html' title='Truncate a parent table'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-594589655753817591</id><published>2009-10-09T00:40:00.006-04:00</published><updated>2009-10-09T00:56:41.783-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>A SQL with a hidden error</title><content type='html'>This test case is built from a real life DBA task.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t as select rownum id, object_name from dba_objects where rownum &lt;=10;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t2 as select rownum id1, object_name from dba_objects where rownum &lt;=5;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our intention was to do the  following SQL with a subqeury:&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from t where id in ( select id1 from t2);&lt;br /&gt;&lt;br /&gt;ID OBJECT_NAME&lt;br /&gt;---------- ------------------------------&lt;br /&gt;1 TAB$&lt;br /&gt;2 I_IND1&lt;br /&gt;3 I_COBJ#&lt;br /&gt;4 USER$&lt;br /&gt;5 I_OBJ1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Instead, we executed the following SQL, which has a typo .  However, it got executed without error:&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from t where &lt;span style="color:#ff0000;"&gt;&lt;strong&gt;id&lt;/strong&gt;&lt;/span&gt; in ( select &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;/strong&gt; from t2);&lt;br /&gt;&lt;br /&gt;ID OBJECT_NAME&lt;br /&gt;---------- ------------------------------&lt;br /&gt;1 TAB$&lt;br /&gt;2 I_IND1&lt;br /&gt;3 I_COBJ#&lt;br /&gt;4 USER$&lt;br /&gt;5 I_OBJ1&lt;br /&gt;6 I_PROXY_ROLE_DATA$_2&lt;br /&gt;7 C_FILE#_BLOCK#&lt;br /&gt;8 C_OBJ#&lt;br /&gt;9 BOOTSTRAP$&lt;br /&gt;10 I_ICOL1&lt;br /&gt;&lt;br /&gt;10 rows selected.&lt;br /&gt;&lt;br /&gt;Isn't it better Oracle can throw error for this SQL?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30263044-594589655753817591?l=oracle-study-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracle-study-notes.blogspot.com/feeds/594589655753817591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30263044&amp;postID=594589655753817591' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/594589655753817591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30263044/posts/default/594589655753817591'/><link rel='alternate' type='text/html' href='http://oracle-study-notes.blogspot.com/2009/10/sql-with-hidden-error.html' title='A SQL with a hidden error'/><author><name>Yu "Denis" Sun</name><uri>http://www.blogger.com/profile/15884036034395020134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30263044.post-2388620306664993524</id><published>2009-09-21T14:48:00.008-04:00</published><updated>2010-02-22T15:58:42.974-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ref cursor'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Use Ref Cursor in Java and Close it</title><content type='html'>In one of our production databases, I observed from v$open_cursor that some sessions from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;weblogic&lt;/span&gt; application server could have about 2000 opened cursor count for a particular ref cursor. Usually the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;weblogic&lt;/span&gt; servers are recycled every night. I can observe the count increasing from 0 to about 2000 before recycle each day.&lt;br /&gt;&lt;br /&gt;This database has been crash every week from ORA-600 [17074]. In the trace file, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SQL&lt;/span&gt; of the process that crashes the database is shown to be that ref cursor. So the cursor was thought to be contributed into the crash at least. (Oracle Support suggests that the bug in the server combined with the condition in our code caused the crash). However, recently the database crash problem has mysteriously &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;disappeared&lt;/span&gt; without any sound reasons.&lt;br /&gt;&lt;br /&gt;Development team claimed that they close that cursor in their Java code, but I really doubted it as the count is still increasing every day. I am afraid that it is a bomb that will explode some day again.&lt;br /&gt;&lt;br /&gt;I have used Java several years ago when I did some course works in school. However, since then, I have never touched Java. I assigned myself a task to simulate the cursor count increasing symptom. It took me some time to figure out how. I even asked that in some forum, but did not get what I want. I &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;eventually&lt;/span&gt; found this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1606716582692"&gt;AskTom&lt;/a&gt;&lt;/span&gt; post and &lt;a href="http://www.databasedesign-resource.com/ref-cursor.html"&gt;this site&lt;/a&gt; helpful.&lt;br /&gt;&lt;br /&gt;The test is done in the Oracle sample schema HR and in a 10G database.&lt;br /&gt;&lt;br /&gt;First of all, I created a function in a package that returns a ref cursor. Given a Department ID, the function returns a ref cursor pointing to a list of last names and first names of the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;employees&lt;/span&gt; belonging to that department.&lt;br /&gt;&lt;br /&gt;The function looks like:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: 85%;"&gt;function &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;sfGetEmpDept&lt;/span&gt;&lt;br /&gt;( &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;pDeptID&lt;/span&gt; in EMPLOYEES.DEPARTMENT_ID%type)&lt;br /&gt;return &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;csGetResultSet&lt;/span&gt; is&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;csGetEmp&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;csGetResultSet&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;open &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;csGetEmp&lt;/span&gt; for&lt;br /&gt;SELECT e.last_name, e.first_name, e.department_id&lt;br /&gt;FROM employees e&lt;br /&gt;WHERE e.department_id = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;pDeptID&lt;/span&gt;&lt;br /&gt;ORDER BY e.last_name;&lt;br /&gt;&lt;br /&gt;return &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;csGetEmp&lt;/span&gt;;&lt;br /&gt;end &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;sfGetEmpDept&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;Secondly, I figured out how to use this ref cursor in a Java program through &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;JDeveloper&lt;/span&gt;. In the Java code, I called a method &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;getEmpDept&lt;/span&gt; 10 times.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: 85%;"&gt;em.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;showOpenCnt&lt;/span&gt;( &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;conn&lt;/span&gt;, "*** Before anything" );&lt;br /&gt;for(int i = 10;  i &amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;lt&lt;/span&gt;;=100; i = i + 10 ) {        &lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;emlist&lt;/span&gt; = em.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;getEmpDept&lt;/span&gt;(i);&lt;br /&gt;System.out.println( "Dept ID: " + i +&lt;br /&gt;" Number of employee is " + &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;emlist&lt;/span&gt;.size()  );&lt;br /&gt;}&lt;br /&gt;em.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;showOpenCnt&lt;/span&gt;( &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;conn&lt;/span&gt;, "*** After everything" );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is a line in the method &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;getEmpDept&lt;/span&gt; which controls whether close the result set or not:&lt;br /&gt;&lt;br /&gt;rs.close();&lt;br /&gt;&lt;br /&gt;I measure the open &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;curosr&lt;/span&gt; count before and after call &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;getEmpDept&lt;/span&gt;. The results are as expected:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Uncomment&lt;/span&gt; out rs.close(), i.e. we close the ref cursor after use it.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Get the Number of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;emplyee&lt;/span&gt; in a Department&lt;br /&gt;*** Before anything&lt;br /&gt;1 opened cursors current&lt;br /&gt;-----------------------&lt;br /&gt;Dept ID: 10 Number of employee is 1&lt;br /&gt;Dept ID: 20 Number of employee is 2&lt;br /&gt;Dept ID: 30 Number of employee is 6&lt;br /&gt;Dept ID: 40 Number of employee is 1&lt;br /&gt;Dept ID: 50 Number of employee is 45&lt;br /&gt;Dept ID: 60 Number of employee is 5&lt;br /&gt;Dept ID: 70 Number of employee is 1&lt;br /&gt;Dept ID: 80 Number of employee is 34&lt;br /&gt;Dept ID: 90 Number of employee is 3&lt;br /&gt;Dept ID: 100 Number of employee is 6&lt;br /&gt;&lt;span style="color: #3333ff;"&gt;*** After everything&lt;br /&gt;1 opened cursors current&lt;/span&gt;&lt;br /&gt;-----------------------&lt;br /&gt;Process exited with exit code 0.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Comment out rs.close(), i.e. we don't close the ref cursor in every call&lt;/strong&gt;&lt;br /&gt;*** Before anything&lt;br /&gt;1 opened cursors current&lt;br /&
