Top 60 Oracle Blogs

Recent comments

Oakies Blog Aggregator

Statistics on Partitioned Tables - Part 6a - COPY_TABLE_STATS - Intro

[Phew. At last. The first draft of this was dated more than two weeks ago .... One of the problems with blogging about copying stats was the balance between explaining it and pointing out some of the problems I've encountered. So I've broken up this post, with a little explanation first ...]

Oracle have a lot of on-site consultants, designers and developers who are out working with customers on very large databases and they no doubt have their own internal systems too, so you shouldn't make the mistake of thinking they're unaware of the problems that people face in gathering accurate and timely statistics on large partitioned tables. I don't say that based on any inside knowledge but by

  • Attending conferences, listening to presentations, reading White Papers and blog posts; and
  • Because they are constantly introducing new features to try to address the issues.

Over the next few posts, I'll look at some of those new features, some of which appear more successful than others. First of all, copying statistics using DBMS_STATS.COPY_TABLE_STATS.

Copying stats is a variation of a technique I've seen used on a couple of Oracle Data Warehouse projects in the past where we decided that spending time and system resources gathering object statistics wasn't useful. Think about some of the problems you'll face when gathering stats on large partitioned objects that I've highlighted so far :-

  • It takes time.
  • It sucks system resources.
  • As you change your strategy and the parameters to reduce the resource and time consumption, the stats are likely to be less accurate.

Then consider why we're gathering these stats in the first place :-

  • To describe database objects and data to the optimiser by setting values in the data dictionary (e.g. Number of Rows, Number of Distinct Values, etc.)
  • To help the optimiser identify the optimal execution plan

If we know the precise contents of specific objects at all times (unlikely, but bear with me), why bother trawling through the database examining the contents when we could just set the relevant values in the data dictionary manually? DBMS_STATS has several procedures that can help you achieve that, for example GET_COLUMN_STATS, SET_COLUMN_STATS, SET_TABLE_STATS etc.

We could set the stats for specific tables, indexes or partitions manually and then choose not to gather stats for those objects. As I said, you really need to know your data for this to work, although I would suggest that it's not as important that the stats are absolutely precise as that they are an accurate enough description of the data to lead to optimal plans.

There are a couple of cases where this might prove particularly useful.

  • You add a new partition each month and so the partition starts out empty and fills up gradually over the course of the month. If you think about it, this is likely to lead to fluctuating execution plans as the contents of the partition change. That's what a cost-based optimiser does - calculates new plans based on changing data distribution - but it also implies plan instability and you might want to avoid that if possible. By setting stats manually you can 'pretend' that you start off with a full partition and have the optimiser evaluate plans based on that fixed assumption.
  • You add new partitions very frequently and have very little time to gather statistics before users are likely to report against the data. It might prove useful to set some approximate synthetic stats quickly to get reasonable plans and then gather more detailed stats later when time allows.

The latter is similar to the situation we're faced with on the system I'm working on at the moment, so we were very keen to investigate copying stats as a means to reduce the stats gathering workload and improve the stats quality into the bargain.

COPY_TABLE_STATS when used on partitioned tables is designed to achieve a similar effect to setting stats manually at a similarly low cost but with a little more intelligence. For example, if we are adding a new partition for each new REPORTING_DATE on our example table, maybe it's reasonable to assume that the data volumes and distribution of values is similar to the previous REPORTING_DATE? If so, why not avoid setting fixed stats based on fixed assumptions about the contents of a partition, but copy the stats from a previous partition to the new partition?

Here is a very basic example of how this might look, based on my example table.

At the end of Part 5, the stats on TEST_TAB1 looked like this (column stats excluded to simplify things). Important Note - the bold text in this output has been edited to correct an earlier error in this post. See part 6b for explanation.

SQL> select  table_name, global_stats, last_analyzed, num_rows
  2  from dba_tables
  3  where table_name='TEST_TAB1'
  4  and owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     GLO LAST_ANALYZED          NUM_ROWS                                           
------------------------------ --- -------------------- ----------                                          
TEST_TAB1                      NO                                                                           

SQL> select  table_name, partition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_partitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     PARTITION_NAME                 GLO LAST_ANALYZED          NUM_ROWS           
------------------------------ ------------------------------ --- -------------------- ----------           
TEST_TAB1                      P_20100131                     NO                                            
TEST_TAB1                      P_20100201                     NO                                            
TEST_TAB1                      P_20100202                     NO                                            
TEST_TAB1                      P_20100203                     NO                                            
TEST_TAB1                      P_20100204                     NO                                            
TEST_TAB1                      P_20100205                     NO                                            
TEST_TAB1                      P_20100206                     NO                                            
TEST_TAB1                      P_20100207                     NO                                            
TEST_TAB1                      P_20100209                     NO  28-MAR-2010 15:38:33         12           

9 rows selected.

SQL> select  table_name, subpartition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_subpartitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     SUBPARTITION_NAME              GLO LAST_ANALYZED          NUM_ROWS           
------------------------------ ------------------------------ --- -------------------- ----------           
TEST_TAB1                      P_20100131_GROT                NO                                            
TEST_TAB1                      P_20100131_HALO                NO                                            
TEST_TAB1                      P_20100131_JUNE                NO                                            
TEST_TAB1                      P_20100131_OTHERS              NO                      

TEST_TAB1                  P_20100209_GROT            NO  28-MAR-2010 15:38:32      3           
TEST_TAB1                  P_20100209_HALO            NO  28-MAR-2010 15:38:32      3           
TEST_TAB1                  P_20100209_JUNE            NO  28-MAR-2010 15:38:32      3           
TEST_TAB1                  P_20100209_OTHERS          NO  28-MAR-2010 15:38:33      3           

36 rows selected.

Next I'm going to add a new partition (and by implication, the related subpartitions) to contain rows with a REPORTING_DATE of 20100210, then empty LOAD_TAB1 and insert some appropriate rows into it.

  2  ADD  PARTITION P_20100210 VALUES LESS THAN (20100211);

Table altered.


Table truncated.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 1000, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 30000, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 2000, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 10000, 'N');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 2400, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 500, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 1200, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 400, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 600, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100210, 'GROT', 700, 'Z');

1 row created.


Commit complete.

There are 10 rows that will be loaded into the new partition, all with a SOURCE_SYSTEM of GROT, so all will be added to that subpartition. Now I'll use partition exchange to move the data in LOAD_TAB1 into the P_20100210_GROT subpartition.


Table altered.


Table altered.

Now to copy some stats. First I'll try copying the statistics from the previous partition (P_20100209) to the new partition. i.e. I am performing a Partition-level copy. Important Note - the bold text in this output has been edited to
correct an earlier error in this post. See part 6b for explanation.

SQL> exec dbms_stats.copy_table_stats(ownname => 'TESTUSER', tabname => 'TEST_TAB1', srcpartname => 

'P_20100209', dstpartname => 'P_20100210');

PL/SQL procedure successfully completed.

Let's see what has been copied

