DBA Tips Archive for Oracle

  


Install Oracle9i R2 on Linux Using RAW Devices - (Red Hat Linux 8.0)

by Jeff Hunter, Sr. Database Administrator


Contents

  1. Overview
  2. Swap Space Considerations
  3. Install the Java Development Kit (JDK)
  4. Create Oracle Account and Directories
  5. Downloading / Unpacking the Oracle9i Installation Files
  6. Run the Oracle Installer
  7. Errors during the Relink Phase of the Install
  8. Creating an Oracle9i Database on RAW Devices
  9. Configuration Files / Scripts


Overview

This article is a comprehensive guide for installing Oracle9i Release 2 on the Redhat Linux 8.0 operating environment. The database will be created using RAW devices.

Keep in mind the following assumptions throughout this article:

Swap Space Considerations

Install the Java Development Kit (JDK)

In order to use Oracle's HTTP [Apache] Server, you will need to download the appropiate SDK from Sun.

As per the JDK documentation, install JDK under /usr/local.
Then create a symbolic link to the JDK under /usr/local/java.

Create Oracle Account and Directories
Create Oracle User Account:

# groupadd -g 115 dba
# useradd -u 173 -c "Oracle Software Owner" -d /u01/app/oracle -g "dba" -m -s /bin/bash oracle
# passwd oracle

Create Oracle Directories:

# mkdir /u01
# mkdir /u01/app
# mkdir /u01/app/oracle
# mkdir /u01/app/oracle/admin
# mkdir /u01/app/oracle/admin/O920DB
# mkdir /u01/app/oracle/admin/O920DB/adhoc
# mkdir /u01/app/oracle/admin/O920DB/adump
# mkdir /u01/app/oracle/admin/O920DB/arch
# mkdir /u01/app/oracle/admin/O920DB/backups
# mkdir /u01/app/oracle/admin/O920DB/bdump
# mkdir /u01/app/oracle/admin/O920DB/cdump
# mkdir /u01/app/oracle/admin/O920DB/create
# mkdir /u01/app/oracle/admin/O920DB/dba
# mkdir /u01/app/oracle/admin/O920DB/exp
# mkdir /u01/app/oracle/admin/O920DB/logbook
# mkdir /u01/app/oracle/admin/O920DB/pfile
# mkdir /u01/app/oracle/admin/O920DB/release
# mkdir /u01/app/oracle/admin/O920DB/report
# mkdir /u01/app/oracle/admin/O920DB/tuning
# mkdir /u01/app/oracle/admin/O920DB/udump
# mkdir /u01/app/oracle/product
# chown -R oracle:dba /u01/app/oracle

# mkdir /opt/bin
# chown oracle:dba /opt/bin

Oracle Environment Variable Settings:

An example ".bash_profile" is provided in the Configuration Files / Scripts section below.

Ensure to set the environment variable: LD_ASSUME_KERNEL=2.2.5

NOTE: Failing to set the LD_ASSUME_KERNEL parameter will cause the Oracle Universal Installer to hang!

Downloading / Unpacking the Oracle9i Installation Files

Run the Oracle Installer

As the "oracle" user account:

Errors during the Relink Phase of the Install
During the "Link Phase" of the install, you will get an error while trying to make/install CTX. (The same issue exists in 9.0.1 on RedHat Linux).

The following errors will exist in $ORACLE_HOME/install/make.log

/lib/libdl.so.2: undefined reference to `__ctype_b_loc@GLIBC_2.3'
/lib/libdl.so.2: undefined reference to `_dl_addr@GLIBC_PRIVATE'
/lib/libdl.so.2: undefined reference to `_dl_open@GLIBC_PRIVATE'
/lib/libdl.so.2: undefined reference to `_dl_close@GLIBC_PRIVATE'
/lib/libdl.so.2: undefined reference to `_dl_sym@GLIBC_PRIVATE'
/lib/libdl.so.2: undefined reference to `_dl_vsym@GLIBC_PRIVATE'
collect2: ld returned 1 exit status
make: *** [ctxhx] Error 1

