zondag, november 01, 2009

oraenv oddities in 11gR2

Recently I was installing a regular 11gR2 installation and tried to use it by an other user than the software owner or a member of the dba group. A - so called - regular user.


When I ran oraenv to configure my environment for the ORACLE_SID I was going to use I was told that


ORACLE_BASE environment variable is not being set since this
information is not available for the current user ID ciber
You can set ORACLE_BASE manually if it is required.

This made me wonder why so I dived in the /usr/local/bin/oraenv script and found:

ORABASE_EXEC=$ORACLE_HOME/bin/orabase

if [ ${ORACLE_BASE:-"x"} != "x" ]; then
echo "The Oracle base for ORACLE_HOME=$ORACLE_HOME is $ORACLE_BASE"
else
if [ -w $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml ]; then
if [ -e $ORABASE_EXEC ] ; then
if [ -x $ORABASE_EXEC ]; then
ORACLE_BASE=`$ORABASE_EXEC`
export ORACLE_BASE
echo "The Oracle base for ORACLE_HOME=$ORACLE_HOME is $ORACLE_BASE"
else
echo "The $ORACLE_HOME/bin/orabase binary does not have execute privilege"
echo "for the current user, $USER. Rerun the script after changing"
echo "the permission of the mentioned executable."
fi
else
ORACLE_BASE=$ORACLE_HOME
export ORACLE_BASE
echo "The Oracle base for ORACLE_HOME=$ORACLE_HOME is $ORACLE_BASE"
fi
else
echo "ORACLE_BASE environment variable is not being set since this"
echo "information is not available for the current user ID $USER."
echo "You can set ORACLE_BASE manually if it is required."
fi
fi


What this code does is
1) check ORACLE_BASE
2) if set => all ok and report ORACLE_BASE
3) else, check if $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml is WRITEABLE and try to set ORACLE_BASE using $ORACLE_HOME/bin/orabase.


I made a little tweek on this script, to check for READABLE on $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml. Why would we give an ordinary user write privileges on anything within ORACLE_HOME? ([in]Secure by default?).


Still I keep getting this error:


ORACLE_BASE environment variable is not being set since this
information is not available for the current user ID ciber.
You can set ORACLE_BASE manually if it is required.

So when the script is no longer the culprit, the filesystem security bits have to be it. In unix, to be able to access a file, all directories that we have to pass through need to have at least execute permission for me to pass. The fresh created app directory (/home/oracle/app) has 770 so I won't be able to pass this one.

chmod o+x app

to fix that but still I am getting the same error. When digging deeper I get to $ORACLE_HOME/inventory that also has 770 defined on it. Here again:

chmod o+x $ORACLE_HOME/inventory

Now it is the ContentsXML directory that is blocking me, it again has 770.

chmod o+x $ORACLE_HOME/inventory/ContentsXML

Finally we get to the oraclehomeproperties.xml file, this has 660 for the permisssion bits. To fix this

chmod o+r $ORACLE_HOME/inventory/ContentsXML/oraclehomeproperties.xml

Finally oraenv does no longer complain.


If it is important enough to give an error message when running oraenv, why make this file inaccessible to other users? BTW: my previous post was more or less caused by figuring out this setup. I thought I made an error so I wanted to re-install the ORACLE_HOME, just to make sure that what I write is right.

more deinstall headaches

Today I needed to re-install an ORACLE_HOME. Why? I have my reasons so let me do it. In the old days we ran $ORACLE_HOME/oui/runInstaller and selected deinstall product to get rid of the software. Now, 11gR2 (11.2.0.1) the only reaction is a popup box telling me to run $ORACLE_HOME/deinstall/deinstall to deinstall the ORACLE_HOME.


The specified ORACLE_HOME is used for a database, a database that I did not want to loose. Instead of just do what I ask, deinstall the specified ORACLE_HOME, I get a huge list of questions and end up with a system that no longer has the ORACLE_HOME on it (even the directory is deleted), but also a system that no longer has the database files on it. This came as a big surprise and not one that I liked.


Why should Oracle delete my database? There is no reason for that. If I want to delete a database, I will do so. If I deinstall an ORACLE_HOME, I expect the ORACLE_HOME to be deinstalled. I can live with the fact that ORACLE_HOME is deleted, I can not live with the fact that during this deinstallation also my database, not living in ORACLE_HOME, is deleted.