SQL> select  table_name, global_stats, last_analyzed, num_rows
  2  from dba_tables
  3  where table_name='TEST_TAB1'
  4  and owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     GLO LAST_ANALYZED          NUM_ROWS                                       
------------------------------ --- -------------------- ----------                                       
TEST_TAB1                      NO                                                                        

SQL> select  table_name, partition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_partitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     PARTITION_NAME                 GLO LAST_ANALYZED          NUM_ROWS        
------------------------------ ------------------------------ --- -------------------- ----------        
TEST_TAB1                      P_20100131                     NO                                         
TEST_TAB1                      P_20100201                     NO                                         
TEST_TAB1                      P_20100202                     NO                                         
TEST_TAB1                      P_20100203                     NO                                         
TEST_TAB1                      P_20100204                     NO                                         
TEST_TAB1                      P_20100205                     NO                                         
TEST_TAB1                      P_20100206                     NO                                         
TEST_TAB1                      P_20100207                     NO                                         
TEST_TAB1                      P_20100209                     NO  28-MAR-2010 15:38:38         12        
TEST_TAB1                      P_20100210                     NO                                         

10 rows selected.

SQL> select  table_name, subpartition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_subpartitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     SUBPARTITION_NAME              GLO LAST_ANALYZED          NUM_ROWS        
------------------------------ ------------------------------ --- -------------------- ----------        
TEST_TAB1                      P_20100131_GROT                NO                                         
TEST_TAB1                      P_20100131_HALO                NO                                         


TEST_TAB1                  P_20100209_GROT            NO  28-MAR-2010 15:38:32      3        
TEST_TAB1                  P_20100209_HALO            NO  28-MAR-2010 15:38:32      3        
TEST_TAB1                  P_20100209_JUNE            NO  28-MAR-2010 15:38:32      3        
TEST_TAB1                  P_20100209_OTHERS          NO  28-MAR-2010 15:38:33      3        
TEST_TAB1                  P_20100210_GROT            NO  28-MAR-2010 15:38:33      3    
TEST_TAB1                      P_20100210_HALO                NO                                         
TEST_TAB1                      P_20100210_JUNE                NO                                         
TEST_TAB1                      P_20100210_OTHERS              NO                                         

40 rows selected.

Mmmm, that's quite interesting. Although there were valid stats on all of the P_20100209 subpartitions, it looks like nothing was copied. It appears that in our situation, where we only gather stats on subpartitions and allow them to aggregate up to the partition and table levels, I need to copy the statistics subpartition-by-subpartition, which is what I'll start looking at in the next post.

Important Note - Please go on to read part 6b. An error on my part in the output I pasted above made it look like there no statistics copied at all. In fact, subpartition statistics for P_20100210_GROT were copied but it's still a confusing picture because I was using a Partition-level copy and yet there are no copied statistics for three of the subpartitions even though the source subpartitions had valid stats, nor for the partition itself.

Which means it's still true that the Partition-level copy will not serve our particular purposes, so next I'll try copying statistics at the individual subpartition level.

I've updated the date of this post so hopefully it will re-appear in aggregators for those who read it earlier.

If You Are Going to MOW…

(just on a side-note)

…and would really like to attend Anjo Kolk and Tommy Pedersen’s presentation: “Accessing the Oracle Database from Google (Apps, App Engine, Spreadsheets)” then do yourself a favor and also attend my presentation on XMLDB based out-of-the-box interfacing (“Boost your environment with Oracle XMLDB“) so you have an idea how it all hooks in…

See the MOW agenda for Friday


An Evening with Oracle Database Security Expert: Pete Finnigan

AMIS Technology School is proud to present, in collaboration with Miracle Benelux Masterclasses:

Miracle Benelux and Pete Finnigan agreed to do an extra special on the AMIS premises the evening just before Pete’s 2 day Masterclass in Utrecht will start (for the 2 day Masterclass agenda, see also the following URL). During this AMIS Query, besides the free food and normal standard setup of such an AMIS Query Event, Pete will have a presentation on Oracle security and there will be a lot of room of informal discussions during and after this session. There is still some room if you would like to learn from one of the best on Oracle database security.

Pete Finnigan

More details on those masterclasses can be found on the Miracle Benelux site. Hopefully this will be the first of series… More details about this event will follow shortly.

About Pete Finnigan…

Pete is a world renowned expert in the area of Oracle security providing consultancy, design, security audits and trainings all in the area of Oracle Security. Pete is a member of the Oak table network, he has spoken regularly all over the world at various conferences such as UKOUG, PSOUG, BlackHat and Risk. Pete is a published author on Oracle security and researches and writes about the subject regularly. Pete also runs his website dedicated to Oracle security”.

About Miracle Benelux…

Miracle Benelux is specialized in database related performance- en stability problems. We have years of experience on troubleshooting Performance problems in large scale Oracle based systems. This is why Miracle Benelux is frequently asked to analyze where the performance-problems are when others give up and “everything” is tried. Miracle Benelux will present the solution on a quick and efficient base. Straight-to-the-point. Also when you have a different point of view with your supplier you can consult Miracle Benelux. Miracle Benelux has customers like Ahold, Free Record Shop, NUON, Eneco, Ziggo, TenneT, het Kadaster etc.

About AMIS…

AMIS creates ICT solutions to ensure the success of our customers to increase. We take along challenges together, with a passion for our profession, trust in each other and ambition to continuous growth. Committed to ICT. Involved in people. We want to help the customer progress by utilizing high-quality information technology. It is our aim to realize targets in cooperation with our customers thanks to standard software, our custom-made applications and our services. In short, to achieve results with IT.

We care about applying our knowledge for the customer’s benefit in the best possible way. This passion for our job could be said to be a compulsory element in our culture within AMIS. Getting results by doing what you love is great, but realizing them together gives them even more value. Cooperation is something we cherish. We hone our knowledge and experiences by sharing them with colleagues and customers. In our view this makes knowledge more valuable. Thus everyone is very welcome to attend the knowledge sessions that we organize or take part in discussions in our technology blog.


You can register you for this event here:

Event Registration Form (Dutch)

HTH, Marco

Call for Papers

The call for papers  for the  Tech Server and E-Business event in the UKOUG Conference Series is only a couple of weeks from closing, so I’m just bouncing this email to the top of the pile: Once again we are launching call for papers for the annual Technology & E-Business Suite user group conference. This [...]

UKOUG 2010 CFP is now open!

Can you believe it? Already?? Yes, that’s right, the Call for Papers for the UKOUG Technology and E-Business Suite conference is already open! In my opinion, this is one of the best conferences out there! Wide variety of speakers, great topics, and, it’s not too big! This coming year will be my fifth (or is it sixth?) year attending, and it’s a trip I’ve always enjoyed, and never regretted taking the time (or money) to attend.

The CFP is open through Monday, August 2nd, 2010. The conference itself is coming up on November 29th – December 1st, 2010, in Birmingham, England.

More information is available here.


Browsing around the internet recently I came across this result: “During February, 2010, was positioned by as the 33 most visited website in the United States. In order to be ranked in traffic in number 33, had 25,165,482 visits.” Pretty impressive, isn’t it. On the other hand, Worpress tells me that I [...]

