Antón María Rodríguez Yuste

 
 
 
  • About

    Consultor orientado al sector TELCO (eTOM, SID), dirección de proyectos (scrum) y sistemas (Oracle, Weblogic, Jboss, Solaris, etc.). Un poco de todo, vamos.

  • Varios

Sindicación


Licencia


Validación



Sistemas






Varios

 
Samba on CentOS November 28th, 2007

Bien es sabido que no soy amigo de las intergraces gráficas pero estando en CentOS decidí probar a ver que tal. Obviamente solo era para compartir el HOME de un usuario, tampoco puede ser tan complicado ;-) Lo primero:

CODE:
  1. yum install system-config-samba

Y luego lo ejecuté como root:

CODE:
  1. system-config-samba

Configuré las cuatro cosas que tiene (poco o nada...).

Y me calqué un:

CODE:
  1. service smb reload

A ver.... funciona!

Permisos sobre una tabla de Oracle November 28th, 2007

Lo malo de ser autodidacta y aprender algo nuevo al mismo tiempo que se usa es que te dejas un montón de cosas básicas por el camino. Una de ellas es, por ejemplo, darle permisos a un usuario (1) de la BD para borrar registros en la tabla de otro usuario (2). Sencillo, como system:

CODE:
  1. GRANT delete ON usuario2.tabla TO usuario1;

Y si además, queremos que usuario1 pueda darle permisos a un usuario3:

CODE:
  1. GRANT delete ON usuario2.tabla TO usuario1 WITH GRANT OPTION;
Copiando usuarios sin el contenido en Oracle November 26th, 2007

La idea, copiar el schema de un usuario a otro pero sin copiar el contenido de todas sus tablas. La solución, una vez creado el usuario2. Hacer el export del usuario1:

CODE:
  1. ORACLE_SID=sid_de_la_BD exp usuario1/contraseña file=archivo.dmp rows=n direct=y

y luego el import.

CODE:
  1. ORACLE_SID=sid_de_la_BD imp system/manager file=archivo.dmp fromuser=usuario1 touser=usuario2 commit=y

Gracias por la ayuda, Rober.

Nota: no lo hice del todo bien, el usuario con el que hacemos el export/import debe ser el system y luego usarl el fromuser touser.

Algo más de info: elholgazan

ORA-03297 November 23rd, 2007

Dejé que un tablespace creciera de forma descontrolada con la idea de con el OEM volverlo a su tamaño después. Pero al hacer el resize me saltaba un ORA-03297: file contains used data beyond requested RESIZE value . Al final se optó por crear un nuevo archivo de datos y un nuevo tablespace y borrar el anterior. Todo ello con el OEM salvo la asignacion que se hizo así:

CODE:
  1. alter system set undo_tablespace = NUEVO_TABLESPACE  scope = memory;

y una vez borrado y vuelto a crear:

CODE:
  1. alter system set undo_tablespace = VIEJO_TABLESPACE  scope = memory;

Otra vez, Richi, gracias.

Sustituir retornos de carro por espacios en blanco con bash November 22nd, 2007

Fácil:

CODE:
  1. cat nombre.txt |while read line; do echo -n "${line} "; done

Listo.

AUTOCOMMIT ORACLE November 22nd, 2007

Vamos a poner un pequeño caso práctico. Se trata de duplicar un usuario con todo su contenido en una base de datos Oracle. Luego, además, le pegamos un repaso para eliminar todo aquello que ocupe demasiado ya que el nuevo usuario no se va a usar para las mismas funcionalidades.

Veamos, lo primero. Nos vamos al SQL/Developer y le damos a View sobre el usuario en cuestión. Luego a ViewSql. Copiamos el código, modificamos el nombre y añadimos una password y lo ejecutamos como usuario system.

CODE:
  1.  
  2. -- Create the user
  3. create user PICOCORBA
  4.   identified by "password";
  5. -- Grant/Revoke role privileges
  6. grant connect to PICOCORBA;
  7. grant resource to PICOCORBA;
  8. -- Grant/Revoke system privileges
  9. grant unlimited tablespace to PICOCORBA;
  10.  

Ahora hacemos un export de la BD del usuario que queremos importar.

CODE:
  1. ORACLE_SID=se2 exp userid=pico/password direct=y file=host-se2_chanante-pico-071122.dmp

y lo importamos en el nuevo usuario:

CODE:
  1. ORACLE_SID=se2 imp userid=picocorba/password file=chanante-se2_chanante-pico-071122.dmp log=chanante-se2_chanante-picorba-071122.log full=y

Vamos ahora a echar un vistazo al tamaño de las tablas. Ejecutamos como el nuevo usuario:

CODE:
  1. select segment_name, bytes/1024/1024 MB from user_segments
  2. where segment_type='TABLE' order by bytes desc;

Ok, vamos a vaciar todas aquellas tablas que ocupen más de un mega. Ejecutamos como el nuevo usuario:

CODE:
  1. select 'delete from ' || segment_name ||' cascade;' from user_segments
  2. where segment_type='TABLE' and bytes/1024/1024> 1 order by bytes desc;