This error occurs when the following is executed:

/usr/bin/make -f ins_ctx.mk install ORACLE_HOME=/u01/app/oracle/product/9.2.0

Solution

The solution is to edit the file $ORACLE_HOME/ctx/lib/env_ctx.mk and go to "INSO_LINK =", add a "$(LDLIBFLAG)dl" to the line and save it.

Here is the full line with the added "$(LDLIBFLAG)dl" flag:

INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m $(LDLIBFLAG)dl $(LDLIBFLAG)sc_ca $(LDLIBFLAG)sc_fa $(LDLIBFLAG)sc_ex $(LDLIBFLAG)sc_da $(LDLIBFLAG)sc_ut $(LDLIBFLAG)sc_ch $(LDLIBFLAG)sc_fi $(LLIBCTXHX) $(LDLIBFLAG)c -Wl,-rpath,$(CTXHOME)lib $(CORELIBS) $(COMPEOBJS)

Set LD_ASSUME_KERNEL

You will also need to enter LD_ASSUME_KERNEL=2.2.5 in your .profile (or .bash_profile if you are using BASH) for the "oracle" user account so that they you can run programs like "dbssist" and "netca".

Return and Retry

After making the above change, return to the popup error dialog box and hit "Retry". It should continue from here with no errors.

Creating an Oracle9i Database on RAW Devices
Now to the heart of this document, and that is how to create a database using RAW devices instead of using files on a file system. So far, all of the action has taken place on the master IDE drive, /dev/hda. It is now time to work with that second hard drive in our system, /dev/hdb. As I mentioned in the first section of this document, the Linux operating system and the Oracle database software will be installed on /dev/hda, while we will be creating a database named O920DB on RAW devices on the /dev/hdb disk. Here is a short overview of how we will be accomplishing this:

Removing Any Partitions On Second IDE Internal Hard Drive

I decided to use my second IDE 40GB hard drive as the one to store the Oracle database files. The device was recognized on my system as: /dev/hdb. Lets assume for the purpose of this document that the entire hard drive should be dedicated to Oracle database files and that no partitions will exist. If there are partitions on the /dev/hdb hard disk, there are several ways to remove them. The first way is to use the Linux fdisk utility. Using fdisk, you can simply walk through any of the primary / extended partitions and use the proper commands to remove them. Once you have removed all of the partitions, use the p command within fdisk to verify that no further partitions exist. When you are sure they are all removed, use the w command within fdisk to write your changes to the hard disk's partition table.

Another way to remove any entries in the hard disk's partition table is to use the dd command:

    The following commands will destroy the partition table on the disk being operated on. Be very sure it is the correct disk before continuing!

# dd if=/dev/zero of=/dev/hdb bs=1K count=1
1+0 records in
1+0 records out

# blockdev --rereadpt /dev/hdb
At this point, you should have a hard drive recognized as /dev/hdb with no partitions.

Create the LVM Physical Volume

In this step, we will create an LVM Physical Volume called /dev/pv1 for the entire hard disk /dev/hdb.

Before continuing with the syntax for creating the LVM Physical Volume, I want to mention that within the Configuration Files / Scripts section of this document, I included a shell script named create_hdb_lvm.sh that contains all of the commands to create the LVM Physical Volume, LVM Volume Group, and LVM Logical Volumes for the /dev/hdb hard drive. Create an LVM Physical Volume named /dev/pv1 for the entire /dev/hdb hard drive using the following command:

# pvcreate /dev/hdb
pvcreate -- physical volume "/dev/hdb" successfully created

Create the LVM Volume Group

In this step, we will create an LVM Volume Group that will contain the LVM Physical Volume /dev/pv1.

Like mentioned in the previous section, all commands for creating the LVM Logical Volumes are contained in the script create_hdb_lvm.sh. Create an LVM Volume Group named that contains the LVM Physical Volume /dev/pv1.

# vgcreate -l 256 -p 256 -s 128k /dev/pv1 /dev/hdb
vgcreate -- INFO: maximum logical volume size is 8 Gigabyte
vgcreate -- doing automatic backup of volume group "pv1"
vgcreate -- volume group "pv1" successfully created and activated

