Si queremos reemplazar el texto en un archivo podemos utilizar perl:
perl -pi -e 's/cadena abuscar/cadenaporlaquesustituimos/g'
Si queremos reemplazar el texto de muchos archivos ejecutamos el comando find combinado con perl:
find /directorio -name "*.txt" | xargs perl -pi -e 's/cadena abuscar/cadenaporlaquesustituimos/g'
Podemos usar el AWK para lo mismo:
find /directorio -name "*.txt" | awk '{ gsub(/cadena abuscar/, "cadenaporlaquesustituimos"); print }'
o
cat archivo.txt | awk '{ gsub(/cadena abuscar/, "cadenaporlaquesustituimos"); print }'
ej: cat archivo.txt | awk '{ gsub(/Linux/, "Opensuse"); print }'
Si usamos un editor como vi, podemos usar el siguiente comando::%s/cadena abuscar/cadenaporlaquesustituimos/g
Un ejemplo práctico en vi para sustituir los caracteres ^M:
:%s/^V^M//g
Al pulsar control V y control M el resultado sera:
%s/^M//g
Que eliminara los caracteres ^M
Si queremos hacerlo usando perl utilizaremos los siguiente:
cat archivo.txt | perl -pi -e 's/\r$//'
Oracle: exportar tabla como csv
Para exportar una tabla como csv usaremos los siguientes comandos desde sqlplus:
spool ARCHIVO.csv
set termout off
set pagesize 0
set heading off
set feedback off
select '"'||Campo1||'","'||Campo2||'","'||Campo3||'"' from Tabla;
quit
Si quisiesemos usar tabuladores en lugar de comas podemos usar esto:
select '"' || Campo1 ||'"' || CHR(9)|| '"'|| YEAR from Tabla;
spool ARCHIVO.csv
set termout off
set pagesize 0
set heading off
set feedback off
select '"'||Campo1||'","'||Campo2||'","'||Campo3||'"' from Tabla;
quit
Si quisiesemos usar tabuladores en lugar de comas podemos usar esto:
select '"' || Campo1 ||'"' || CHR(9)|| '"'|| YEAR from Tabla;
Oracle : Tablas y objetos bloqueados
Para obtener una lista con los objetos bloqueados ejecucutados:
select substr(a.os_user_name,1,8) "OS User"
, substr(b.object_name,1,30) "Object Name"
, substr(b.object_type,1,8) "Type"
, substr(c.segment_name,1,10) "RBS"
, e.process "PROCESS"
, substr(d.used_urec,1,8) "# of Records"
, e.sid
, e.serial#
, p.*
from v$locked_object a
, dba_objects b
, dba_rollback_segs c
, v$transaction d
, v$session e
, v$process p
where a.object_id = b.object_id
and a.xidusn = c.segment_id
and a.xidusn = d.xidusn
and a.xidslot = d.xidslot
and d.addr = e.taddr
and p.addr = e.paddr
Si intentamos por ejemplo hacer un "drop table" obtendremos un error del tipo ORA-00054: recurso ocupado y obtenido con NOWAIT.
Para desbloquear uno de los objetos usamos alguna de las siguientes sentencias
ALTER SYSTEM DISCONNECT SESSION 'SID, SERIAL' IMMEDIATE;
o bien
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
En el caso de que no finalice el proceso podemos matarlo desde el SO. Para ello utilizaremos lo siguiente desde un entorno linux:
kill -9 SPID
Donde el SPID lo podemos obtener en la consulta escrita anteriormente.
select substr(a.os_user_name,1,8) "OS User"
, substr(b.object_name,1,30) "Object Name"
, substr(b.object_type,1,8) "Type"
, substr(c.segment_name,1,10) "RBS"
, e.process "PROCESS"
, substr(d.used_urec,1,8) "# of Records"
, e.sid
, e.serial#
, p.*
from v$locked_object a
, dba_objects b
, dba_rollback_segs c
, v$transaction d
, v$session e
, v$process p
where a.object_id = b.object_id
and a.xidusn = c.segment_id
and a.xidusn = d.xidusn
and a.xidslot = d.xidslot
and d.addr = e.taddr
and p.addr = e.paddr
Si intentamos por ejemplo hacer un "drop table" obtendremos un error del tipo ORA-00054: recurso ocupado y obtenido con NOWAIT.
Para desbloquear uno de los objetos usamos alguna de las siguientes sentencias
ALTER SYSTEM DISCONNECT SESSION 'SID, SERIAL' IMMEDIATE;
o bien
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
En el caso de que no finalice el proceso podemos matarlo desde el SO. Para ello utilizaremos lo siguiente desde un entorno linux:
kill -9 SPID
Donde el SPID lo podemos obtener en la consulta escrita anteriormente.
Oracle: Conexión de Agente a Instancia no disponible
Para solucionarlo se debe probar lo siguiente:
emctl clearstate agentSi no funciona probaremos a parar y arrancar de nuevo el emctl
emctl stop dbconsole
emctl start dbconsole
Escritura en particiones NTFS: NTFS-3G y fuse
Para poder escribir en particiones NTFS necesitamos dos elementos: FUSE y NTFS-3G
La versión de fuse que viene con suse 10.2 da algún problema así que ha de descargarse desde la página oficial:
1- Descargar desde http://fuse.sourceforge.net/. Ahora instalamos FUSE:
./configure --enable-kernel-module --exec-prefix=/
make
make install
2- Descargar desde http://www.ntfs-3g.org/. Instalamos ntfs-3g
./configure
make
make install
3- Para probarlo desmontamos una unidad ntfs y móntala con mount -t ntfs-3g /dev/hda1 /mnt/windows
4- Para el montaje automático editar el /etc/fstab y cambiar donde pone ntfs por ntfs-3g
este es el ejemplo qe ponen en ntfs-3g:
La versión de fuse que viene con suse 10.2 da algún problema así que ha de descargarse desde la página oficial:
1- Descargar desde http://fuse.sourceforge.net/. Ahora instalamos FUSE:
./configure --enable-kernel-module --exec-prefix=/
make
make install
2- Descargar desde http://www.ntfs-3g.org/. Instalamos ntfs-3g
./configure
make
make install
3- Para probarlo desmontamos una unidad ntfs y móntala con mount -t ntfs-3g /dev/hda1 /mnt/windows
4- Para el montaje automático editar el /etc/fstab y cambiar donde pone ntfs por ntfs-3g
este es el ejemplo qe ponen en ntfs-3g:
/dev/hda1 /mnt/windows ntfs-3g defaults 0 0
Si queremos que soporte los acentos debemos añadir:
a)fstab -> /dev/sda2 /windows/E ntfs-3g defaults,nls=iso8859-1 0 0
b) comando -> mount -o nls=iso8859-15 /dev/sda2 /windows/E
Descompresion tar : gz y bz2
Para descomprimir archivos tar.gz usamos:
tar zxvf archivo.tar.gz
tar zxvf archivo.tar.gz
Para descomprimir archivos tar.bz2 usamos:
tar jxvf archivo.tar.bz2
Importar datos de excel o de access a oracle: sql loader
En el siguiente post explico cómo pasar de excel a oracle o de access a oracle.
De Excel a Access:
El objetivo es convertir la hoja excel en una tabla access. Podemos realizarlo de alguna de estas dos formas:
a) Abrimos Access e importamos la hoja de excel: Archivo/ importar. Se nos creará una tabla con los datos de la hoja importada
b) Abrimos Access e importamos la hoja excel como una tabla.Para ello en la parte donde se ven las tablas, con el botón derecho le damos a importar. Se creara una tabla con el contenido de la hoja excel.
De Access a Oracle:
1) Antes de exportar una tabla vamos a convertir sus campos:
Pulsamos sobre la tabla que queremos exportar con el botón derecho y seleccionamos "Vista Diseño". Todos los campos debemos convertirlos a tipo de dato texto. Si no lo hacemos es probable que tengamos problemas en la importación con el sqlloader
2) Exportamos la tabla. Pulsamos con el botón derecho sobre la tabla, y seleccionamos exportar. En "guardar como tipo" seleccionamos "Archivo de texto" y pulsamos exportar. Podemos guardarlo donde queramos, por ejemplo en el escritorio de windows (C:\Users\dieguz2\Desktop\archivo.csv)
3) En el asistente seleccionamos: "Delimitado"; como delimitador que separa los campos, en "otro" ponemos | ; no marcamos "incluir nombres de campo en la primera fila"; cualificador de texto las comillas " . Pulsamos siguiente y luego finalizar
4) Abrimos el archivo que hemos exportado y añadimos lo siguiente al comienzo del archivo:
LOAD DATA
INFILE *
INTO TABLE "NOMBRE_DE_TABLA"
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED '"'
TRAILING NULLCOLS
(CAMPO1, CAMPO2)
begindata
El nombre de tabla y los campos tienen que estar en MAYÚSCULAS. La tabla ha de estar creada previamente y estar vacía.
5) Ejecutamos el sql loader desde el mismo directorio donde hemos guardado el archivo csv o bien ponemos la ruta completa para llegar al archivo ( ej1(windows): control=C:\Users\dieguz\Desktop\archivo.csv ej2(linux): control=/windows/C/Users/dieguz/Desktop/archivo.csv).
sqlldr usuario/contraseña@instancia control=archivo.csvNotas extra:
Si queremos que el texto se importe en formato unicode deberemos hacer lo siguiente:
http://dieguz2.blogspot.com/2008/09/sqlloader-unicode-utf8.html
Oracle 10g y Linux: memoria compartida
Para conocer las limitaciones de memoria que tenemos podemos usar lo siguiente:
# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1048576
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
TAMAÑO MAXIMO DE SEGMENTO
Como podemos ver el tamaño máximo de un segmento de memoria compartida en el ejemplo es de 1G. El parámetro que controla esto es el SHMMAX
SHMMAX = cat /proc/sys/kernel/shmmax
Hay que procurar que el tamaño del SGA de oracle coincida con un segmento de memoria.Asi que hay que podificar el SHMMAX para adaptarlo al SGA. Si el SHMMAX es menor que el SGA, se crearán varios segmentos de memoria compartida lo que podría repercutir negativamente sobre las prestaciones de oracle.
Para cambiarlo:
1) sysctl -w kernel.shmmax=2147483648 . Cambia de forma temporal, y sin reiniciar la máquina del parámetro.
2) echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf . Modificamos el archivo de arranque de sistema para modificar el parámetro en cada arranque. O bien modificamos el archivo sysctl.conf con un editor de texto.
El valor de shmmax recomendado es la el de la mitad de la memoria física disponible.
TAMAÑO TOTAL DE LA MEMORIA COMPARTIDA
En linux la maxima cantidad de memoria compartida (Shared Memory) que puede ser usada viene determinada por :
Máxima Cantidad de memoria compartida = shmall * pagesize
donde
pagesize = getconf PAGE_SIZE
shmall = cat /proc/sys/kernel/shmall
shmall debe ser al menos = ceil(SHMMAX/PAGE_SIZE) , redondeo arriba. Para cambiar el parámetro se hace con los mismos comandos que SHMMAX.
# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1048576
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
TAMAÑO MAXIMO DE SEGMENTO
Como podemos ver el tamaño máximo de un segmento de memoria compartida en el ejemplo es de 1G. El parámetro que controla esto es el SHMMAX
SHMMAX = cat /proc/sys/kernel/shmmax
Hay que procurar que el tamaño del SGA de oracle coincida con un segmento de memoria.Asi que hay que podificar el SHMMAX para adaptarlo al SGA. Si el SHMMAX es menor que el SGA, se crearán varios segmentos de memoria compartida lo que podría repercutir negativamente sobre las prestaciones de oracle.
Para cambiarlo:
1) sysctl -w kernel.shmmax=2147483648 . Cambia de forma temporal, y sin reiniciar la máquina del parámetro.
2) echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf . Modificamos el archivo de arranque de sistema para modificar el parámetro en cada arranque. O bien modificamos el archivo sysctl.conf con un editor de texto.
El valor de shmmax recomendado es la el de la mitad de la memoria física disponible.
TAMAÑO TOTAL DE LA MEMORIA COMPARTIDA
En linux la maxima cantidad de memoria compartida (Shared Memory) que puede ser usada viene determinada por :
Máxima Cantidad de memoria compartida = shmall * pagesize
donde
pagesize = getconf PAGE_SIZE
shmall = cat /proc/sys/kernel/shmall
shmall debe ser al menos = ceil(SHMMAX/PAGE_SIZE) , redondeo arriba. Para cambiar el parámetro se hace con los mismos comandos que SHMMAX.
Sentencia Merge en Oracle
La sentencia merge nos permite realizar una actualización de una tabla, de tal modo que si no existe alguno de los registros a actualizar realiza también la inserción de esos nuevos registros. La sintaxis es la siguiente:
MERGE INTO tabla
USING (otra_tabla, vista.....)
ON ( condiciñon de union)
WHEN MATCHED THEN
UPDATE SET
columna1tabla = un valor,
columna2tabla = otro valor
WHEN NOT MATCHED THEN
INSERT (columna1tabla,columna2tabla)
VALUES (unvalor, otrovalor)
Un ejemplo en el que tenemos dos tablas prueba1 y prueba2, y queremos realizar un merge de prueba1 en prueba2. Esto significa que los valores de prueba2 van a ser actualizados con los valores de prueba1, y en el
caso de que no exista el registro se insertan en prueba2.
MERGE INTO prueba2
USING (prueba1)
ON (prueba2.id1 = prueba1.id1)
WHEN MATCHED THEN
UPDATE SET
prueba2.id2 = prueba1.id2
WHEN NOT MATCHED THEN
INSERT (id1,id2)
VALUES (prueba1.id1, prueba1.id2)
MERGE INTO tabla
USING (otra_tabla, vista.....)
ON ( condiciñon de union)
WHEN MATCHED THEN
UPDATE SET
columna1tabla = un valor,
columna2tabla = otro valor
WHEN NOT MATCHED THEN
INSERT (columna1tabla,columna2tabla)
VALUES (unvalor, otrovalor)
Un ejemplo en el que tenemos dos tablas prueba1 y prueba2, y queremos realizar un merge de prueba1 en prueba2. Esto significa que los valores de prueba2 van a ser actualizados con los valores de prueba1, y en el
caso de que no exista el registro se insertan en prueba2.
MERGE INTO prueba2
USING (prueba1)
ON (prueba2.id1 = prueba1.id1)
WHEN MATCHED THEN
UPDATE SET
prueba2.id2 = prueba1.id2
WHEN NOT MATCHED THEN
INSERT (id1,id2)
VALUES (prueba1.id1, prueba1.id2)
Creación de directorio en Oracle
Para crear un directorio como recurso en oracle debemos ejecutar lo siguiente:
CREATE OR REPLACE DIRECTORY XMLDIR AS '/home/usuario/Desktop';
Suscribirse a:
Entradas (Atom)
-
Para poder insertar saltos de línea con el comando echo en linux se usa la siguiente sintaxis : echo -e "\n linea 1 \n linea 2 \n...
-
Para obtener una lista con los objetos bloqueados ejecucutados: select substr(a.os_user_name,1,8) "OS User" , substr(b.object_na...
-
Para obtener cuando se creó una tabla usaremos la siguiente consulta: select object_name, created from user_objects where object_name = ...