Michigan OakTable Symposium 2010

The terrific agenda of the first Michigan OakTable Symposium is online.
I plan to give the following presentations:

Edition-Based Redefinition
Interpreting Execution Plans
Transaction Management Internals

The abstracts are available on my Public Appearances page as well as on the event’s site. By the way, the early bird registration ends April 30.

My Personal Wiki –

Our brain does not work in a linear or list-like manner (yeah.. not like the guy on the right). From the textbooks and blogs that we read everyday we are all aware that print is laid out in a series of lines or rows…

but our brain is multidimensional…

the information as it is being absorbed could be travelling sequentially to our brain, but internally it is not being serviced in simple lists and lines. There is a complex process of sorting and selecting and the whole network of words and ideas are being juggled and interlinked in order to have a far better meaning.

We also receive each word that we read in the context of the words that surround it and also basing it on our own special interpretation as dictated by our experiences and personal information patterns.

You can see from the illustrations below, that just by looking at them particularly on the key words and connections we could easily get the whole idea about the topic…

Tony Buzan’s mind map of his bio Mind map of Oracle Products (not updated)

And this is where the Mind Map is very useful.. the non-linear structure of words and topics and interconnections makes us easy to “slot in” and relate to the main idea and branch out as dictated by the individual ideas and general form of the central theme.

I also do this when reading books and important articles, on the meetings, and doing presentations. Which is also very helpful for recall and retention and going back to the state of my mind when I’m studying that particular topic or idea. Yes.. there are really moments that I become very forgetful about stuffs on the time that I really need it, and I just get back on my notes/sketches to refresh and get things done </p />

    	  	<div class=

Oracle VM Single Box Install

A brother of mine asked me if I could create a database machine and an application server machine during this Easter bank holidays regarding a Demo/Proof Of Concept setup. Easter is always a lazy period, so why not…

The end result would be something like the following:

  • Disks setup RAID-1 configuration (2×146 GB)
  • OS: RedHat EL 5.4 x86_64
  • Application Server: JBoss 4.0.3 GA
  • Database Server: Oracle Database Server 10g R2 Standard Edition One

So I started doing some thinking. I had two HP ProLiant DL380 GL6 Server machines to work with, but both were “bare” minimum regarding their hardware. Every HP DL380 had 2×146 swappable SAS harddisks and only 2×2 GB RAM. Hmmm… Oracle License wise I would be in the safe zone because it would only be used as a demo / proof of concept environment and I also knew that the resource consumption would be the heaviest on the application server part. CPU probably wouldn’t be an issue due to the fact that even this starter model contained a Quad core Xeon Intel per machine.

I missed a lot of info, that in the end still could be crucial. For example database NLS/Unicode or JVM settings, software versions, SDK/JDK, etc, etc. Also it had to be easy maintainable and very decently configured due one of the facts that, my brother, or others probably could not maintain a Linux environment or even start one or start an Oracle database. And be honest, those boxes (although nice servers) were really bare minimum regarding harddisk volume sizes or RAM specs.

I came up with the following, probably not officially supported, but working idea…why not use Oracle VM…? In the end its a far more flexible solution…?!

A typical Oracle VM implementation would normally involve a two tier install like the following picture, one node containing the Oracle VM Server and one node containing the Oracle VM Manager…

Click on the picture to enlarge

I had two HP boxes so I could have implemented it that way, but it would have left me in the same situation as the standard application / database server setup; A bare minimum environment regarding memory, probably (lacking some info here), for the application server and to much resources for the database environment. The Oracle database was/would be, mentioned on Friday evening, only “10 GB” in size. I know this doesn’t say that much, but I assumed it would be a small OLTP database environment. Due to the fact I had to assume to much on these kind of things had driven me in the “Oracle VM” solution direction in the first place.

To make a long story shorter, I did the following. I stripped the memory banks from one machine and put it in the other. I did the same for the CPU and SAS disks. So as a result I had, for now, one unusable machine (stripped from its CPU/memory and harddisks) and the second machine now contained the following:

  • 2 x Quad Core Intel Xeon CPU’s
  • 4 x 146 GB SAS Disks
  • 4 x 2 GB RAM (2 x 2 GB per CPU)

Now we are getting somewhere… One box with probably a bit of overkill regarding CPU, still lacking memory banks (even my new laptop will have the same regarding total memory) and just enough, for starters, regarding disk volume to create Oracle VM virtual environments.

Regarding the Oracle VM Manager setup, if I read the manuals correctly, could be setup on a, for example, virtual machine on a different location (my laptop?) or as a virtual machine withing the Oracle VM Server environment, based on a Oracle VM Manager Template. Due to the fact that I don’t have a SAN solution and two nodes that take part in the Oracle VM architecture setup, this would mean that the Oracle Manager part would not automatically start. Of course, being on a Linux environment, I could have scripted that part based on the init.d/rc startup Linux method (hoping that the virtual Oracle VM Manager server would always be dedicated to the same XEN domain btw…). Anyway…

After playing with the idea, I ended up with the following. Why not install the Oracle VM Server AND the Oracle VM Manager on the same environment.

Be very aware: The following single box setup is probably, by Oracle, an unsupported hardware/software setup (but it works like clockwork) 8-)

Oracle VM Single Box Install

I created via the HP array configuration tool one big RAID 10 piece, so one volume, using all 4 x 146 GB SAS disks. This gave me approximately a 275 GB disk volume to play with. I installed the Oracle VM Server part as mentioned in the manuals, but with one exception: instead of leaving the default root partition 2 GB in size I changed it to 10 GB in size. Oracle VM Manager needs, among others, a minimum of 2 GB of free / (root) volume.

After setting the appropriate hostname (FSEUDEMO01 in this case) and binding it hard to a TCP/IP address,, I continued with installing the Oracle VM Manager software on the same machine. So be aware, within the base Domain-1 Oracle VM environment (dom0 as shown in the picture, so not a domU). This has the cool side effect that rebooting the physical machine will not only automatically start the Oracle VM Server environment but also the Oracle VM Manager environment.

The install logging of the Oracle VM Manager software will show something like the following:

#66cc66;">[root#33cc33;">@FSEUDEMO01 mnt#66cc66;">]# sh ./
Welcome to Oracle VM Manager #cc66cc;">2.2
Please enter the choice: #66cc66;">[#cc66cc;">1|#cc66cc;">2|#cc66cc;">3#66cc66;">]
1. Install Oracle VM Manager
2. Uninstall Oracle VM Manager
3. Upgrade Oracle VM Manager
Starting Oracle VM Manager #cc66cc;">2.2 installation ...
#00b100; font-weight: bold;">Do you want to install a new database or use an existing one? #66cc66;">[#cc66cc;">1|#cc66cc;">2#66cc66;">]
1. Install a new Oracle XE database on localhost
2. Use an existing Oracle database #00b100; font-weight: bold;">in my network
Prepare to install the Oracle XE database ...
Checking the supported platforms ... Done
Checking the prerequisite packages are installed ... Done
Checking the available disk space ... Done
Installing the oracle-xe-univ package #66cc66;">(rpm#66cc66;">) now ...
Oracle Database 10g Express Edition Configuration
This will configure on-boot properties of Oracle Database 10g Express
Edition.  The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used #00b100; font-weight: bold;">for database accounts.  Press <Enter> to accept the defaults.
Ctrl-C will abort.
Specify the HTTP port that will be used #00b100; font-weight: bold;">for Oracle Application Express #66cc66;">[#cc66cc;">8080#66cc66;">]:
Specify a port that will be used #00b100; font-weight: bold;">for the database listener #66cc66;">[#cc66cc;">1521#66cc66;">]:
Specify a password to be used #00b100; font-weight: bold;">for database accounts.  Note that the same
password will be used #00b100; font-weight: bold;">for SYS and SYSTEM.  Oracle recommends the use of
different passwords #00b100; font-weight: bold;">for each database account.  This can be done after
initial configuration:
Confirm the password:
#00b100; font-weight: bold;">Do you want Oracle Database 10g Express Edition to be started on boot #66cc66;">(y/n#66cc66;">) #66cc66;">[y#66cc66;">]:
Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to ";">8080/apex"
Checking the availability of the database ...
#b1b100; font-weight: bold;">Set default database schema to 'OVS'.
Please enter the password #00b100; font-weight: bold;">for account 'OVS':
Confirm the password:
Creating the Oracle VM Manager database schema ...Done
Installing the ovs-manager package #66cc66;">(rpm#66cc66;">) ...
Installing the oc4j package #66cc66;">(rpm#66cc66;">) ...
Please enter the password #00b100; font-weight: bold;">for account 'oc4jadmin':
Confirm the password:
Starting OC4J ... Done.
To access the OC4J Home Page and change the password go to;">8888/em
Deploying Oracle VM Manager application to OC4J container.
Creating connection pool ... Done
Creating data source ... Done
Deploying application help ... Done
Deploying application ... Done
Please enter the keystore password #00b100; font-weight: bold;">for the Web Service:
Confirm the password:
Setting keystore password #00b100; font-weight: bold;">for Web Service ... Done
#00b100; font-weight: bold;">Do you want to use HTTPS access #00b100; font-weight: bold;">for Oracle VM Manager #66cc66;">(Y|n#66cc66;">)?
Configuring OC4J to use HTTPS ... Done
Stopping OC4J ... Done
Starting OC4J ... Done
Please enter the password #00b100; font-weight: bold;">for the default account 'admin':
Confirm the password:
Configuring SMTP server ...
Please enter the outgoing SMTP mail server#66cc66;">(e.g. -,;">25#66cc66;">): fseudemo01:#cc66cc;">25
Mail server checking, may need some time, please wait ...
Mail server 'fseudemo01:#cc66cc;">25' check failed, enter Y to change the name and retry or N to keep hostname and continue#66cc66;">(Y|n#66cc66;">)?n
Setting the SMTP server to fseudemo01:#cc66cc;">25 ...
Please enter an e-mail address #00b100; font-weight: bold;">for account 'admin': root#33cc33;">@fseudemo01
Confirm the e-mail address : #b100b1; font-weight: bold;">root@fseudemo01
Unable to send an email to 'root#33cc33;">@fseudemo01', would you like to change the email address#66cc66;">(Y|n#66cc66;">)?n
Updating e-mail address #00b100; font-weight: bold;">for account 'admin' to 'root#33cc33;">@fseudemo01' ...
The console feature is #000000; font-weight: bold;">not enabled by default.
#00b100; font-weight: bold;">For detailed setup, refer to Oracle VM Manager User's Guide
Installation of Oracle VM Manager completed successfully.
To access the Oracle VM Manager #cc66cc;">2.2 home page go to:;">4443/OVS
To access the Oracle VM Manager web services WSDL page go to:;">4443/OVSWS/LifecycleService.wsdl;">4443/OVSWS/ResourceService.wsdl;">4443/OVSWS/PluginService.wsdl;">4443/OVSWS/ServerPoolService.wsdl;">4443/OVSWS/VirtualMachineService.wsdl;">4443/OVSWS/AdminService.wsdl
To access the Oracle VM Manager help page go to:;">4443/help/help

This would give me the advantage to control the Oracle VM Server environment remotely instead trying to do this via the bare minimum install of the “dom0″ XEN/Oracle VM domain environment. So the database and listener will bind to “localhost” (and therefore not directly accessible) , but the OVS, Oracle VM Manager part, will bind to the given TCP/IP address as set in the /etc/hosts file (and therefore remotely accessible!).

#66cc66;">[root#33cc33;">@FSEUDEMO01 /#66cc66;">]# cat /etc/hosts
# #00b100; font-weight: bold;">Do #000000; font-weight: bold;">not remove the following line, or various programs
# that require network functionality will fail.               localhost.localdomain localhost           FSEUDEMO01

It took me a while figuring out why I could NOT access the URL. I thought a while that this was maybe due to my alternative installation method or maybe a client machine on this private network that still had been given the address due to me working within the DHCP range. In the end I figured that there would probably a local firewall in place on the bare minimum dom0 domain XEN environment. So I checked first, very roughly, by disabling the firewall via:

service iptables stop

This solved my remote access issue regarding the URL. So I followed up by disabling the firewall by shutting the down the services via:

chkconfig --list iptables
chkconfig --level #cc66cc;">345 iptables off
chkconfig --list iptables
#66cc66;">[root#33cc33;">@FSEUDEMO01 /#66cc66;">]# chkconfig --list iptables
iptables        #cc66cc;">0:off   #cc66cc;">1:off   #cc66cc;">2:on    #cc66cc;">3:on    #cc66cc;">4:on    #cc66cc;">5:on    #cc66cc;">6:off
#66cc66;">[root#33cc33;">@FSEUDEMO01 running_pool#66cc66;">]# chkconfig --level #cc66cc;">345 iptables off
#66cc66;">[root#33cc33;">@FSEUDEMO01 running_pool#66cc66;">]# chkconfig --list iptables
ip6tables       #cc66cc;">0:off   #cc66cc;">1:off   #cc66cc;">2:off   #cc66cc;">3:off   #cc66cc;">4:off   #cc66cc;">5:off   #cc66cc;">6:off

But in the end, I didn’t like that solution as well, so I turned the iptables service on again for rc levels 3,4 and 5, but altered the iptables config file adding an exception for port 4443.