Create All LVM Logical Volumes

Now that we have a LVM Volume Group that contains the block device /dev/hdb, it is time to create all of the LVM Logical Volumes that will be used to house all of the Oracle database files.

Like mentioned in the previous section, all commands for creating the LVM Logical Volumes are contained in the script create_hdb_lvm.sh. Create all required LVM Logical Volumes as determined by the number of Oracle database files you will need for the database. In our example, we will need to create 24 LVM Logical Volumes in order to store the 24 Oracle database files for our O920DB database.

# lvcreate -L 900m /dev/pv1     # SYSTEM Tablespace - (800m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol1" successfully created

# lvcreate -L 120m /dev/pv1     # Control File 1 - (110m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol2" successfully created

# lvcreate -L 120m /dev/pv1     # Control File 2 - (110m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol3" successfully created

# lvcreate -L 120m /dev/pv1     # Control File 3 - (110m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol4" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g01a.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol5" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g01b.log  - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol6" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g01c.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol7" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g02a.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol8" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g02b.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol9" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g02c.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol10" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g03a.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol11" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g03b.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol12" successfully created

# lvcreate -L 60m  /dev/pv1     # redo_g03c.log - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol13" successfully created

# lvcreate -L 250m /dev/pv1     # UNDOTBS Tablespace - (200m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol14" successfully created

# lvcreate -L 250m /dev/pv1     # TEMP Tablespace - (200m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol15" successfully created

# lvcreate -L 60m  /dev/pv1     # DRSYS Tablespace - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol16" successfully created

# lvcreate -L 60m  /dev/pv1     # CWMLITE Tablespace - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol17" successfully created

# lvcreate -L 200m /dev/pv1     # EXAMPLE Tablespace - (150m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol18" successfully created

# lvcreate -L 300m /dev/pv1     # PERFSTAT Tablespace - (250m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol19" successfully created

# lvcreate -L 60m  /dev/pv1     # ODM Tablespace -  (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol20" successfully created

# lvcreate -L 60m  /dev/pv1     # XDB Tablespace - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol21" successfully created

# lvcreate -L 150m /dev/pv1     # USERS Tablespace - (100m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol22" successfully created

# lvcreate -L 150m /dev/pv1     # INDX Tablespace - (100m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol23" successfully created

# lvcreate -L 100m /dev/pv1     # TOOLS Tablespace - (50m)
lvcreate -- doing automatic backup of "pv1"
lvcreate -- logical volume "/dev/pv1/lvol24" successfully created

Create RAW Bindings

In this step, we will create (or edit) a script called /etc/init.d/dbora that contains all of the commands that will bind the volumes to RAW devices. Also included are the commands to change the ownership of the raw devices for use by the Oracle database user "oracle".

I put these commands in script since they will need to be executed on each machine startup. Keep in mind that in most cases, the commands to start and stop the database are included in the /etc/init.d/dbora file. You can simply put the commands to bind the volumes to raw and chown commands in the start) portion of your script.

A sample script named dbora is include in the Configuration Files / Scripts section of this document.

# vgchange -a y /dev/pv1
vgchange -- volume group "pv1" successfully activated

# /usr/bin/raw /dev/raw/raw1 /dev/pv1/lvol1      # SYSTEM Tablespace 
/dev/raw/raw1:  bound to major 58, minor 0

# /usr/bin/raw /dev/raw/raw2 /dev/pv1/lvol2      # Control File 1
/dev/raw/raw2:  bound to major 58, minor 1

# /usr/bin/raw /dev/raw/raw3 /dev/pv1/lvol3      # Control File 2
/dev/raw/raw3:  bound to major 58, minor 2

# /usr/bin/raw /dev/raw/raw4 /dev/pv1/lvol4      # Control File 3
/dev/raw/raw4:  bound to major 58, minor 3

