Friday, July 20, 2012

What's the meaning of the asterisk in Oracle's ORATAB file?


The perplexing asterisk is something Oracle DBAs have all seen when editing /etc/oratab for years.  But how many are old enough to know what it means, and more importantly if it is still required, and what it should be set to, especially when multiple ORACLE_HOMEs are used.

It's somewhat pleasing that I haven’t seen it in any installations lately but it remains on some machines where prior Oracle versions were installed and have been upgraded.

The best suggestion I found from searching the web was to look in the oraenv script.  From the header of the script…  An asterisk '*' can be used to refer to the NULL SID.  So now you know. J  And if your're like me you’re still just as confused.  Join the club.  Nothing in the oraenv script actually does anything with it.

There is some further information in the dbhome script.  It actually uses it, and when explicitly passed a "" (i.e. dbhome "") then you are returned the ORACLE_HOME matching the line with the asterisk.   But oraenv won't accept the "" so it’s pretty academic.

A web search for “NULL SID” offers some better insights.  It returned Oracle 7 document where it stated that a NULL SID was not supported by SQLNET V2.  So it looks like it was something use back in the very early oracle versions before the ORACLE_SID was introduced to identify a database, and something that hasn't been used for years.

So, what should you do when you find a line with an asterisk in an oratab file?  Remove it and stop the confusion.

Wednesday, July 4, 2012

HTML5 Sections

The HTML5 specification defines new sections and provides various scenarios where they can be used.  What it doesn't do is provide a "complete" outline, so here goes...


  • body 
    • header
      • hgroup
        • h1
        • h2
      • nav
    • aside
    • article
      • header
      • nav
      • aside
      • div
        • section
      • footer
    • footer
      • nav


Have I missed anything?

Oracle: Impacts of partition maintenance in RAC

Problem: Excessive gc cr block 2-way or db file sequential read waits against TABPART$ during an insert after adding/dropping a partition in another instance on a table with 10,000 partitions.  

Analysis: Rather surprisingly, the waits aren't for the TABPART$ blocks that needed to be reloaded but the segment header blocks of all the partitions.  These were being loaded in CR mode during query parsing.

After changing the table partitioning it make sense that Oracle would be flushing the TABPART$ information for that table from the library cache of the other instances.  The libarary cache on the instance performing partition maintenance doesn't get purged as this is updated as part of the operation.   On other instances, the next operation on that table then needs to re-populate the library cache from information in TABPART$ (which it does for ALL partitions even if only one is required).  As part of reading from TABPART$, the segment headers of all partitions need to be inspected (not quite sure why).  For 10,000 partitions, there are at least 10,000 physical reads (1 minute @ 6ms per read) or block transfers (5 to 15 seconds @ 0.5 to 1.5ms per transfer) required.

Once the library cache is re-loaded, subsequent statements are fast (until the next partition maintenance operation).

The flush of partition information from the library cache cannot be avoided.

The wait time can be reduced by ensuring the blocks are available on one instance in current (CUR) mode.  Segment headers can't be retained in a KEEP pool, so the only way to make them available is to load them on an idle instance.

The wait time can also be reduced by pre-loading the segment headers in current mode on all instances impacted, however these blocks will not be frequently accessed hence may quickly drop out of the cache.

Loading segment header blocks in current mode is necessary as blocks in consistent (CR)  mode cannot be re-used..  Segment header block can reside in multiple instances in current mode at the same time.

When the segment headers are loaded as part of the TABPART$ query, they are loaded on consistent  mode.  Forcing them into current mode can only done by retrieving rows from each of the partitions.  This can be done using a FULL TABLE SCAN of the table with the SAMPLE option with a small number.  (If anyone knows a better way that doesn't require parsing 10,000 statements with partition clauses or bind/executes, I'm all ears.)  This operation needs to be run twice, as the first time the segment headers are retrieved in consistent mode.

Workaround/Solution


1. Use an IDLE node to hold current copies of segment header blocks

2. Pre-load segment header blocks on all active instances


Supporting Queries


To inspect the segment header blocks



col object_name for a10
col subobject_name for a10
col status for a5
select file#,block#,class#,bh.status, object_name, subobject_name
  from v$bh bh
  join dba_objects obj
    ON (objd = data_object_id)
 where object_name in ('TEST')
   and class# = 4
 order by object_name, subobject_name
/

To load segment header blocks in current mode

select /*+ FULL(test) */ count(*) from test sample (0.00001);


Tuesday, February 7, 2012

Concurrent Oracle 11.2.0.2 32-bit and 64-bit ODBC on Windows 7 x64

Whilst installing the latest Oracle InstantClient 11.2.0.2 with ODBC on Windows 7 I've discovered something new.

=> Both the 32-bit and 64-bit drivers can co-exist.  A single User Data Source can be used for both 32-bit and 64-bit applications.  This means they can be maintained with the default 64-bit ODBC Data Source Administrator.  No more switching between the 32-bit and 64-bit ODBC Administrators.

Why does this work?  

  1. The ODBC Data Source entries for the User DSN are stored in a shared location in the registry (HKCU/Software/ODBC).  Items in this location are not redirected for 32-bit to the Wow6432Node tree.
  2. The ODBC Driver entries are stored in a redirectable location in the registry (HKLM/Software/ODBC).  Items in this location redirect to the Wow6432Node tree (HKLM/Software/Wow6432Node/ODBC).
  3. The Driver names for both 32-bit and 64-bit entries are the same.  Hence, applications will obtain the data source information from the shared location, then obtain the driver location from the redirectable entries.
  4. Whilst the Driver location is specified in the shared DSN entries, there is no reliance on that location.  There is a fallback to the ODBC Driver entries in the registry.