Please Oracle, give me back a normal deinstall and leave my databases alive. If I start $ORACLE_HOME/deinstall/deinstall, als are you sure, once, and deinstall the ORACLE_HOME, not the rest. In this case I was going to install the software again and bring up my database again using the fresh installation.


Tip for other dba's: test the deinstall process before you try it on a production system .... It does deinstall but not as we expect it ...

zaterdag, oktober 31, 2009

Oracle Scheduler in 11gR2 - p2 schagent

In the previous post about Oracle Scheduler in 11gR2 I already mentioned that the Scheduler Agent now is part of the client installation. Here we will see how to install it.

The Installation


The installation is straight forward, download the client installer, unzip it and navigate to the client directory, where you will find the runInstaller, as usual. Start the installer

./runInstaller

, select the custom installation.schagent01.png and proceed to the next page to choose the desired language. In the next page specify the ORACLE_HOME location of your choice.schagent02.png and proceed to the next page schagent03.png where you can select the tool to install, in this case the Scheduler Agent.schagent04.png Here you specify the current hostname and a port number. Don't worry, they only appear in the $ORACLE_HOME/schagent.conf and can easily be changed afterwards.schagent05.png In the summary screen hit Finish to start the actual installation.schagent06.png After a while the request to run the root.sh pops up, as usual.schagent07.png Run the root.sh, connected as root and the installation is ready.

Configuration


The configuration of the agent as described in my book remains valid. There just are a few new items in the schagent.conf to tweek.

get/put file


Using DISABLE_PUT_FILE we can make the agent to reject put_file requests and with DISABLE_GET_FILE we can also make the agent to reject get_file requests.

job execution


Surprisingly we can also make the agent reject job executions using the DISABLE_JOB_EXECUTION flag. This may look add for a Job Scheduler Agent but it is not. It could very well be that the Schagent in question is to be used as a FileWatcher only.

secure database


In 11gR1 only the credentials were exchanged encrypted. With the SECURE_DATABASES_ONLY flag, the agent only accepts only registered databases and also transmits the job executions results encrypted. This requires a 11gR2 database to be able to use it.

Default Database


The Remote Scheduler Agent now can also be used to run pl/sql jobs on a remote database. Remote, as seen from the database that sends the job to the agent. For the agent this database will be a local database for which ORACLE_SID and ORACLE_HOME can be used. For a job that contains no connect info, the default database will be used.

finalizing


This brand new agent again shows that Oracle is working hard to make their Oracle Scheduler the best Job Scheduler of the planet. In a later post I will show how to use the new options of the Oracle Scheduler Agent.

Ronald.

zaterdag, oktober 24, 2009

de-installation surprises

There are lots of stories on the web about how to do an oracle installation. For de-installations there a not so many notes around. Until oracle 10g life was fairly simple, you could just run de oui from $ORACLE_HOME/oui/bin/runInstaller, select the ORACLE_HOME to de-install, wait for the process to complete and remove the ORACLE_HOME directory from the filesystem.


10gR2


Then came oracle 10gR2, with a little surprise, it not only de-installed the requesten ORACLE_HOME as an extra 'service' for customers, it also removed the SQL*net files, sqlnet.ora, tnsnames.ora and listener.ora. If you happen to use the files from the ORACLE_HOME/network/admin/ location, you would have thrown them away any way so that would not be a big deal. However, if you have them in a location specified by TNS_ADMIN, or in one of the other default locations like /etc/ or /var/opt/oracle/, they are removed from there also. Sometimes this might be ok but in a case where you have multiple ORACLE_HOMES for multiple Oracle databases this certainly is not what you would have wanted.


In order to prevent the unwanted removal of the SQL*net files, we can force the installer to only visit the location pointed to by TNS_ADMIN. What I do in this case is:



export TNS_ADMIN=$ORACLE_HOME/network/admin
$ORACLE_HOME/oui/bin/runInstaller

and remove the ORACLE_HOME. Now the installer only removes the SQL*net files from the ORACLE_HOME/network/admin that you were to remove any way so that is no big deal.

11gR2


Release 11g has even more surprises in it's sleeve, it also removes the oratab file. For this I did not - yet - find a solution. I don't like this. This removal comes from one of the root scripts that we need to run to complete the task, in the case of removing the clusterware installation, so we could adjust those scripts not to do this but I really wonder why Oracle thinks to help the customers this way. This is not the help that I think customers need. It would be OK if we were given a choice, remote the administration files, or not. Removing the bluntly as they do now .... No, please don't.

dinsdag, oktober 13, 2009

OOW 2009

