sábado, 13 de julio de 2019

ORA-01543: tablespace already exists al crear un tablespace

ORA-01543: tablespace already exists al crear un tablespace


Hola.


Este error me sale al correr una instalación que contiene scripts SQL de Oracle. Los cuales se ejecutan como parte de la instalación.

Después de varios intentos y al toparme con varios errores en diferentes partes de la instalación, he ejecutado el mismo script en un par de ocasiones y esto provocó que haya creado un tablespace con anterioridad.

Al intentar correr la instalación nuevamente, me sale este error:

ORA-01543: tablespace already exists al crear un tablespace

En este caso lo que hice es asegurarme de borrar el TABLESPACE completamente para volver a ejecutar el script de instalación sin problemas.

Solución.


Hay diferentes maneras de borrar un TABLESPACE pero la más completa que encontré y que me funcionó es esta:

sql> DROP TABLESPACE mitablespace INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

Esto aplica también para tablespaces temporales


Espero les sirva.








miércoles, 10 de julio de 2019

ORA-01031: insufficient privileges al crear un tablespace

ORA-01031: insufficient privileges al crear un tablespace


Hola.

El error de arriba se presenta cuando estás intentando un CREATE TABLESPACE o también algún CREATE TEMPORARY TABLESPACE en su base de datos y el usuario no tiene permiso para crear tablespaces.

Ejemplo:

sql> CREATE TABLESPACE mitablespace;
ORA-01031: insufficient privileges 


Solución.

Bien pues nada del otro mundo, asigna permiso de creación de tablespace al usuario con el que ejecutas la instrucción:

sql> GRANT CREATE TABLESPACE TO miusuario;


Intenten nuevamente la instrucción y está hecho.


Espero les sirva.










miércoles, 3 de julio de 2019

ORA-01940: cannot drop a user that is currently connected

ORA-01940: cannot drop a user that is currently connected


Hola.

Estoy intentando eliminar un usuario de Oracle 11g porque mi instalación básicamente no me sale. No quiero contarles mis penas sobre por qué me la paso escribiendo sobre errores de Oracle y no viviendo la vida así que hoy les escribo cómo solucionar este error:

ORA-01940: cannot drop a user that is currently connected

Para no hacer largo el cuento les pongo la solución muy interesante que encontré para identificar las sesiones conectadas y cómo matarlas.

Lo que estoy intentando es un DROP USER así:

sql>DROP USER miusuario CASCADE;

Como ven el error claramente dice que hay sesiones de usuario abiertas o conectadas por lo que primero debemos saber cuales son. Para esto ejecuten el siguiente query desde un usuario con permisos, digamos el usuario system:

SELECT v$session.sid, v$session.serial#, v$session.status, v$process.spid 
FROM v$session, v$process 
WHERE v$session.username = 'miusuario' 
AND v$process.addr (+) = v$session.paddr;


sid   serial# status           spid
---    ---       ------             ----
592 171    INACTIVE 20437


El campo spid les dice el número de proceso id a nivel sistema operativo que se está conectando a la base de datos. Con esta información fácilmente pueden identificar el proceso y matarlo.

Para ver mas información acerca del proceso en su sistema operativo Linux pueden usar el siguiente comando:

[oracle@edqtrn bin]$ ps -ef | grep <spid>

Ya que lo vieron y deciden que puede morir, ejecuten el siguiente comando:

[oracle@edqtrn bin]$ sudo kill -9 <spid>

Hagan esto por cuantos resultados de procesos les haya devuelto el query. En cuanto terminen vuelvan a ejecutar el DROP USER y ya deben poder eliminar el usuario.

sql>DROP USER miusuario CASCADE;
User dropped


Espero les sirva.










martes, 2 de julio de 2019

Cómo agregar espacio a vmdk de VirtualBox en Mac OS

Cómo agregar espacio a máquina virtual Linux en VirtualBox desde Mac


Hola.

Estuve trabajando en una instalación de software con mi máquina virtual Linux en VirtualBox desde mi Mac.

Me encontré con un error de espacio insuficiente al intentar hacer mi instalación: insufficient disk space available for selected location.

Al checar el espacio obtengo un 98% de espacio usado de 29G en /dev/mapper/vg_edqtrn-lv_root

[oracle@edqtrn ~]$ df -H
Filesystem                                        Size  Used Avail Use% Mounted on
/dev/mapper/vg_edqtrn-lv_root   29G   27G  656M  98% /                    
tmpfs                                                2.1G  748M  1.4G  37% /dev/shm
/dev/sda1                                          500M  211M  259M  45% /boot
/dev/sdb1                                          107G   18G   84G  18% /apps
Downloads                                       501G  389G  112G  78% /media/sf_Downloads
share                                                 501G  389G  112G  78% /media/sf_share