# /usr/bin/raw /dev/raw/raw5 /dev/pv1/lvol5      # redo_g01a.log
/dev/raw/raw5:  bound to major 58, minor 4

# /usr/bin/raw /dev/raw/raw6 /dev/pv1/lvol6      # redo_g01b.log
/dev/raw/raw6:  bound to major 58, minor 5

# /usr/bin/raw /dev/raw/raw7 /dev/pv1/lvol7      # redo_g01c.log
/dev/raw/raw7:  bound to major 58, minor 6

# /usr/bin/raw /dev/raw/raw8 /dev/pv1/lvol8      # redo_g02a.log
/dev/raw/raw8:  bound to major 58, minor 7

# /usr/bin/raw /dev/raw/raw9 /dev/pv1/lvol9      # redo_g02b.log
/dev/raw/raw9:  bound to major 58, minor 8

# /usr/bin/raw /dev/raw/raw10 /dev/pv1/lvol10    # redo_g02c.log
/dev/raw/raw10:  bound to major 58, minor 9

# /usr/bin/raw /dev/raw/raw11 /dev/pv1/lvol11    # redo_g03a.log
/dev/raw/raw11:  bound to major 58, minor 10

# /usr/bin/raw /dev/raw/raw12 /dev/pv1/lvol12    # redo_g03b.log
/dev/raw/raw12:  bound to major 58, minor 11

# /usr/bin/raw /dev/raw/raw13 /dev/pv1/lvol13    # redo_g03c.log
/dev/raw/raw13:  bound to major 58, minor 12

# /usr/bin/raw /dev/raw/raw14 /dev/pv1/lvol14    # UNDOTBS Tablespace
/dev/raw/raw14:  bound to major 58, minor 13

# /usr/bin/raw /dev/raw/raw15 /dev/pv1/lvol15    # TEMP Tablespace
/dev/raw/raw15:  bound to major 58, minor 14

# /usr/bin/raw /dev/raw/raw16 /dev/pv1/lvol16    # DRSYS Tablespace
/dev/raw/raw16:  bound to major 58, minor 15

# /usr/bin/raw /dev/raw/raw17 /dev/pv1/lvol17    # CWMLITE Tablespace
/dev/raw/raw17:  bound to major 58, minor 16

# /usr/bin/raw /dev/raw/raw18 /dev/pv1/lvol18    # EXAMPLE Tablespace
/dev/raw/raw18:  bound to major 58, minor 17

# /usr/bin/raw /dev/raw/raw19 /dev/pv1/lvol19    # PERFSTAT Tablespace
/dev/raw/raw19:  bound to major 58, minor 18

# /usr/bin/raw /dev/raw/raw20 /dev/pv1/lvol20    # ODM Tablespace
/dev/raw/raw20:  bound to major 58, minor 19

# /usr/bin/raw /dev/raw/raw21 /dev/pv1/lvol21    # XDB Tablespace
/dev/raw/raw21:  bound to major 58, minor 20

# /usr/bin/raw /dev/raw/raw22 /dev/pv1/lvol22    # USERS Tablespace
/dev/raw/raw22:  bound to major 58, minor 21

# /usr/bin/raw /dev/raw/raw23 /dev/pv1/lvol23    # INDX Tablespace
/dev/raw/raw23:  bound to major 58, minor 22

# /usr/bin/raw /dev/raw/raw24 /dev/pv1/lvol24    # TOOLS Tablespace
/dev/raw/raw24:  bound to major 58, minor 23