For me this is the first Oracle Open World I visited. It is great. The scale is enormous. There are lots of very interesting presentations and demos. I have been visiting a few, targeted to BI and rdbms in general. The exadata database machine is a very interesting piece of machinery.


Between all the oracle celebrities I have been presenting at an unconference session and I was lucky to see that someone showed up. Thanks Ravi. I have shown the current client server - multi platform - tools that have Oracle Scheduler support in it.


Colin has made great progres implementing the oracle 11 features and a very nice graphical representation of Job Chains. It is not ready for production but it does show where he is heading to and that is good enough for a quick demonstration.


More exitement to come ...


tuesday


Today was the publishers event. A whole list of oracle product managers showed up to share their plans with us and tell about their ideas for new titles. After that it was my turn to sign books for who wanted. I filled the rest of the day with interesting sessions in the unconference about protecting confidential data and cluster services.


There was plenty of room to chat with lots of people that I now got to meet in real life, some of who I had contacts starting years ago.


During the blogger meeting I met the - what I think are - most interesting people in our oracle universe and spoke with a lot of them.


During this day I found out that the phrase 'sunny Californie' must be a joke. The weather was terrific, lots of rain and no sun to be seen anywhere. A short visit to an Irish Pub completed the day.

vrijdag, september 25, 2009

job_queue_processes and dbms_scheduler

This parameter has some history:

from the reference manual



v8.1.7:


Parameter class:

Dynamic. Scope = ALTER SYSTEM.

Default value:

0

Range of values:

0 to 36

Oracle Parallel Server:

Multiple instances can have different values.

JOB_QUEUE_PROCESSES is relevant in replication environments. It specifies the number of SNPn job queue processes per instance (SNP0, ... SNP9, SNPA, ... SNPZ). Job queue processes process requests created by DBMS_JOB.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


9iR2:

Parameter type

Integer

Default value

0

Parameter class

Dynamic: ALTER SYSTEM

Range of values

0 to 1000

Real Application Clusters

Multiple instances can have different values.

JOB_QUEUE_PROCESSES specifies the maximum number of processes that can be created for the execution of jobs. It specifies the number of job queue processes per instance (J000, ... J999). Replication uses job queues for data refreshes. Advanced queuing uses job queues for message propagation. You can create user job requests through the DBMS_JOB package.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


10gR1:

Parameter type Integer
Default value 0
Modifiable ALTER SYSTEM
Range of values 0 to 1000
Basic Yes
Real Application Clusters Multiple instances can have different values.

JOB_QUEUE_PROCESSES specifies the maximum number of processes that can be created for the execution of jobs. It specifies the number of job queue processes per instance (J000, ... J999). Replication uses job queues for data refreshes. Advanced queuing uses job queues for message propagation. You can create user job requests through the DBMS_JOB package.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


10gR2:

Parameter type Integer
Default value 0
Modifiable ALTER SYSTEM
Range of values 0 to 1000
Basic Yes
Real Application Clusters Multiple instances can have different values.

JOB_QUEUE_PROCESSES specifies the maximum number of processes that can be created for the execution of jobs. It specifies the number of job queue processes per instance (J000, ... J999). Replication uses job queues for data refreshes. Advanced queuing uses job queues for message propagation. You can create user job requests through the DBMS_JOB package.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


11gR1:

Parameter type Integer
Default value 1000
Modifiable ALTER SYSTEM
Range of values 0 to 1000
Basic Yes
Real Application Clusters Multiple instances can have different values.

JOB_QUEUE_PROCESSES specifies the maximum number of processes that can be created for the execution of jobs. It specifies the number of job queue processes per instance (J000, ... J999). Replication uses job queues for data refreshes. Advanced queuing uses job queues for message propagation. You can create user job requests through the DBMS_JOB package.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


11gR2:

Parameter type Integer
Default value 1000
Modifiable ALTER SYSTEM
Range of values 0 to 1000
Basic Yes
Oracle RAC Multiple instances can have different values.

JOB_QUEUE_PROCESSES specifies the maximum number of processes that can be created for the execution of jobs. It specifies the number of job queue processes per instance (J000, ... J999). Replication uses job queues for data refreshes. Advanced queuing uses job queues for message propagation. You can create user job requests through the DBMS_JOB package.

Some job queue requests are created automatically. An example is refresh support for materialized views. If you wish to have your materialized views updated automatically, you must set JOB_QUEUE_PROCESSES to a value of one or higher.


observations