Cojemos el resultado de la query, lo pegamos en el PL/SQL Developer o en sqlplus y listo.. o no. Si las tablas son realmente grande se puede petar el tablespace temporal ya que se guarda toda la información para el posible rollback. ¿Como arreglarlo?. Ejecutando antes:

CODE:
  1. set autocommit on

Luego todos los delete from y finalmente:

CODE:
  1. set autocommit off
ORA 25153 Temporary tablespace is empty November 20th, 2007

Cuando Richi se sienta a mi lado, aprendo más cosas de las que soy capaz de retener.

El motivo, un error ORA 25153 Temporary tablespace is empty. La solución fué sencilla. Con el OEM comprobamos que el tablespace Temp no estaba asignado a un fichero. Lo hicimos y fiesta. Funca.

Ya puestos, nos pusimos a mirar como mejorar la querie que arrojaba el citado error. Miramos si se calculaban las estadísticas:

CODE:
  1. select * from all_tables at where at.owner = 'USUARIO'

Y como no lo hacia, lo hicimos.

CODE:
  1. declare
  2.  atObj dbms_stats.ObjectTab;
  3. begin
  4.  dbms_stats.gather_schema_stats(ownname => 'USUARIO', objlist => atObj);
  5. end; 

Luego la pegamos en un Explain Plan Window del PL/SQL Developer. Vimos los macheos y como creando un índice se solucionaba parte de la papeleta aunque no toda (a menos de la mitad).

También me quedé con dos buenas coplas:
1) Evitar el uso de DB_LINKS y cosas de ese estilo que permiten mayor versatilidad donde no siempre es necesaria a costa de la eficiencia.
2) No usar construir las queries como texto y luego usar 'execute immediate' en el código PL/SQL Developer. Muucho mejor usar directamente la querie haya donde podamos hacerlo.
3) Siempre usar variables internas en las queries.

También me he quedado con la copla de que fuente usar para desarrollar. La "afortunada" va a ser Bitstream Vera Sans Mono. Los motivos aqui.

En fin, creo que nada más. Parecen tonterías pero son cosas que sólo aprendes a base de experiencia y yo, personalmente, las valoro mucho. Gracias, tio.

AWR Reports November 20th, 2007

Vamos a echar un vistazo a que se podría mejorar en nuestra base de datos haciendo uso de un par de herramientas.

Nos conectamos como 'sqlplus' y ejecutamos lo siguiente:

CODE:
  1. SYSTEM chanante_mslvenv5> @$ORACLE_HOME/rdbms/admin/awrrpt.sql
  2. Tambien:
  3. SYSTEM chanante_mslvenv5> @$ORACLE_HOME/rdbms/admin/awrrpti.sql
  4. SYSTEM chanante_mslvenv5> @$ORACLE_HOME/rdbms/admin/awrinput.sql
  5.  

Pero nos da un error de vistas desconocidas. Probablemente no sirva para la 9i. Mejor usamos STATSPACK. Pero hoy tengo el agua al cuello así que mejor lo dejamos para mañana. Los enlaces que voy siguiendo:

http://www.akadia.com/services/ora_statspack_survival_guide.html
http://users.telenet.be/oraguy.be/Statspack1.htm

Y dejo pendiente de ver que es http://www.txmemsys.com/statspack-reg.htm

Mas info sobre AWR Reports

FreeNx en CentOS November 20th, 2007

He instalado el FreeNX en centOS con la idea de usar sólo un entorno. Fue relativamente fácil de instalar siguiendo este tutorial pero hubo sus problemas, más bien relacionados con el cliente de windows. Principalmente, tuve que editar el fichero de la sesión que creé (lo encontré en C:\Documents and Settings\miusuario\.nx\config ) y le tuve que cambiar la clave RSA que usa a la que se crea en el servidor (/home/.nx//.ssh/client.id_dsa.key). También tuve que cambiar la siguientes directivas para no tener problemas con el teclado:

CODE:
  1.  
  2. <option key="Current keyboard" value="false" />
  3. <option key="Custom keyboard layout" value="es" />
  4.  

Por ahora, funciona bastante bien. Sin queja. Quizá lo único es que me funciona el portapapeles de windows a linux pero no viceversa :-(

Corrección: si que funciona :-)

Constraints Oracle November 19th, 2007

Los errores tipicos:

CODE:
  1. ORA-00001: unique constraint (PA.SYS_C004027) violated

Intentamos meter en una tabla algo con el mismo ID (ver unique de oracle). Para averiguar la tabla en cuestión:

CODE:
  1. select table_name from all_indexes where index_name='SYS_C004027';
CODE:
  1. ORA-02292: integrity constraint (PA.SYS_C004039) violated - child record found

Intentamos borrar una registro que está referenciado en otra tabla.

Para averiguar la tabla en cuestión:

CODE:
  1. select table_name from USER_CONSTRAINTS  where constraint_name='SYS_C004039';

Otra posibilidad, mucho menos recomendable, es desactivarlas.

CODE:
  1. alter table NOMBRE_TABLA disable constraint CK_NOMBRE_CONSTRAINT;