-- vi /etc/sysconfig/iptables
#66cc66;">[root#33cc33;">@FSEUDEMO01 sysconfig#66cc66;">]# cat iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is #000000; font-weight: bold;">not recommended.
:#b100b1; font-weight: bold;">INPUT ACCEPT #66cc66;">[#cc66cc;">0:#cc66cc;">0#66cc66;">]
:#b100b1; font-weight: bold;">FORWARD ACCEPT #66cc66;">[#cc66cc;">0:#cc66cc;">0#66cc66;">]
:#b100b1; font-weight: bold;">OUTPUT ACCEPT #66cc66;">[#cc66cc;">0:#cc66cc;">0#66cc66;">]
:#b100b1; font-weight: bold;">RH-Firewall-#cc66cc;">1-INPUT - #66cc66;">[#cc66cc;">0:#cc66cc;">0#66cc66;">]
-A INPUT -p tcp -m state --state NEW -m tcp --dport #cc66cc;">21 -j DROP
-A INPUT -p tcp -m state --state NEW -m tcp --dport #cc66cc;">80 -j DROP
-A INPUT -j RH-Firewall-#cc66cc;">1-INPUT
-A RH-Firewall-#cc66cc;">1-INPUT -i lo -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p #cc66cc;">50 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p #cc66cc;">51 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p udp --dport #cc66cc;">5353 -d -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p udp -m udp --dport #cc66cc;">631 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -p tcp -m tcp --dport #cc66cc;">631 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">21 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">22 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m udp -p udp --dport #cc66cc;">53 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">53 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">80 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">2049 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">4443 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">5900:#cc66cc;">5950 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">8002 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">8003 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">8899 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -m state --state NEW -m tcp -p tcp --dport #cc66cc;">7777 -j ACCEPT
-A RH-Firewall-#cc66cc;">1-INPUT -j REJECT --reject-with icmp-host-prohibited

Due to the fact that all this software installation stuff is with default settings, you will notice for example via “top” (and/or I installed “nmon”) or the official “xm” statement, that the Domain-0 environment will only have approximately 570 Mb RAM to work with.

#66cc66;">[root#33cc33;">@FSEUDEMO01 REDHAT_5U4_I86_64#66cc66;">]# xm list
Name                                        ID   Mem VCPUs      State   Time#66cc66;">(s#66cc66;">)
Domain-#cc66cc;">0                                     #cc66cc;">0   #cc66cc;">574     #cc66cc;">8     r-----   #cc66cc;">1641.9

This is not enough if you remember that besides the Oracle VM server processes going on, there is now also a OC4J environment AND a Oracle XE database running. The XE database will only consume approx. 150MB but the OC4J environment has set the following for the JVM realm…

#66cc66;">[root#33cc33;">@FSEUDEMO01 /#66cc66;">]# ps -ef|grep jar
root      #cc66cc;">4783  #cc66cc;">4781  #cc66cc;">2 #cc66cc;">19:06 ?        00:03:#cc66cc;">26 /opt/oc4j/java/jdk1.5.0_11/bin/java -XX:PermSize=256m -XX:MaxPermSize=512m -jar /opt/oc4j/j2ee/home/oc4j.jar -config /opt/oc4j/j2ee/home/config/server.xml -userThreads

So if needed, will consume between 256 MB and 512 MB. And if it will need to, will cause the environment start paging memory or (and I had two of those issues…) will cause the environment to become unstable.

So I wanted to give the main Domain-0 (dom0) more initial memory. In this case, always start with 1024 MB instead of those 574 MB initially set during the Oracle VM Server installation. I became aware that the following probably will help changing memory dynamically (searching Google for help) as mentioned in this post/thread, so doing the following on the prompt via root:

#66cc66;">[root#33cc33;">@FSEUDEMO01 REDHAT_5U4_I86_64#66cc66;">]# xm list
Name                                        ID   Mem VCPUs      State   Time#66cc66;">(s#66cc66;">)
Domain-#cc66cc;">0                                     #cc66cc;">0   #cc66cc;">574     #cc66cc;">8     r-----   #cc66cc;">1647.7
#66cc66;">[root#33cc33;">@FSEUDEMO01 REDHAT_5U4_I86_64#66cc66;">]# xm mem-#b1b100; font-weight: bold;">set Domain-#cc66cc;">0 #cc66cc;">1024
#66cc66;">[root#33cc33;">@FSEUDEMO01 REDHAT_5U4_I86_64#66cc66;">]#  xm list
Name                                        ID   Mem VCPUs      State   Time#66cc66;">(s#66cc66;">)
Domain-#cc66cc;">0                                     #cc66cc;">0  #cc66cc;">1024     #cc66cc;">8     r-----   #cc66cc;">1649.0

But after a reboot of the machine this will be reset to the default 574 MB. The “proper” way, or at least how I solved it, is that I noticed that it is a parameter in the menu.lst of the grub bootloader. So I altered the menu.lst, changing all the “574″ in “1024″ (1GB), so as shown in the following values, and hardbooted the physical machine.

#66cc66;">[root#33cc33;">@FSEUDEMO01 grub#66cc66;">]# pwd
#66cc66;">[root#33cc33;">@FSEUDEMO01 grub#66cc66;">]# cat menu.lst
# grub.conf generated by anaconda
# Note that you #00b100; font-weight: bold;">do #000000; font-weight: bold;">not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
#          kernel /vmlinuz-version ro root=/dev/cciss/c0d0p2
#          initrd /initrd-version.img
# Detect64 claims this is #cc66cc;">64 bit box
#b1b100; font-weight: bold;">title Oracle VM Server-ovs #66cc66;">(xen-3.4.0 2.6.18-;">)
        root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
        kernel /xen-32bit.gz dom0_mem=574M
        module /vmlinuz-2.6.18- ro root=UUID=fc4f00d4-c0ce-474d-8d92-f4b986bac645
        module /initrd-2.6.18-
#b1b100; font-weight: bold;">title Oracle VM Server-ovs serial console #66cc66;">(xen-3.4.0 2.6.18-;">)
        root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
        kernel /xen-32bit.gz console=#0000ff; font-weight: bold;">com1,vga #0000ff; font-weight: bold;">com1=#cc66cc;">57600,8n1 dom0_mem=574M
        module /vmlinuz-2.6.18- ro root=UUID=fc4f00d4-c0ce-474d-8d92-f4b986bac645  console=tty0 console=ttyS0,57600n8
        module /initrd-2.6.18-
#b1b100; font-weight: bold;">title Oracle VM Server-ovs #66cc66;">(xen-#cc66cc;">64-3.4.0 2.6.18-;">)
        root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
        kernel /xen-64bit.gz dom0_mem=574M
        module /vmlinuz-2.6.18- ro root=UUID=fc4f00d4-c0ce-474d-8d92-f4b986bac645
        module /initrd-2.6.18-
#b1b100; font-weight: bold;">title Oracle VM Server-ovs serial console #66cc66;">(xen-#cc66cc;">64-3.4.0 2.6.18-;">)
        root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
        kernel /xen-64bit.gz console=#0000ff; font-weight: bold;">com1,vga #0000ff; font-weight: bold;">com1=#cc66cc;">57600,8n1 dom0_mem=574M
        module /vmlinuz-2.6.18- ro root=UUID=fc4f00d4-c0ce-474d-8d92-f4b986bac645  console=tty0 console=ttyS0,57600n8
        module /initrd-2.6.18-
