Tradueix

jueves, 21 de mayo de 2009

Connectar ORACLE i SQL Server

Objectiu final: Accedir mitjançant un DBLINK d'Oracle a una altra bbdd SQLServer.

Material:

  • Fedora Core 5 o superior
  • Oracle 10g (10.2.0) per a Linux
  • SQL Server 2000
Necessitarem:
Instal·lar el unixODBC
  1. Baixar el unixODBC d'aquesta adreça
  2. copiar el fitxer unixODBC*.tar.gz a un directori de treball /home/oracle per exemple
  3. # gunzip unixODBC*.tar.gz
  4. # tar xvf unixODBC*.tar
  5. # cd unixODBC*
  6. # ./configure –prefix=/usr/local –enable-gui=no
  7. # make
  8. # make install
Instal·lar el driver FreeTDS
  1. Baixar el driver de www.freetds.org. download
  2. copiar el fitxer a un directori de treball
  3. # tar -xvzf freetds-stable.tgz
  4. # ./configure –with-tdsver=8.0 –with-unixODBC=/usr/local
  5. # make
  6. # make install
Configurar el TDS
  1. Afegir al fitxer freetds.conf que es trobarà segurament a /usr/local/etc:
[test] --> nom de la connexió
host =
port = (1433 sòl ser el de SQL Server>
tds version = 8.0 (SQL Server 2000 és el 8.0 http://www.freetds.org/userguide/choosingtdsprotocol.htm)

Configurar el unixODBC

  1. Obrir el fitxer obdcinst.ini que hauria d'estar a /usr/local/etc i modificar-lo:
    [TDS]
    Description = FreeTDS driver
    Driver = /usr/local/lib/libtdsodbc.so
    Setup = /usr/local/lib/libtdsodbc.so
    Trace = Yes
    TraceFile = /tmp/freetds.log
    FileUsage = 1
  2. Obrir el fitxer odbc.ini que també hauria d'estar a /usr/local/etc i modificar-lo:
    [test]
    Driver = TDS
    Description = MS SQL Test
    Trace = Yes
    TraceFile = /tmp/mstest.log
    Servername = test
    Database =
    Port = 1433

Provar la connexió a la bbdd
  1. Executar al shell la següent comanda:
    # isql -v   
  2. +---------------------------------------+
    | Connected! |
    | |
    | sql-statement |
    | help [tablename] |
    | quit |
    | |
    +---------------------------------------+
    SQL> select * from "sysObjects";
    Si això funciona vol dir que ens hem connectat correctament
Configurar Oracle per a connectar amb MS SQLServer
  1. Crear un fitxer init.ora al directori $ORACLE_HOME/hs/admin on seria el nom de la connexió nova. Afegim en aquest fitxer les dades que apunten a la nostra connexió:
    • HS_FDS_CONNECT_INFO = el nom de la font de dades odbc (en el nostre cas test). Ha de coincidir amb el DSN
    • HS_FDS_SHAREABLE_NAME = el nom i la ruta del driver manager o driver
    • ODBCINI = el nom i ruta del fitxer de configuració del ODBC
    # This is a sample agent init file that contains the HS parameters that are
    # needed for an ODBC Agent.

    #
    # HS init parameters
    #
    HS_FDS_CONNECT_INFO = test
    HS_FDS_TRACE_LEVEL = 4
    HS_FDS_TRACE_FILE_NAME = /tmp/freetds.trc
    HS_FDS_SHAREABLE_NAME = /usr/local/lib/libodbc.so

    #
    # ODBC specific environment variables
    #
    set ODBCINI=/usr/local/etc/odbc.ini


    #
    # Environment variables required for the non-Oracle system
    #
Modificar el fitxer listener.ora
  1. Afegir un listener al fitxer de configuració listener.ora que trobem al directori $ORACLE_HOME/network/admin:
    SID_LIST_test =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = test)
    (ORACLE_HOME =)
    (PROGRAM = hsodbc)
    (ENVS=LD_LIBRARY_PATH=/lib:)
    )
    )

    test =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
    )
    (ADDRESS_LIST =
    (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY))
    )
    )
    )
  2. Desprès de modificar el fitxer. Engenguem el nou listener amb la comanda:
    # lsnrctl start test