This was just looking at the job_queue_processes parameter in the various reference guides. Not much differences, other than a variation in the values it default has and maximally can have. The surprise is what else it is controlling. We all know that the way we can control the maximum number of concurrent jobs by setting the session pool in the resource groups where the jobs are running in. We could also limit the max number of job slave processes by setting this parameter it the scheduler global attributes level.


surprisingly, in the different release of oracle that have the Oracle Scheduler implemented (starting with 10gR1) there are some relations to be found with the job_queue_processes parameter. Oracle documentation is very vague on this point with phrases to be found like 'the job_queue_processes has no effect on the dbms_scheduler jobs' varying to 'the job_queue_processes has some impact on the dbms_scheduler jobs'.


And now comes 11.2.0.1 where job_queue_processes = 0 prevents all scheduled jobs to run... I can't tell if this is intentionally but surprising, or must I say disappointing it is. In earlier releases it is mentioned that setting job_queue_processes simply disables the outdated dbms_jobs jobs and has no influence on dbms_scheduler jobs. When working on issues is became clear that in 10gR2 and 11gR1 this parameter has effect and setting it to a low value will cause jobs to stop being started.


I really hope that Oracle is going to fix this unexpected, undocumented and unwanted relation between job_queue_processes and dbms_scheduler jobs. It is a bit confusing the way it now is.

The administrators guide


10gR1


Here the story is very clear: states:
Using DBMS_SCHEDULER and DBMS_JOB at the Same Time

Even though Oracle recommends you switch from DBMS_JOB to DBMS_SCHEDULER, DBMS_JOB is still supported for backward compatibility. Both Scheduler packages share the same job coordinator, but DBMS_JOB does not have the auto start and stop functionality. Instead, the job coordinator is controlled by the JOB_QUEUE_PROCESSES initialization parameter. When JOB_QUEUE_PROCESSES is set to 0, the coordinator is turned off and when it has a non-zero value it is turned on.The JOB_QUEUE_PROCESSES initialization parameter is only used for DBMS_JOB. When this parameter is set to a non-zero value, auto start and stop no longer apply because the coordinator will always be up and running. In this case, the coordinator will take care of execution of both DBMS_SCHEDULER and DBMS_JOB jobs.

If the initialization parameter is set to 0, or if it is not set at all, no DBMS_JOB jobs will be run, however, the auto start and stop feature will be used for all DBMS_SCHEDULER jobs and windows. If there is a DBMS_SCHEDULER job to be executed, the coordinator will be started and the job will be executed. However, DBMS_JOB jobs still will not be run.

10gR2


The same for 10gR2 release :
Using DBMS_SCHEDULER and DBMS_JOB at the Same Time

Even though Oracle recommends you switch from DBMS_JOB to DBMS_SCHEDULER, DBMS_JOB is still supported for backward compatibility. Both Scheduler packages share the same job coordinator, but DBMS_JOB does not have the auto start and stop functionality. Instead, the job coordinator is controlled by the JOB_QUEUE_PROCESSES initialization parameter. When JOB_QUEUE_PROCESSES is set to 0, the coordinator is turned off and when it has a non-zero value it is turned on.The JOB_QUEUE_PROCESSES initialization parameter is only used for DBMS_JOB. When this parameter is set to a non-zero value, auto start and stop no longer apply because the coordinator will always be up and running. In this case, the coordinator will take care of execution of both DBMS_SCHEDULER and DBMS_JOB jobs.

If the initialization parameter is set to 0, or if it is not set at all, no DBMS_JOB jobs will be run, however, the auto start and stop feature will be used for all DBMS_SCHEDULER jobs and windows. If there is a DBMS_SCHEDULER job to be executed, the coordinator will be started and the job will be executed. However, DBMS_JOB jobs still will not be run.

and the following tells about the same:
Scheduler Attribute max_job_slave_processes

The initialization parameter JOB_QUEUE_PROCESSES only applies to DBMS_JOB. When DBMS_SCHEDULER is used, the coordinator will automatically determine how many job slaves to start based on CPU load and the number of outstanding jobs. In special scenarios a dba can still limit the maximum number of slaves to be started by the coordinator by setting the MAX_JOB_SLAVE_PROCESSES with the DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE procedure.

11gR1


The text gets a little more confusing but again tells about the same :
Using Both DBMS_JOB and Oracle Scheduler