# /bin/chmod 600 /dev/raw/raw1
# /bin/chmod 600 /dev/raw/raw2
# /bin/chmod 600 /dev/raw/raw3
# /bin/chmod 600 /dev/raw/raw4
# /bin/chmod 600 /dev/raw/raw5
# /bin/chmod 600 /dev/raw/raw6
# /bin/chmod 600 /dev/raw/raw7
# /bin/chmod 600 /dev/raw/raw8
# /bin/chmod 600 /dev/raw/raw9
# /bin/chmod 600 /dev/raw/raw10
# /bin/chmod 600 /dev/raw/raw11
# /bin/chmod 600 /dev/raw/raw12
# /bin/chmod 600 /dev/raw/raw13
# /bin/chmod 600 /dev/raw/raw14
# /bin/chmod 600 /dev/raw/raw15
# /bin/chmod 600 /dev/raw/raw16
# /bin/chmod 600 /dev/raw/raw17
# /bin/chmod 600 /dev/raw/raw18
# /bin/chmod 600 /dev/raw/raw19
# /bin/chmod 600 /dev/raw/raw20
# /bin/chmod 600 /dev/raw/raw21
# /bin/chmod 600 /dev/raw/raw22
# /bin/chmod 600 /dev/raw/raw23
# /bin/chmod 600 /dev/raw/raw24

# /bin/chown oracle:dba /dev/raw/raw1
# /bin/chown oracle:dba /dev/raw/raw2
# /bin/chown oracle:dba /dev/raw/raw3
# /bin/chown oracle:dba /dev/raw/raw4
# /bin/chown oracle:dba /dev/raw/raw5
# /bin/chown oracle:dba /dev/raw/raw6
# /bin/chown oracle:dba /dev/raw/raw7
# /bin/chown oracle:dba /dev/raw/raw8
# /bin/chown oracle:dba /dev/raw/raw9
# /bin/chown oracle:dba /dev/raw/raw10
# /bin/chown oracle:dba /dev/raw/raw11
# /bin/chown oracle:dba /dev/raw/raw12
# /bin/chown oracle:dba /dev/raw/raw13
# /bin/chown oracle:dba /dev/raw/raw14
# /bin/chown oracle:dba /dev/raw/raw15
# /bin/chown oracle:dba /dev/raw/raw16
# /bin/chown oracle:dba /dev/raw/raw17
# /bin/chown oracle:dba /dev/raw/raw18
# /bin/chown oracle:dba /dev/raw/raw19
# /bin/chown oracle:dba /dev/raw/raw20
# /bin/chown oracle:dba /dev/raw/raw21
# /bin/chown oracle:dba /dev/raw/raw22
# /bin/chown oracle:dba /dev/raw/raw23
# /bin/chown oracle:dba /dev/raw/raw24

Create the Oracle9i Database O920DB

If you have successfully made it to this point, you are almost done. The only part left now, is to create the O920DB database. I put together an example initO920DB.ora instance parameter file along with a set of CREATE DATABASE... scripts in an archive create_database920.tar in the Configuration Files / Scripts section of this document.
Configuration Files / Scripts
Example:
    .bash_profile
$HOME/.bash_profile for the "oracle" user account.
    create_hdb_lvm.sh
An example shell script to create all Physical Volumes, Volume Groups, and Logical Volumes for supporting the O920DB database.
    dbora
An example shell script that binds all volumes to RAW devices on each machine startup.
    initO920DB.ora
Sample instance parameter script for Oracle9i. Place this file in ~oracle/admin/O920DB/pfile before running the RUN_CRDB.sh script below.
    create_database920.tar
An example "create database" set of scripts. Untar the file to ~oracle/admin/O920DB/create. If you decide to change the name of the ORACLE_SID, here are the files that need to be changed:
  • crdb.sh
  • create_database.sql
The main script to run is: RUN_CRDB.sh.


Copyright (c) 1998-2014 Jeffrey M. Hunter. All rights reserved.

All articles, scripts and material located at the Internet address of http://www.idevelopment.info is the copyright of Jeffrey M. Hunter and is protected under copyright laws of the United States. This document may not be hosted on any other site without my express, prior, written permission. Application to host any of the material elsewhere can be made by contacting me at jhunter@idevelopment.info.

I have made every effort and taken great care in making sure that the material included on my web site is technically accurate, but I disclaim any and all responsibility for any loss, damage or destruction of data or any other property which may arise from relying on it. I will in no case be liable for any monetary damages arising from such loss, damage or destruction.

Last modified on
Monday, 02-Jan-2012 15:08:55 EST
Page Count: 17733