Having fixed the problem with the KVM switch on my machine I proceed to get my Ruby scripts working on Ubuntu. Installing Ruby and getting Rails is a breeze. The problem starts when I need to install ruby-oci8. You cannot get this by doing a gem install….need to download the tar.gz file and run the setup. I try to use tar -xvf ruby-oci8-1.0.0.tar.gz but it fails. (some problem with the header of the file). I then use gzip and tar commands separately and it works.
To install ruby-oci8 you can either do this
make
make install
or do this
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
When I try them, both fail. Looking at the error I see that I need to configure ORACLE_HOME (in case of Oracle) or need to configure LD_LIBRARY_PATH (in case of Oracle Instant Client). I know that I don’t have them on my machine so I proceed to get the Oracle Instant Client. I read some blogs (see References) and find that I need the basic.zip and sdk.zip packages. I download them and unzip them at this location /opt/oracle/instantclient (need to sudo). Having done that I set my LD_LIBRARY_PATH to /opt/oracle/instantclient.
LD_LIBRARY_PATH=/opt/oracle/instantclient
export LD_LIBRARY_PATH
I then proceed to create two symlinks
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so
Note: In the above case, the names would depend on the version of the instant client that you have.
I go back to try out the ruby-oci8 setup and it fails again. Back to square one and I seem to have run out of ideas. A friend suggests me to check if the instant client works properly by installing sqlplus and connecting to the database. I go ahead with that (I would need sqlplus anyways).
I get the sqlplus.zip file from here. Unzip it to the location /opt/oracle/instantclient. I now go ahead and set the environment variables through the command line. (I have the LD_LIBRARY_PATH set already) and add my tnsnames.ora file to the same location.
PATH=$PATH:/opt/oracle/instantclient
SQLPATH=/opt/oracle/instantclient
export SQLPATH
TNS_ADMIN=/opt/oracle/instantclient
export TNS_ADMIN
I try this command at the command line now. (where the username , password and tnsnames have appropriate variables)
sqlplus username/password@tnsname
I get this now:
sqlplus: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
What the !! Now what is this supposed to be?? I read more and run these commands:
ldd sqlplus
strace sqlplus
The first command gives me a list of library dependencies that sqlplus requires and the second command (strace) gives me a trace of system calls and signals. (see man pages of the command for details). Both indicate that a library (libaio) is missing. I run the following command :
sudo apt-get install libaio-dev
Now when I try to run sqlplus I get this error:
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Dec 21 12:57:36 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
At least I am close. Hmmm…problem with the tnsnames. Soon, I find that I had set TNSADMIN instead of TNS_ADMIN. sqlplus runs once i correct that. So, I can now connect to the database and am sure that the instantclient is installed correctly. Back to ruby-oci8 now.
Running the setup gives me the same problem. This time however I notice that the instantclient is recognized but there is this error (I guess the instantclient was not the problem after all …doh !!)
checking for cc... ---------------------------------------------------
error messages:
Permission denied - mkmf.log
---------------------------------------------------
I see that mkmf.log exists in the oci8 dir structure and has root privileges. So, I need to run the setup as root. But since all the environment variables are set on my login the setup complains that it does not see LD_LIBRARY_PATH. I go ahead and add all environment variables to /etc/profile. For global environment variables in Ubuntu see this. I restart my shell and run the following.
sudo -i
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
Success. oci8 now installs without complaints. I try my ruby scripts and everything looks good. The fruit of persistence is definitely sweet.
UPDATES: I was helping a friend install oci8 on his machine when we faced some more hurdles. Adding them here:
1. mkmf not found: You will need the development version of Ruby. sudo apt-get install ruby1.8-dev
2. Make sure you install 32 bit versions and not 64 bit ones.
3. If you see this error : “libsqlplus.so: cannot open shared object file:”, you are missing the instantclient path. Somehow adding the path in /etc/profile did not get picked up in our case. We had to add it in the .bashrc file. Make sure you open a new terminal after the changes.
4. If you have problems running ruby setup, install etc (see the last step above), check to see if you have the build-essential package installed: sudo apt-get install build-essential
References:
http://ubuntuforums.org/archive/index.php/t-92528.html
http://roqet.org/oracle_instantclient.html
http://ruby-oci8.rubyforge.org/en/InstallForInstantClient.html
http://craiccomputing.blogspot.com/2007/01/using-oracle-as-backend-to-rails.html
http://ubuntuforums.org/archive/index.php/t-535311.html
http://rubyforge.org/forum/forum.php?thread_id=13948&forum_id=1078
https://help.ubuntu.com/community/EnvironmentVariables
Technorati Tags: ruby-oci8, sqlplus, LD_LIBRARY_PATH, libaio, TNS_ADMIN, strace , ldd, Ubuntu, ruby, oci, mkmf.log, Oracle
Powered by ScribeFire.
March 5, 2008 at 1:14 pm
Use the -z option to tar to extract (or create) a .tar.gz file.
June 29, 2008 at 12:19 pm
thanks for the writeup, it helped me out.
-CG
September 25, 2008 at 9:08 pm
Thanks a lot for this writeup. I’ve set up ruby/oracle on both Windows and Mac, but I just had the need to set it up on Ubuntu.
sudo apt-get install libaio-dev did the trick for me.
April 1, 2009 at 2:18 am
Hi
Thanks for your help. I’ve read and implement and now the Oracle Instant client works for me on Ubuntu!.
Here is my short ‘install guide’
1.Login: user oracle
$mkdir /home/oracle/InstantClient64bit
2. Copy the install files basiclite-11.1.0.7.0-linux-x86_64.zip, sqlplus-11.1.0.7.0-linux-x86_64.zip to /home/oracle/InstantClient64bit
3. Verify the install of gunzip, unzip rpm.
$unzip basiclite-11.1.0.7.0-linux-x86_64.zip
$unzip sqlplus-11.1.0.7.0-linux-x86_64.zip
directory /home/oracle/InstantClient64bit/instantclient_11_1 will be created. It’ll be used as ORACLE_HOME and all others.
4. Create the tnsnames.ora in /home/oracle/InstantClient64bit/instantclient_11_1
5. Add the following to /home/oracle/.bash_profile
PATH=$PATH:$HOME/bin:/home/oracle/InstantClient64bit/instantclient_11_1
export LD_LIBRARY_PATH=/home/oracle/InstantClient64bit/instantclient_11_1
export SQL_PATH=/home/oracle/InstantClient64bit/instantclient_11_1
export TNS_ADMIN=/home/oracle/InstantClient64bit/instantclient_11_1
6. Add libaio-dev package (user:root)
$sudo apt-get install libaio-dev
7. Try sqlplus