DBMS_JOB and Oracle Scheduler (the Scheduler) use the same job coordinator to start job queue processes. (For the Scheduler, these processes are called job slave processes. This section uses these terms interchangeably.) Although you typically use the JOB_QUEUE_PROCESSES initialization parameter to limit the number job queue processes for DBMS_JOB and you use the Scheduler attribute max_job_slave_processes to limit the number of job slave processes for the Scheduler, the Scheduler is affected by the JOB_QUEUE_PROCESSES parameter.

The maximum number of job slave processes for Scheduler is determined by the lesser of the values of JOB_QUEUE_PROCESSES and max_job_slave_processes. For example:

*

If JOB_QUEUE_PROCESSES is set to 10 and max_job_slave_processes is set to 20, the job coordinator will start no more than 10 job slave processes to be shared between DBMS_JOB and the Scheduler.
*

If JOB_QUEUE_PROCESSES is 20 and max_job_slave_processes is 10, the coordinator will start up to 20 job slave processes. The Scheduler can use only 10 of these, but DBMS_JOB can use all 20.

If JOB_QUEUE_PROCESSES is 0, DBMS_JOB is disabled, and the maximum number of job slave processes for Scheduler is controlled by the max_job_slave_processes Scheduler attribute.

11gR2


The docu is the same as for 11gR1 :
Using Both DBMS_JOB and Oracle Scheduler

DBMS_JOB and Oracle Scheduler (the Scheduler) use the same job coordinator to start job queue processes. (For the Scheduler, these processes are called job slave processes. This section uses these terms interchangeably.) Although you typically use the JOB_QUEUE_PROCESSES initialization parameter to limit the number job queue processes for DBMS_JOB and you use the Scheduler attribute max_job_slave_processes to limit the number of job slave processes for the Scheduler, the Scheduler is affected by the JOB_QUEUE_PROCESSES parameter.

The maximum number of job slave processes for Scheduler is determined by the lesser of the values of JOB_QUEUE_PROCESSES and max_job_slave_processes. For example:

*

If JOB_QUEUE_PROCESSES is set to 10 and max_job_slave_processes is set to 20, the job coordinator will start no more than 10 job slave processes to be shared between DBMS_JOB and the Scheduler.
*

If JOB_QUEUE_PROCESSES is 20 and max_job_slave_processes is 10, the coordinator will start up to 20 job slave processes. The Scheduler can use only 10 of these, but DBMS_JOB can use all 20.

If JOB_QUEUE_PROCESSES is 0, DBMS_JOB is disabled, and the maximum number of job slave processes for Scheduler is controlled by the max_job_slave_processes Scheduler attribute.

http://download.oracle.com/docs/cd/E11882_01/server.112/e10595/appendix_a001.htm tells about the same:

Using Both DBMS_JOB and Oracle Scheduler

DBMS_JOB and Oracle Scheduler (the Scheduler) use the same job coordinator to start job queue processes. (For the Scheduler, these processes are called job slave processes. This section uses these terms interchangeably.) Although you typically use the JOB_QUEUE_PROCESSES initialization parameter to limit the number job queue processes for DBMS_JOB and you use the Scheduler attribute max_job_slave_processes to limit the number of job slave processes for the Scheduler, the Scheduler is affected by the JOB_QUEUE_PROCESSES parameter.

The maximum number of job slave processes for Scheduler is determined by the lesser of the values of JOB_QUEUE_PROCESSES and max_job_slave_processes. For example:

  • If JOB_QUEUE_PROCESSES is set to 10 and max_job_slave_processes is set to 20, the job coordinator will start no more than 10 job slave processes to be shared between DBMS_JOB and the Scheduler.

  • If JOB_QUEUE_PROCESSES is 20 and max_job_slave_processes is 10, the coordinator will start up to 20 job slave processes. The Scheduler can use only 10 of these, but DBMS_JOB can use all 20.

If JOB_QUEUE_PROCESSES is 0, DBMS_JOB is disabled, and the maximum number of job slave processes for Scheduler is controlled by the max_job_slave_processes Scheduler attribute.



This certainly does not apply to 11.2.0.1. In 11.2.0.1 the number of scheduler jobs that can run concurrently is controlled by the job_queue_processes parameter, also when job_queue_processes = 0. A bit unexpected.

Also, a bit typical that for a parameter that is supposed to control a deprecated feature - dbms_job - has a default value changed from 0 to 1000. This gives me some nagging feeling there is more happening with this parameter.

conclusion

I am glad with the added features for the Oracle Scheduler in 11gR2, compared to 11gR1. It would even be better if the implementation would more closely match the documentation. With job control I would at least like to be able to control the concurrent number of jobs in a reliable and resource sensitive way.