Modificar el tnsnames.ora
  1. Afegir la entrada nova també al tnsnames.ora:
    test =
    (DESCRIPTION=
    (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT=1522))
    (CONNECT_DATA=
    (SERVICE_NAME=test)
    )
    (HS=OK)
    )
  2. Proveu la nova connexió amb la comanda:
    # tnsping test
Crear el nou database link
  1. Connectar-se a Oracle amb un usuari
    # sqlplus system@
  2. SQL> create database link sqlserverdb connect to user identified by password using 'test';
  3. I per a comprovar que ha funcionat:
    SQL> select * from sysobjects@sqlserverdb;
  4. Si la select retorna resultats és que ho hem fet correctament, evidentment.

miércoles, 28 de enero de 2009

startup automático de las bbdd de oracle

En Linux, una vez creado el proceso en /etc/init.d/ para encender el oracle automaticamente al reiniciar la màquina, no sus olvideis de modificar el fichero /etc/oratab. En el se encuentra una lista de las bbdd que tenemos en la máquina y si queremos que se enciendan o no automaticamente al reiniciar el sistema de la siguiente forma:

:/opt/app/oracle/product/10.2.0/db_1:Y
:/opt/app/oracle/product/10.2.0/db_1:N

Simplemente cambiando Y o N se monta la base de datos escogida al reiniciar Oracle.

miércoles, 21 de enero de 2009

ORA-12500

Las conexiones se estan multiplicando y el uso en general de la bbdd ha empezado a crecer. Empiezan a atacar la bbdd por todas partes. En algunos intentos de conexión ha aparecido el fastidioso error:
ORA-12500: TNS:listener failed to start a dedicated server process
En el sistema los procesos de oracle (ps -A) eran numerosos. Lo curioso és que al principio las conexiones desde SQLDeveloper funcionaban, en cambio las de un cliente desarrollado en NetBeans no. Desconozco la razón de esta discriminación.
Rastreando por internet he llegado a la web donde escribe este señor al que apodaré Boris Yelsin (que por cierto, se merece el cielo y mucho mas) y he comprobado el parámetro de procesos. Según el init.ora o segun el TOAD o segun el comando "show parameter process" tenia 150 procesos como máximo.
Despues he comprobado en el fichero /opt/u01/app/oracle/admin//bdump/alert_.log
para ver si hay algún error mas y he encontrado este:
kkjcre1p: unable to spawn jobq slave process
Buscando en internet al respecto como siempre llegamos al mismo sitio (Boris Yelsin otra vez): http://www.dba-oracle.com/t_kkjcre1p_unable_to_spawn.htm
Efectivamente parece que la máquina no tiene suficientes recursos. La cuestión és si el problema es de la RAM o bien de la limitación del parámetro de Oracle para generar mas procesos para cada nueva conexión. Según parece hay tres posibilidades:
  1. El parámetro process es demasiado pequeño
  2. La RAM de la máquina es demasiado limitada
  3. El job_queue_processes es 0
Creo que de la RAM no es problema así que aumentaré el valor del parámetro. Para ello:
  1. entrar en: sqlplus /nolog
  2. connect sys as sysdba;
  3. ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
    (el valor inicial era 150. Scope=spfile hace que el cambio afecte al spfile, con lo que al arrancar la bbdd de nuevo tendria que canviarse. Ojo, NO afecta al pfile, o sea, al init.ora, con lo que si queremos cambiarlo en el init.ora hay que hacerlo en el fichero y convertir el init.ora en un spfile. Otro rato veremos como hacer esta operación)
  4. shutdown immediate (hay que bajar la bbdd para que tenga efecto el cambio)
  5. startup
  6. show parameter process; --para comprobar que realmente ha cambiado.
La lucha sigue!!!

Introducción

Este es el n-esimo dia de mi guerra contra el sistema de base de datos Oracle. Y és una autentica guerra pues de tanto en cuanto me peleo con el, con todas y cada una de sus tropas. Pero hoy es diferente. La diferència es que después de la última batalla he decidido empezar este diario de guerra. Espero que sea útil, tanto para mi como para la gente en general, pues así poder luchar en futuras batallas con la ventaja que proporciona la experiencia.
Que la suerte nos acompañe!!

Oracle Wars © 2008. Template by Dicas Blogger.

TOPO