martes, 8 de septiembre de 2009

dbi-link postgres to oracle

1 - instalar dbi-link

http://pgfoundry.org/projects/dbi-link/

2 - bajar los rpm instantclient de la pagina de oracle (http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html)

oracle-instantclient-basic-10.2.0.3-1.i386.rpm

oracle-instantclient-devel-10.2.0.3-1.i386.rpm

3 - yo use alien para crear los .deb

en la carpeta donde bajaste los rpm hacer esto:

alien *.rpm

4 - una vez creados los .deb hacer:

dpkg -i *.deb y te instalara el instantclient

5 - bajar el modulo de perl para que funcione con oracle

yo lo baje de esta pagina

http://ftp.debian.org/debian/pool/contrib/libd/libdbd-oracle-perl/libdbd-oracle-perl_1.21-2_i386.deb

y luego dpkg -i libdbd-oracle-perl_1.21-2_i386.deb

6 -

luego en la carpeta dbi_link hay unos ejemplos para testear el dbi-link el mismo se llama oracle.sql y hacemos

psql -f oracle.sql tuBD

tener en cuenta que tenes que editar el oracle.sql para ponerle tu usuario y pass de oracle para testearlo.

free counters

jueves, 6 de agosto de 2009

oracle to postgres dblink

Para todos los casos

sid de postgres es postg


1)primero configurar el odbcinst.ini para que vea el driver de postgres

[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/libodbcpsql.so
Setup = /usr/lib/libodbcpsqlS.so
FileUsage = 1



2)configurar el ODBC.ini con la bd que tiene que leer , el nombre del servicio tiene que ir entre corchetes

   
[postg]
Driver = /usr/lib/libodbcpsql.so
Trace = No
TraceFile =
Database = pruebaBD
Servername = 192.168.63.6 //tu ip
UserName = usertest // usuario
Password = passtes //pass
Port = 5432
Protocol = 7.0
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No
3)probar con el comando isql –v nombre driver;

en este caso isql –v postg

+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+


Para que se conecte con oracle:

1 – hay que ir al directorio /u01/app/oracle/product/10.2.0/db_1/hs/admin

crear un archivo que se llame INIT(sid).ora

por ejemplo initpostg.ora y que tenga esto

HS_FDS_CONNECT_INFO = postg
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME = postg.trc
HS_AUTOREGISTER = TRUE
HS_FDS_SHAREABLE_NAME = /usr/lib/libodbcpsql.so

set ODBCINI=/etc/odbc.ini
set client_encoding=latin1 

2 - agregar al listener.ora