OOW 2009 - Oracle Open World - unconference

This year I will be visiting Oracle Open World, invited by Packt Publishing, fully supported by Ciber. My college Rob van Wijk will also be there and pointed me to the possibility to reserve a space for an unconference room. This I did and on Monday at 14:00 I got a room in Overlook II. It is my intention to show some Oracle Scheduler front end tools and with a little luck, share experiences with others, who hopefully bring their own tools to demonstrate.


Next to that I will at least be visiting the Publishers seminar on Tuesday. I hope to meet a lot of people and learn about the plans oracle has regarding the Oracle Scheduler and BI tools. I can not imagine that anyone will be interested but just in case, I will also be signing books after this seminar but for who wants it, I will be happy to do that at any time :-D Feedback on the book is very welcome.

donderdag, september 24, 2009

Dzone and Packt Publishing have partnered

Dzone and Packt Publishing have partnered to bring you this exclusive
chapter from my book 'Mastering Oracle Scheduler in Oracle 11g Databases'.
This chapter explains how to make good use of the Scheduler and apply job
separation.



"Control the Scheduler"



Oracle Scheduler does a lot of out of the box things, and if the demands are
not too high, Oracle Scheduler can cover most of the situations. When your
application has to run many thousands of jobs in an hour and log them over a
long period, a little more attention is needed. In cases where the demands
are high, we need to take care of a few more things to keep the system
happy. What we need to do depends on how the Scheduler is used and what kind
of load it is supposed to handle. Please feel free to write your thoughts
about my book on Dzone to win a copy of the book.

dinsdag, september 22, 2009

quick creation of a valid EL5.4 linux installation in vmware[fusion]

Start with downloading the latest Enterprise Linux Distribution from oracle Choose the Enterprise Linux Release 5 Update 4 for x86 (32 Bit) - DVD at the bottom of the page.


unzip the file you downloaded try to remember where you left it.
In vmware Create a New Virtual Machine
Continue without disk
In the Installation Media select Create a custom virtual machine and continue
In Choose Operating System select Operating System Linux and select Version Red Hat Enterprise Linux 5, Continue
Now use Customize Settings to select how you want to connect to the vm machine, first choose where to save the image. Choose Host Only for the network adapter if you don't want to hassle with networks. Set the memory to > 1GB, if your host operating system has enough available.


At this point there still is no installation on the virtual disk. This can be fixed when the machine starts. It will complain that no bootable disk was found. Now you can attach the downloaded iso image to the vm machine by selecting the image to connect it as a dvd or cd. When this is done, the vm machine can boot from the installation cd.
You can now choose to scan or skip the scan of the installation media.
install_EEL.png Does this look familiar?
Choose your preferred language
And let know if you want to clear the disk (I would say: Yes)
For a simple demo installation the default disk layout is ok.
Adjust hostname if you like to
choose timezone
Enter the root password and confirm it. Try to remember this ....
Now choose for software development since this installs almost anything you are ever going to need when working with oracle.softwaredev.png
Now most of the installation will be done. When it is ready, logon as root with the password that you should have remembered and


cd /media/En*/Server
rpm -Uvh libaio-devel-* sysstat-* unixODBC-* unixODBC-devel-*

to install the few missing packages.
When this is done, it can be very convenient to install the vmware tools package. This will solve the complaint that is written on the status line. To do this, select 'Install Vmware Tools' from the VMware menu. This will mount a cd image that contains the vmware tools installer. When connected as root,

cd /tmp
gzip -cd /media/VM*/VM*.tar.gz|tar -xf -
cd vm*b
./vm*.pl

and accept all defaults. When this is done, you can share a directory from your host OS with the vmware machine. I prefer to use this for the oracle installers that I keep in the shared directory. Connected as user that you are going to use to install oracle with, cd /mnt/hsfg/[your directory] and continue navigating to the directory that contains your installer. The 11gR2 installer is very helpful because it does not only complain about what is wrong, as far as kernel settings is concerned, it also generates a script that fixes this.


Run the generated scripts


./runfixup.sh
Response file being used is :./fixup.response
Enable file being used is :./fixup.enable
Log file location: ./orarun.log
Setting Kernel Parameters...
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576

Now, the oracle installation can continue.


For a production environment a few things might be done a little more secure, customize disk layout, pay more attention to users and groups, to mention a few. For a quick demo this is enough.


Have fun!