#b1b100; font-weight: bold;">title Oracle VM Server-base #66cc66;">(2.6.18-;">)
        root #66cc66;">(hd0,#cc66cc;">0#66cc66;">)
        kernel /vmlinuz-2.6.18- ro root=UUID=fc4f00d4-c0ce-474d-8d92-f4b986bac645
        initrd /initrd-2.6.18-

You now got a (hopefully) stable environment (after this moment I at least didn’t have any strange issues anymore) as well…

Fiddling around during the weekend

Before I did this last part (setting the 1 GB RAM memory), I fiddled around a bit. I downloaded some completely prepped Oracle Virtual Machines Templates via So, in my case they wanted a database server and a application server. I was to lazy to do the “JBoss 4.0.3 GA” bit, if not only it was my weekend after all and this version is old…very old…. It would probably have been easier to download a WebLogic Oracle VM Template and install that one (and more stable…?) than install all those jar’s and old Java JDK’s from scratch. I hoped that the with the machines delivered RedHat 5.4 EL software would have had JBoss install option, but alas… Despite this an Oracle VM setup or other virtualization environment will bring me the flexibility to switch / act very quickly on changes in demand regarding server specs.

Anyway, I downloaded a…

  • Oracle Enterprise Linux 5.4 64 bit Oracle VM Template (4 GB root volume
  • Oracle Enterprise Linux 5.2 64 bit, including a Oracle EE database, Oracle VM Template
  • Oracle Enterprise Linux 5.2 64 bit Oracle VM Template (10 GB root volume)
  • Oracle Enterprise Linux 5.2 64 bit Oracle VM Template Builder (4 GB root volume)

…to play around with. After downloading those Oracle VM Templates, you will have to place them in the following “seed_pool” directory, after you have unzipped them and created the new directory under the “seed_pool” directory via, for example: “tar xzf OVM_EL5U2_X86_64_ORACLE10G_PVM.tgz”:

#66cc66;">[root#33cc33;">@FSEUDEMO01 OVS#66cc66;">]# ls -l
total #cc66cc;">0
drwxrwxrwx #cc66cc;">3 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">14:02 iso_pool
drwxr-xr-x #cc66cc;">2 root root #cc66cc;">3896 Dec #cc66cc;">13 02:#cc66cc;">52 lost+found
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Dec #cc66cc;">13 03:00 publish_pool
drwxrwxrwx #cc66cc;">7 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">21:#cc66cc;">59 running_pool
drwxrwxrwx #cc66cc;">7 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">17:#cc66cc;">15 seed_pool
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Dec #cc66cc;">13 03:00 sharedDisk
#66cc66;">[root#33cc33;">@FSEUDEMO01 OVS#66cc66;">]# #b1b100; font-weight: bold;">cd seed_pool
#66cc66;">[root#33cc33;">@FSEUDEMO01 seed_pool#66cc66;">]# ls -l
total #cc66cc;">0
drwxr-xr-x #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">4 #cc66cc;">18:#cc66cc;">53 OVM_EL5U2_X86_64_ORACLE10G_PVM
drwxr-xr-x #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 01:#cc66cc;">23 OVM_EL5U2_X86_64_PVM_10GB
drwxr-xr-x #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">4 #cc66cc;">22:#cc66cc;">36 OVM_EL5U2_X86_64_TMPLBUILDER_PVM
drwxr-xr-x #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">4 #cc66cc;">18:#cc66cc;">53 OVM_EL5U4_X86_64_PVM_4GB
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">17:#cc66cc;">21 REDHAT_5U4_I86_64

After you have created those templates via unzipping and untaring them, they can be discovered in the resources page and after they have been discovered and approved. The “approved” part has to be done by an privileged user, because there is a security/functional distinction between “users” and “managers” and “administrator” (the role the default “admin” user has).

See the Oracle VM Manuals via:

or the “help” function in your Oracle VM Manager GUI webpages…

Be aware that if you create Virtual Machines from those templates, that some of them will ask during their virtual startup routine for interactive input about for example: DHCP setting yes|no, hostname, oracle default database passwords, etc. Click on the “CONSOLE” menu while pre-selecting the correct just started new virtual machine OR download VNCVIEWER via this link here. In my case I set the database machine on a fixed IP ( and the application server environment as well ( I left those two fast setup RedHat machines based on DHCP so it will be easy for the guys who start working with this environment to have at least a Linux desktop. I still have to check what I can do with that Oracle VM Template Builder (but maybe that’s for the next weekend – “what do you mean with I am nuts” – 8-) ). The next picture shows an overview of the current setup.

Click on the picture to enlarge

By the way you can see which machines are in the air and with what properties via the “xm” command on the root shell.

#66cc66;">[root#33cc33;">@FSEUDEMO01 seed_pool#66cc66;">]# xm list
Name                                        ID   Mem VCPUs      State   Time#66cc66;">(s#66cc66;">)
#cc66cc;">70_FSDEMO_DBS_01                             #cc66cc;">2  #cc66cc;">1024     #cc66cc;">2     -b----     #cc66cc;">59.2
#cc66cc;">90_FSDEMO_APS_01                             #cc66cc;">1  #cc66cc;">2048     #cc66cc;">4     -b----     #cc66cc;">33.2
Domain-#cc66cc;">0                                     #cc66cc;">0  #cc66cc;">1024     #cc66cc;">8     r-----   #cc66cc;">1528.9
#66cc66;">[root#33cc33;">@FSEUDEMO01 seed_pool#66cc66;">]# xm top
xentop - #cc66cc;">23:#cc66cc;">27:09   Xen 3.4.0
#cc66cc;">3 domains: #cc66cc;">1 running, #cc66cc;">2 blocked, #cc66cc;">0 paused, #cc66cc;">0 crashed, #cc66cc;">0 dying, #cc66cc;">0 shutdown
Mem: 8378168k total, 4296048k used, 4082120k free    CPUs: #cc66cc;">8 #33cc33;">@ 2000MHz
      NAME  STATE   CPU#66cc66;">(sec#66cc66;">) CPU#66cc66;">(#33cc33;">%#448888;">#66cc66;">)     MEM#66cc66;">(k#66cc66;">) MEM#66cc66;">(#33cc33;">%#66cc66;">)  MAXMEM#66cc66;">(k#66cc66;">) MAXMEM#66cc66;">(#33cc33;">%#66cc66;">) VCPUS NETS NETTX#66cc66;">(k#66cc66;">) NETRX#66cc66;">(k#66cc66;">) VBDS   VBD_OO   VBD_RD   VBD_WR SSID
#cc66cc;">70_FSDEMO_ --b---         #cc66cc;">59    #cc66cc;">0.0    #cc66cc;">1048576   #cc66cc;">12.5    #cc66cc;">1048576      #cc66cc;">12.5     #cc66cc;">2    #cc66cc;">1     #cc66cc;">2535     #cc66cc;">2150    #cc66cc;">2        #cc66cc;">0    #cc66cc;">24946    #cc66cc;">43500    #cc66cc;">0
#cc66cc;">90_FSDEMO_ --b---         #cc66cc;">33    #cc66cc;">0.0    #cc66cc;">2097152   #cc66cc;">25.0    #cc66cc;">2097152      #cc66cc;">25.0     #cc66cc;">4    #cc66cc;">1        #cc66cc;">8     #cc66cc;">1128    #cc66cc;">1        #cc66cc;">0    #cc66cc;">14010     #cc66cc;">4514    #cc66cc;">0
  Domain-#cc66cc;">0 -----r       #cc66cc;">1534    #cc66cc;">0.0    #cc66cc;">1048576   #cc66cc;">12.5   no limit       n/a     #cc66cc;">8    #cc66cc;">0        #cc66cc;">0        #cc66cc;">0    #cc66cc;">0        #cc66cc;">0        #cc66cc;">0        #cc66cc;">0    #cc66cc;">0

The Real Hacking…

While the 1025 MB wasn’t set yet for the “Domain-0″ or “dom0″ environment, it happened twice that the server rebooted without (for now) visible cause. Probably due to taking to much memory by the OC4J Java realm (remember initially I had only approx. 500 MB to work with in this part of the virtual environment). These reboots happened during the creation of virtual machines. Those virtual machines are normally created in the /OVS/running_pool directory.

#66cc66;">[root#33cc33;">@FSEUDEMO01 OVS#66cc66;">]# #b1b100; font-weight: bold;">cd running_pool
#66cc66;">[root#33cc33;">@FSEUDEMO01 running_pool#66cc66;">]# ls -l
total #cc66cc;">0
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">17:#cc66cc;">20 #cc66cc;">130_FSUTILVM
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">21:#cc66cc;">58 #cc66cc;">256_FS-REDHAT-APPS01
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">23:#cc66cc;">19 #cc66cc;">258_FS-REDHAT-DB01
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">19:#cc66cc;">20 #cc66cc;">70_FSDEMO_DBS_01
drwxrwxrwx #cc66cc;">2 root root #cc66cc;">3896 Apr  #cc66cc;">5 #cc66cc;">19:#cc66cc;">20 #cc66cc;">90_FSDEMO_APS_01
#66cc66;">[root#33cc33;">@FSEUDEMO01 running_pool#66cc66;">]# pwd
#66cc66;">[root#33cc33;">@FSEUDEMO01 running_pool#66cc66;">]# ls *
data.img  README  System.img  vm.cfg  vm.cfg.orig
System.img  vm.cfg  vm.cfg.orig
System.img  vm.cfg  vm.cfg.orig
oracle10g_x86_64_asm.img  README  System.img  vm.cfg  vm.cfg.orig
README  System.img  vm.cfg  vm.cfg.orig

In you Oracle VM Manager overview page you will see a virtual machine create status on “Creating” or such and it can’t be deleted if you try. You are only allowed to delete such a create failure if it is, for example, in a steady state like “Powered Down”. The first time I managed to drop such a machine, and afterwards tried again, by copying the missing files from a different directory in that /OVS/running_pool into the directory that had the “corrupted” content. Most of the time the last bits, the “vm.cfg” and”vm.cfg.orig” are missing. The file contain the startup and other needed settings for that specific virtual machine.

#66cc66;">[root#33cc33;">@FSEUDEMO01 #cc66cc;">90_FSDEMO_APS_01#66cc66;">]# pwd
#66cc66;">[root#33cc33;">@FSEUDEMO01 #cc66cc;">90_FSDEMO_APS_01#66cc66;">]# cat vm.cfg
bootloader = '/usr/bin/pygrub'
disk = #66cc66;">['file:/var/ovs/mount/0082E50C753D4AA2BB38DC274837DE01/running_pool/#cc66cc;">90_FSDEMO_APS_01/System.img,xvda,w'#66cc66;">]
maxmem = #cc66cc;">2048
memory = #cc66cc;">2048
name = '#cc66cc;">90_FSDEMO_APS_01'
on_crash = 'restart'
on_reboot = 'restart'
uuid = '3cd09034-68cb-#cc66cc;">4111-92a4-a04f776d8a21'
vcpus = #cc66cc;">4
vfb = #66cc66;">['type=vnc,vncunused=#cc66cc;">1,vnclisten=,vncpasswd=admin4fs'#66cc66;">]
vif = #66cc66;">['bridge=xenbr0,mac=00:#cc66cc;">16:3E:#cc66cc;">10:#cc66cc;">88:2E,type=netfront'#66cc66;">]
vif_other_config = #66cc66;">[#66cc66;">]
#66cc66;">[root#33cc33;">@FSEUDEMO01 #cc66cc;">90_FSDEMO_APS_01#66cc66;">]# cat vm.cfg.orig
bootloader = '/usr/bin/pygrub'
disk = #66cc66;">['file:/var/ovs/mount/0082E50C753D4AA2BB38DC274837DE01/running_pool/#cc66cc;">90_FSDEMO_APS_01/System.img,xvda,w'#66cc66;">]
maxmem = #cc66cc;">2048
memory = #cc66cc;">2048
name = '#cc66cc;">90_FSDEMO_APS_01'
on_crash = 'restart'
on_reboot = 'restart'
uuid = '3cd09034-68cb-#cc66cc;">4111-92a4-a04f776d8a21'
vcpus = #cc66cc;">4
vfb = #66cc66;">['type=vnc,vncunused=#cc66cc;">1,vnclisten=,vncpasswd=admin4fs'#66cc66;">]
vif = #66cc66;">['bridge=xenbr0,mac=00:#cc66cc;">16:3E:#cc66cc;">10:#cc66cc;">88:2E,type=netfront'#66cc66;">]
vif_other_config = #66cc66;">[#66cc66;">]

Replacing the “90_FSDEMO_APS_01″ with the name of the corrupted virtual machine attempt, was good enough to get the Oracle VM Manager to believe that the machine was in “Powered Off” instead of “Creating” state, giving me the opportunity to drop the corrupted create attempt via the Web UI of the Oracle VM Manager. But once it wasn’t…

The more aggressive hack was the following.

I logged in via the oracle linux user via “su – oracle” on the “Domain-0″ Oracle VM Server linux shell. I correctly set my database environment for Oracle XE as follows:

#66cc66;">[root#33cc33;">@FSEUDEMO01 /#66cc66;">]# su - oracle
-bash-#cc66cc;">3.2$ cat
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server;
-bash-#cc66cc;">3.2$ . ./
-bash-#cc66cc;">3.2$ sqlplus /nolog
SQL*Plus: Release - Production on Mon Apr #cc66cc;">5 #cc66cc;">23:#cc66cc;">49:07 #cc66cc;">2010
Copyright #66cc66;">(c#66cc66;">) #cc66cc;">1982, #cc66cc;">2005, Oracle.  All rights reserved.
SQL> connect OVS
Enter password:
SQL> col img_name #00b100; font-weight: bold;">for a50
SQL> col status #00b100; font-weight: bold;">for a15
SQL> select img_name, status, img_id from OVS_VM_IMG
IMG_NAME                                           STATUS              IMG_ID
-------------------------------------------------- --------------- ----------
OVM_EL5U4_X86_64_PVM_4GB                           Active                  #cc66cc;">10
OVM_EL5U2_X86_64_ORACLE10G_PVM                     Active                  #cc66cc;">30
FSDEMO_APS_02                                      Creating               #cc66cc;">190
FSDEMO_DBS_01                                      Powered Off             #cc66cc;">70
OVM_EL5U2_X86_64_TMPLBUILDER_PVM                   Active                 #cc66cc;">110
FSUTILVM                                           Powered Off            #cc66cc;">130
OVM_EL5U2_X86_64_PVM_10GB                          Active                 #cc66cc;">150
FSDEMO_APS_01                                      Powered Off             #cc66cc;">90
#cc66cc;">8 rows selected.
SQL> update OVS_VM_IMG
  #cc66cc;">2  #b1b100; font-weight: bold;">set #448844;">STATUS='Powered Off'
  #cc66cc;">3  where IMG_ID=#cc66cc;">190
  #cc66cc;">4  ;
#cc66cc;">1 row updated.
SQL> commit;
Commit complete.

So updating the Oracle XE environment, including “faking” the correct directory content in /OVS/running_pool/190_FSDEMO_APS_02, made my Oracle VM Manager believe that the status was now in “Powered Off” status and allowed me to correctly drop (and probably correctly update the OVS Oracle XE tables) the directory from disk…

In short…

It was very easy to setup this environment on a single box and I am impressed with the proper/decent configuration that Oracle put into it regarding all the dummy proof scripting to set such an environment up and deploy it. Hereby an enhancement request to also make the “console” plugin automatically downloadable or installable instead of downloading it via the site. A workaround or a decent solution for Windows Explorer would also be appreciated, although VNCViewer works in most cases (but you get really lazy if everything works this easy – or is it just me).

In a setup like this one, you should probably shutdown the Oracle VM Manager environment if you don’t need it anymore. For instance I created small executable scripts like:

#66cc66;">[root#33cc33;">@FSEUDEMO01 ~#66cc66;">]# cat
# service iptables stop
service oc4j stop
service oracle-xe stop
service oracle-xe start
service oc4j start
#66cc66;">[root#33cc33;">@FSEUDEMO01 ~#66cc66;">]# cat
# service iptables start
service oc4j stop
service oracle-xe stop

Another good practice in my setup would be creating a RMAN script (after putting the Oracle XE environment in archivelog mode), executed via the “cron” deamon (“crontab”), that would backup, on a regular basis, the database to a safe location.

In all this exercise was very easy and now I don’t wonder anymore why the manuals contain not that much info. In principle there isn’t that much to tell or explain…



Advert/Rant: Michigan Oak Table Symposium Early Bird Registration

The agenda for the Michigan Oak Table Symposium is online now and looking at it brings to mind a couple of pub discussions I've had
lately with those who have never attended a conference and can't see the
benefits as well as those who have thought about it and wondered what it's like.
I reckon MOTS would be a great introduction to the best that conferences have to
offer ...

Condensed technical learning format.

It's not a course.

Although I know that would be a big plus to many people I know who despair at spending 5 days out of the office for half a day's worth of new stuff they learn, I still think there's a place for courses, reading books and learning stuff properly rather than just trawling around Google or asking questions on Twitter and making it up as you go along. However, if you've already learnt some stuff properly, then a conference is a great way to pick up a few salient points that you might not come across otherwise and then dig around properly yourself when you get back home or to the office. The fact that this particular conference requires only two days of your time is a bonus (but I'll come back to that below ...)

Networking / Interaction

It might not be obvious these days, but in the past I could think of nothing worse than 'Networking', believe me! Friends would tell you I can still do a neat disappearing act ;-) But whether it's conversations at work, online, or at conferences, if you never discuss anything with like-minded people, how will your knowledge grow? Even attending presentations and deciding they weren't very good is an interesting experience and, should that happen to you, it might inspire you to participate to make things better! One thing's sure in my mind ... I never thought I'd say this, but participating has had a positive effect on me I couldn't imagine.