(SID_DESC =
  (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
  (SID_NAME =postg)
  (PROGRAM = hsodbc)
  )

y al tnsnames.ora

postg=
( DESCRIPTION=
  (ADDRESS = (PROTOCOL = TCP)(HOST=localhost)(PORT=1521))
  (CONNECT_DATA =
  (SID = postg)
 )
 (HS=OK) //esto es porque es un servicio heterogeneo
)

después se crea un dblink pero tener en cuenta que el usuario debe ir entre comillas dobles y con minusculas

CREATE PUBLIC DATABASE LINK base
 CONNECT TO "oracle" IDENTIFIED BY "pass" USING 'postg';

Con este script de oracle podras crear las tablas en postgres ,una vez ejecutada esta consulta te devolvera todas las sentencias necesarias , solo tendras que copiar y pegas y tendras tus tablas en postgres , es simple despues voy a poner para pasar los indices.

select case

when instr(LEAD (datos, 1, 0) OVER (ORDER BY nro),'create table') > 0
then substr(datos,1,length(datos) -1) || ');'
when LEAD (datos, 1, 0) OVER (ORDER BY nro) = '0'
then substr(datos,1,length(datos) -1) || ');'
else
datos
end
from (
select nro, case when table_name <> LAG (table_name, 1, 0) OVER (ORDER BY nro)
then 'create table ' || table_name || '('
else
null
end || ' ' ||
columna datos
from (
SELECT rownum nro,
uc.table_name,


column_name
|| ' '
|| DECODE (uc.data_type, 'NUMBER', 'NUMERIC', 'VARCHAR2', 'CHAR','CLOB','text',uc.data_type)
|| ' '
|| decode(uc.data_type,'VARCHAR2','('||uc.data_length||')', null)
|| ',' columna,
LEAD (uc.table_name, 1, 0) OVER (ORDER BY uc.table_name) AS prox
FROM user_tables ut, user_tab_cols uc
WHERE ut.table_name = uc.table_name))

free counters

viernes, 17 de julio de 2009

ORA-39014 , ORA-39029,ORA-31671 con imdp

ORA-39014: Uno o m�s workers han salido antes de tiempo.
ORA-39029: el worker 1 con el nombre de proceso "DW01" ha terminado antes de tiempo
ORA-31671: El proceso de worker DW01 tiene una excepci�n no tratada.
ORA-00600: c�digo de error interno, argumentos: [qerxtAgentOpen_911], [5], [4], [], [], [], [], []
ORA-06512: en "SYS.KUPW$WORKER", l�nea 1345
ORA-06512: en l�nea 2


este error en mi caso me paso porque en el momento del import estaban habilitados los trigers , los desabilite y anduvo bien.
Otra causa fue porque las estructuras de las tablas no son las mismas.

Si no setear hacer lo siguiente en spfile:

SQL> alter system set event= '38066 trace name context forever, level 2' scope=spfile;
SQL> alter system set "_complex_view_merging" = false scope=spfile;
SQL> alter system set "_optimizer_cost_based_transformation"=off scope=spfile;


free counters

viernes, 5 de junio de 2009

ORA-20000: ORA-20000: Content of the tablespace specified is not permanent or tablespace name is invalid

ORA-20000: ORA-20000: Content of the tablespace specified is not permanent or tablespace name is invalid

en mi caso esto me paso porque habia borrado un tablespace y cuando se ejecutaba el asesor me daba ese error

Solucion!!!

SQL> select distinct tablespace_name from DBA_AUTO_SEGADV_CTL;

TABLESPACE_NAME
------------------------------
SYSAUX
TBL_VIEJO
USERS_REORG0

SQL> delete from DBA_AUTO_SEGADV_CTL where tablespace_name='TBL_VIEJO';

1 fila suprimida.

SQL> commit;

Confirmaci�n terminada.
free counters

martes, 2 de junio de 2009

INDEXAR COLUMNAS EN ORACLE CUANDO USAMOS LIKE

Bueno he tenido el problema de ajustar consultas cuando usan el operador like con la mascara '%%' , esto sin duda hace un full scan a la tabla en cuestion.

Afortunadamente oracle nos soluciona este problemas con unos tipos especiales de indices usando oracle text.

Estos tipos especiales de indices son:

# CONTEXT Indexes : se usa para buscar en documentos pdf , html etc.
# CTXCAT Indexes : se usa para buscar texto corto nomas de 30 caracteres.
# CTXRULE Indexes :
para construir aplicaciones de clasificación de documento

primero vamos a crear el indice sobre la columa col1

CREATE INDEX myindice ON tabla(col1) INDEXTYPE IS CTXSYS.CONTEXT;

y en vez de hacer la query

select col1 from tabla where col1 like '%AA%'

hacemos esto

SELECT col1
FROM tabla
WHERE CONTAINS(col1, 'AA', 1) > 0

y usara el indice creado anteriormente.


free counters

viernes, 15 de mayo de 2009

VB 6 y Cursores De Oracle

Un cursor es un sinónimo de área de contexto de un área de trabajo en la memoria que Oracle almacena la instrucción de SQL actual. Para una consulta, el área de memoria también incluye los encabezados de columna y una fila recuperada por la instrucción SELECT.

un ejemplo muy sencillo la conexion a la base de datos desde visual basic abre en promedio 2 a 4 cursores segun he podido probar.

El problema se presenta cuando usamos muchos recorset sin cerrarlos , podemos hacer una simetría de un rs = un cursor de oracle.

Cuando actualizamos los datos no se abre ningún cursor ya que son consultas que no devuelven registros.

Podemos ver los cursores abiertos con la vista v$open_cursor

select count(*) , user_name
from v$open_cursor
group by user_name

notar que hay cursores que abre oracle para actualizar las estadísticas de la tabla y mas , osea por mas que nosotros abramos 3 cursores desde vb en la vista pueden aparecer 6 o 7 que son propios de oracle.

Muchas veces podemos ver que nos aparece la siguiente advertencia

Current Open Cursors Count

son las cantidad de cursores que tenemos abiertos , esto depende del tamaño de nuestra sga , normalmente podemos usar para calcular el tamaño de la shared_pool viendo la cantidad de cursores abiertos cuando la base esta a full , pero no dejar también de ver la aplicación porque una aplicación mal desarrollada lleva a los dba a a hacer sucesivos ajustes a la bd que por ahí tocando solo la aplicación los problemas se resuelven.

fuente : http://support.microsoft.com/kb/183639/es
free counters

jueves, 14 de mayo de 2009

ORACLE 10G R2 + UBUNTU 8.10 + UBUNTU 9.04 + UBUNTU 9.10


BAJAMOS ESTE ARCHIVO


10201_database_linux32.zip


Instalar esta paqueteria

apt-get install gcc libaio1 lesstif2 lesstif2-dev make rpm libc6 libstdc++5 binutils
libmotif3

como root crea las siguientes enlaces simbolicos:


ln -s /usr/bin/awk /bin/awk
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/basename /bin/basename

Ahora editar el archivo /etc/sysctl.conf y añade o modifica estas líneas:


kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

luego

/sbin/sysctl -p

Editamos el fichero /etc/security/limits.conf para modificar estos valores:

* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

Añade lo siguiente a /etc/pam.d/login:

session required /lib/security/pam_limits.so

pam_limits.so es el módulo que procesa la configuración del fichero /etc/security/limits.conf que cambiamos antes.

Crear usuario oracle


/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/groupadd nobody
/usr/sbin/useradd -c "oracle" -g oinstall -G dba oracle
/usr/sbin/useradd -g nobody nobody
# cambiamos el password del usuario oracle
passwd oracle

Creamos estos paths

mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01
chmod -R 775 /u01

mkdir -p /home/oracle

chown -R oracle:oinstal /home/oracle



conectate como usuario oracle y añade esto al fichero /home/oracle/.bash_profile:

umask 022
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1; export ORACLE_HOME
ORACLE_SID=SID_TU_BASE; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
ORACLE_OWNER=oracle; export ORACLE_OWNER
#TNS_ADMIN=/home/oracle/config/10.1.0 export TNS_ADMIN
NLS_LANG=SPANISH_SPAIN.WE8ISO8859P1; export NLS_LANG
#ORA_NLS10=${ORACLE_HOME}/db_1/nls/data; export ORA_NLS10
CLASSPATH=${CLASSPATH}:${ORACLE_HOME}/jdbc/lib/classes12.zip
LD_LIBRARY_PATH=${ORACLE_HOME}/lib; export LD_LIBRARY_PATH
DISABLE_HUGETLBFS=1; export DISABLE_HUGETLBFS
TEMP=/tmp; export TEMP
TMPDIR=/tmp; export TMP
PATH=$PATH:/u01/app/oracle/product/10.2.0/db_1/bin; export PATH

Crea tambien estos directorios:

mkdir /var/lock/subsys

entramos a la parte grafica como usuario oracle y ejecutamos esto

./runInstaller -ignoreSysPreReqs

para 7.1 :


LINK A 7.1

Espero que les sirva. saludos!!



free counters