Buscando un poco me di cuenta que no hay manera de agregar espacio a la máquina virtual desde VirtualBox de manera fácil. Estaba buscando algo como sólo aumentar el número de GB desde VirtualBox y encender la máquina pero el proceso es un poco más complicado.

Les pongo aquí los pasos que utilice para agregar más espacio a la maquina virtual desde Mac.


Si no está apagada su maquina virtual, apáguenla primero.

1. Abrir una terminal de Mac e ir a la ubicación donde se encuentra los archivos de la máquina virtual y ejecutar los siguientes comandos:

#lo pasamos a formato vdi
VBoxManage clonehd "midisco.vmdk" "nuevo-midisco.vdi" --format vdi 
#redimensionamos el espacio a 60GB
VBoxManage modifyhd "nuevo-midisco.vdi" --resize 60000
#regresamos a formato vmdk
VBoxManage clonehd "nuevo-midisco.vdi" "resized-midisco.vmdk" --format vmdk

2. Desde VirtualBox remuevan el disco que clonaron "midisco.vmdk" y agreguen el nuevo redimensionado "resized-midisco.vmdk"

VirtuaBox-Settings-Storage-Controller-SATA

Para poder usar el nuevo espacio, se debe extender el espacio usando gparted.

3. Descarguen GParted de aquí http://gparted.org/download.php 

4. Agregar un disco (Add optical drive) apuntando al archivo iso descargado en: VirtualBox > Settings > Storage > Controller IDE.

VirtuaBox-Settings-Storage-Controller-IDE-Controller

5. Iniciar la máquina virtual y aceptar las opciones default hasta llegar a la pantalla principal de GParted. Ahí deben extender con el mouse para ocupar todo el espacio unallocated del disco. Chequen las imágenes de abajo.


GParted-Unallocated


GParted-Allocated

Click en la palomita verde de arriba para aplicar los cambios y reinicien la máquina.

Hasta aquí el espacio ya está disponible para usar dentro de la maquina virtual pero aun falta algo!

6. Ejecutar la siguiente instrucción lvextend para extender el espacio en el file system especificado.

[oracle@edqtrn ~]$ sudo lvextend --size +20G --resizefs /dev/mapper/vg_edqtrn/lv_root
Size of logical volume vg_edqtrn/lv_root changed from 36.98 GiB (9468 extents) to 46.98 GiB (12028 extents).
Logical volume lv_root successfully resized.
resize2fs 1.43-WIP (20-Jun-2013)
Filesystem at /dev/mapper/vg_edqtrn-lv_root is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/mapper/vg_edqtrn-lv_root is now 12316672 blocks long.

Validando el espacio disponible con df -H ya veo el nuevo espacio disponible. Tenía 30, le agregué 20 y me quedan 10 disponibles que no asigno por el momento.

[oracle@edqtrn ~]$ df -H
Filesystem                                       Size  Used Avail Use% Mounted on
/dev/mapper/vg_edqtrn-lv_root   50G   27G   21G  56% /
tmpfs                                               2.1G  748M  1.4G  37% /dev/shm
/dev/sda1                                         500M  211M  259M  45% /boot
/dev/sdb1                                         107G   18G   84G  18% /apps
Downloads                                      501G  389G  112G  78% /media/sf_Downloads
share                                                501G  389G  112G  78% /media/sf_share


Después de todo este show, ya me fue posible realizar la instalación del software en la máquina virtual.

Hubiera preferido algún método más sencillo que no me quitara todo el día pero esto fue lo mejor que encontré.


Espero les sirva.





Cómo ordenar aleatorio un query en Oracle

Cómo ordenar aleatorio un query en Oracle


Hola.

Requiero hacer un listado de base de datos Oracle que muestre los elementos con un orden aleatorio o random.

Un poco extraño el requerimiento pero se necesita que los registros no tengan orden debido a cuestiones comerciales de no dar preferencia a ningún resultado de la consulta.

Así que investigando cómo ordenar aleatorio me encontré con la instrucción dbms_random.value
Estoy usando Oracle 11g y la instrucción funciona a la perfección trayendo resultados random cada vez que lo ejecuto.

Solución.

Así deben hacer el ORDER BY:

SELECT campo, campo2 FROM MiTabla ORDER BY dbms_random.value;

Con esto ya tienen el ordenamiento aleatorio.


Espero les sirva.