The great thing about MOTS, like Hotsos and the Miracle events, is that with 300 attendees, you're guaranteed lots of interaction with smart attendees and presenters.


This one is extremely important to me at the moment. Someone said to me recently they could understand how conferences might work better for me because I know 'the crowd' or something similar. I've blogged plenty of times in the past about my aversion to elitism (wish I could be bothered digging out some links!) and it worries me that people might not want to 'join in' because there's some exclusive club with a bouncer at the door. So, let's get this straight.

There probably is a crowd of people who attend conferences and know each other. There's an Oak Table Network, the Oracle ACEs, the UKOUG and Hotsos hard-core massive, etc, etc, etc. However, every single one of those groups is populated by people who turned up at a conference the first time by themselves, mostly pretended they were wall-paper (I'm sure there are exceptions ;-)) and gradually got to know a few faces, picked their own mates and bumped into them again the next time and had fun. It's been one of the surprises of my life that I've made a bunch of new, proper friends by attending a couple of conferences.

Current Information

Could you get this stuff via blogs? Yes, probably,
but are you really taking the time to read all those posts, or are they tucked
away to be read at a later date that never quite arrives?

Anyone who has attended an external training event knows the value of getting away from the desk and the mail and the phone for a couple of days and just focussing on technical stuff. We are still working in a technical field, aren't we?