The configuration


I have the 64-bit driver installed in c:\oracle\instantclient_11_2_64, and the 32-bit driver installed in c:\oracle\instantclient_11_2.  The driver name is "Oracle in instantclient_11_2".

When doesn't it work?


This will not work for System Data Source entries as these are stored in the redirectable location (HKLM/Software/ODBC).

Monday, July 18, 2011

Oracle ACFS Troubleshooting (11.2.0.2)


Todays efforts to create an ACFS volume on a linux cluster haven't been smooth – but finally there is success.

Problem 1: ASMCA was slow to startup.
Running a ps and searching for the pid of asmca process showed RSH tests (i.e. /usr/bin/rsh hostB /bin/true).  But RSHD is not running on this cluster, and these attempts take a while to timeout.  The problem was the prior SSH connection attempt was failing.  It needed to be primed with a command line connection (ssh hostB) due to a key change.

Problem 2: ACFS volumes didn't enable on remote nodes
Creating the ACFS volume and filesystem using ASMCA was successful, however the volumes were only enabled successfully on the primary node of the cluster (i.e. hostA).  All other nodes returned ORA-15477 (Cannot communicate with the volume driver).

The volume driver was running:
> acfsdriverstate
ACFS-9206: usage: acfsdriverstate [-orahome ] [-s]
> acfsdriverstate installed
ACFS-9203: true
> acfsdriverstate loaded
ACFS-9203: true
> acfsdriverstate version
ACFS-9325:     Driver OS kernel version = 2.6.18-8.el5(x86_64).
ACFS-9326:     Driver Oracle version = 100804.1.
> acfsdriverstate supported
ACFS-9200: Supported

On at least one of the nodes, the mount directory had the incorrect group (this cluster uses the legacy dba group rather than oinstall):
> chmod dba /u04

Re-installing ACFS allowed further progress.  A few web searches resulted in similar scenarios requiring a re-install after every node boot.  The root cause was unknown.  time will tell whether this is a necessary workaround for this cluster.
> sudo su
> acfsroot install

Enabling of the volumes was then successful
> sudo su – oracle
> . oraenv << "+ASM2"
> asmcmd volenable -a

ASMCA was successful mounting volumes on all but one node.  The final node needed to be manually mounted.
> sudo su
> mount –t acfs /dev/asm/acfs1-351 /u04

Thought of the day/week: Working with computers is rarely boring but frequently frustrating.  They can be as unpredictable as people.

Friday, July 1, 2011

Hidden and Undocumented "Cardinality Feedback"

I just stumbled across this in an 11gR2 environment. Initially I though it was part of Adaptive Cursors Sharing and Bind Awareness, but no. The impacted queries have not been flagged as bind sensitive or bind aware. The DBMS_XPLAN cursor plan includes the note "cardinality feedback used for this statement".

A quick search found this article...

We Do Streams: Hidden and Undocumented "Cardinality Feedback"

There is an article written on this topic by the CBO dev team:
http://blogs.oracle.com/optimizer/entry/cardinality_feedback


During the first execution of a SQL statement, an execution plan is generated as usual. During optimization, certain types of estimates that are known to be of low quality (for example, estimates for tables which lack statistics or tables with complex predicates) are noted, and monitoring is enabled for the cursor that is produced. If cardinality feedback monitoring is enabled for a cursor, then at the end of execution, some of the cardinality estimates in the plan are compared to the actual cardinalities seen during execution. If some of these estimates are found to differ significantly from the actual cardinalities, the correct estimates are stored for later use. The next time the query is executed, it will be optimized again, and this time the optimizer uses the corrected estimates in place of its usual estimates.

We can tell that cardinality feedback was used because it appears in the note section of the plan. Note that you can also determine this by checking the USE_FEEDBACK_STATS column in V$SQL_SHARED_CURSOR.


See also the VLDB document and presentation.

Plus Jonathan Lewis post on Cardinality Feedback.

This behaviour can be controlled by _optimizer_use_feedback.

Thursday, June 2, 2011

HTC Desire dropped in water

My HTC Desire has been a wonderful phone whcih I've had for a little over a year without mishap ... until last night (Thu 6.00pm) when it fell into the toilet.  At least it had been flushed beforehand, so it was clean water.

Before going anything else, I took off the cover, took out the battery, took out the sim, took out the memory card, and stuck it in a container of rice overnight, and prayed.

This morning (Fri 7:00am, 13 hours later) I tried it.  It seemed ok with a small hint of some capacitive loss.

One hour later on the way to work, I tried it again.  Oh.  Quite a lot of capacitive loss, requiring very heavy touches and swipes.  Not good.

So it's now apart again and hopefully continuing to dry out in a dry air conditioned room.

Hint - make sure you do up the zip when putting it back in it's belt pouch.

Further updates to come ... all is not lost ... yet.

Fri 4:40pm (23 hours after the event): My latest test results on the phone are promising after giving it more time to dry in an air conditioned room.  But it's too early to be 100% conclusive as I only had it on for a few minutes.  I'll give it another day to dry out.

Mon 9:00am (3.5 days after the event): Turned it on for the first time in 2.5 days this morning.  All appears to be ok.  I'll now treat is "normally" and see how it goes.  It's currently on charge (a low charge rate via a laptop usb port).
Tue 9:00am: All still ok.

[18-July-2011] 1.5 months later - all is well.

[20-July-2012] 13.5 months later - all is well apart from the camera which has lost it's clarity and focussing ability (which for all I know could be unrelated to the water incident).

[26-April-2013] All is still well.

[9-October-2013] All is still well.