Oops! This turned into more of a rant than I planned ;-) So, what's my point?

The Early Registration rate is $450 which is £300
or 335 Euro. Let me see. How much do Oracle tend to charge for a 2-day course
with yours truly? About 1500 Euro or something like that? (Tread carefully, Doug, you do want to work for Oracle University again! LOL) OK, you probably need to invest 3 days
holiday on MOTS if you're travelling from outside the US and your employed won't spring for it but, why not give it a try? If you try it once and absolutely hate it, then fair enough, but I keep encouraging people to go to conferences, they go and then they have a great time and learn something too. They feel inspired again.

My point is ... just come along. It's 2 days of your life spent with a couple of hundred other people who are just like you. Actually, that's a lie. There might only be 6 people who are like you, but in that case, I bet you'd struggle to find even 6 somewhere else! LOL. Conferences are the real reason I know Kurt, Marco, Alex, Carol, Lisa, Graham, Jonathan ... (blah, blah, blah ... it could go on forever and I wish I hadn't started a list!)

Look - here's the registration link. Your call. I tried ;-)

Do you know what I'd really like next? I rarely beg for comments (which I find irritating) but to add weight to my possibly biased voice, if anyone who has attended a conference recently has found it better or worse than expected, maybe your voice would be more important than mine here?

P.S. At least it got me out of Part 6 of the Stats blogs ;-) (Although I know one or two people in the office who'll be looking for an apology, having been lead up the garden path on this one!)

P.P.S. Private message for Raj ... It's 2 days! It has a speaker list not dissimilar to Hotsos! You could fly on Wed night and still be back with your family on Friday night! We could have beer. I'm sure your employer would be amenable to this educational opportunity
or I could create a fuss on your behalf! LOL

P.P.P.S. Yeah, I know ... Stats Part 6. Really, I know. It's coming ...