tag:blogger.com,1999:blog-81079602837132666252024-03-13T10:09:29.720-06:00BLOG-A-TECHrevisiones, comentarios u opiniones sobre sistemasEstergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-8107960283713266625.post-72443262116975186742010-08-24T12:13:00.001-05:002014-05-31T21:48:52.928-05:00PiensaLeyendo el libro de Tom Kyte "Expert Oracle Database Architecture, Segunda Edición", me pareció excelente el prefacio escrito por Ken Jacobs en el cual escribe sobre cómo una palabra usada en 1914 por Thomas J. Watson para transmitirles una idea a los trabajadores en IBM, no importando su puesto, teniendo cuidado en la toma de desiciones además de hacer el trabajo con inteligencia.<br />
<br />
Jacobs hace énfasis sobre la "experiencia convencional" que existe en la comunidad Oracle sobre como optimizar para un mejor rendimiento o la mejor manera de usar varias características de Oracle. Esta experiencia que algunas veces se vuelve folclore o incluso mito y que tanto desarrolladores como administradores de bases de datos aplican ciegamente o van más allá pero sin razonamiento alguno.<br />
<a href="https://www.blogger.com/null" id="more"></a><br />
Un ejemplo de lo anterior es la idea de "si uno es bueno, más -muchos más- son mejor". La idea es popular, pero no siempre cierta. La interfaz de arreglo de Oracle, por ejemplo, que permite a los desarrolladores insertar o extraer varios registros con una sola llamada reduciendo asi el número de mensajes de red entre la aplicación y la base de datos lo cual es bueno. Pero si lo analizas, hay un punto en el que el rendimiento decrece. Es mucho mejor transportar 100 registros a la vez que 1,000 ya que para este último caso el método ya no es eficiente, especialmente por requerimientos de memoria.<br />
<br />
Otro ejemplo es cuando se enfoca en aspectos equivocados del diseño o configuración del sistema, en lugar de aquellos en los que se puede mejorar el rendimiento (o, si es el caso, confiabilidad, disponibilidad o seguridad). Considera la experiencia convencional de optimizar el sistema para maximizar el 'buffer hit ratio'. Para algunas aplicaciones, es verdad que maximizar la oportunidad de que el sistema encuentre los datos en memoria aumentará el rendimiento. Sin embargo, en la mayoría de sistemas lo mejor es enfocarse en los cuellos de botella (lo que en el argot de Oracle se conocen como "wait states"), en lugar de centrarse en indicadores específicos. Atacarlas desde el diseño asegurará que el sistema tenga un buen desempeño.<br />
<br />
A veces, buenas prácticas que se basaban, en parte, en un grado de certeza ya no aplican cuando los hechos cambian. Considera el viejo adagio, "poner índices y datos en distintos tablespaces para un mejor rendimiento". Hay administradores de base de datos que defienden a capa y espada esta idea sin tomar en consideración cambios en la velocidad de los discos y su capacidad, o lo relacionado con cargas de trabajo. Al evaluar esta "regla", se debería pensar en el <i>hecho</i> de que Oracle carga en memoria los bloques de base de datos usados recientemente y con frecuencia (a menudo bloques que pertenecen a un índice), y en el <i>hecho</i> de que hace uso de estos bloques de manera secuencial, no simultánea, para cualquier petición. Esto implica que las operaciones de I/O tanto para índices como para datos deberían repartirse entre todos los usuarios simultáneos y repartirse en todos los discos de los que se pueda disponer. Puedes elegir separar índices y datos por razones administrativas o por preferencia personal, pero no por rendimiento. Lo importante de esto es basar las decisiones en hechos, bastantes hechos.<br />
<br />
No importa que tan veloces sean nuestras computadoras o que tan sofisticada pueda llegar a ser la base de datos, e independientemente del poder de nuestras herramientas de programación, simplemente no hay sustituto para la inteligencia humana acompañada con una "disciplina pensante". Si bien es importante aprender las complejidades de las tecnologías que usamos en nuestras aplicaciones, es aún más importante saber como pensar en darles el uso apropiado.<br />
<br />
El libro de Tom no solo enseña sobre características de Oracle y como usarlas, también refleja muchos de estos pensamientos sencillos:<br />
<ul>
<li>No creas en mitos. Razona por tí mismo.</li>
<li>No te vayas con la experiencia convencional. ¡A menudo las cosas que todo mundo sabe simplemente están mal!</li>
<li>Desconfia de los rumores u opiniones. Prueba las cosas tu mismo y fundamenta tus decisiones en ejemplos hechos.</li>
<li>Divide el problema en preguntas simples y arma las respuestas a cada paso en una solución elegante y eficiente.</li>
<li>No ejecutes cosas en tus programas cuando la base de datos las puede hacer mejor y más rápido.</li>
<li>Investiga sobre el tema y se escéptico de políticas injustificadas en la empresa para estándares técnicos.</li>
<li>Tómate el tiempo para PENSAR.</li>
</ul>
<br />
<b>Aunado a esto, yo agregaría además los consejos de <a href="http://sartigas.blogspot.com/2009/10/algunos-consejos-1ra-parte.html">Steven Feuerstein</a> que publiqué hace unos posts atrás. Si bien es cierto que lo ideal siempre es tener el tiempo y el equipo para hacer todas las pruebas que se necesitan la realidad es que pocas veces se tienen, muchas veces quizá por la falta de tiempo muchos se quedan con la idea de que lo que vieron que a otros les funcionó también funcionará para ellos y posiblemente así sea, sin embargo, con tantas combinaciones en cuanto a Oracle como base de datos, sistemas operativos y hardware, se podría tomar como base ese conocimiento pero queda de uno el probar que efectivamente será la solución del problema.<br /><br />Una vez que tienes como solucionar el problema es importante ver también las implicaciones hacia los demás ya que en lugar de solucionarlo podrías estarlo solo cambiando de lugar.</b>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com2tag:blogger.com,1999:blog-8107960283713266625.post-53601660342964303502010-08-16T18:03:00.000-05:002014-05-31T21:42:33.163-05:00ORA-01220: file based sort illegal before database is open<img alt="" border="0" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" id="BLOGGER_PHOTO_ID_5351467101110248818" style="float: left; height: 100px; margin: 5px 10px 0px 0px; width: 200px;" /><br />
<div style="text-align: justify;">
Hace unos días trabajando con RMAN me topé con el mensaje <span style="font-family: inherit;">descrito en el título. Se trataba de una base aún preproductiva y menor de 50 Gb de tamaño con un poco más de 30 datafiles. La actividad en ese momento consistía en restaurar los más de 30 datafiles junto con los control files, es decir, se simuló el peor escenario donde "todos" los archivos de base de datos se pierden. Con todos entre comillas me refiero solo a los archivos</span> que se pueden restaurar desde RMAN, ya que la base incluye otros archivos más que no se consideran críticos para echar a andar un respaldo.<br />
<br />
El mensaje completo es:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">RMAN-00571: ===========================================================</span><br />
<span style="font-family: "Courier New", Courier, monospace;">RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============</span><br />
<span style="font-family: "Courier New", Courier, monospace;">RMAN-00571: ===========================================================</span><br />
<span style="font-family: "Courier New", Courier, monospace;">RMAN-03002: failure of restore command at 08/11/2010 16:36:39</span><br />
<span style="font-family: "Courier New", Courier, monospace;">ORA-01220: file based sort illegal before database is open</span></div>
<a href="https://www.blogger.com/null" id="more"></a><span class="fullpost"><br />
Después de eliminar los control files junto con los más de 30 datafiles del filesystem, el comando para restaurarlos desde RMAN simplemente arrojó el mensaje anterior.<br />
<br />
De acuerdo con la documentación de Oracle, el mensaje <span style="font-family: "Courier New",Courier,monospace;">ORA-01220</span> se refiere a que se intentó ejecutar una consulta pero el buffer (memoria) para realizar ordenamientos no es lo suficientemente grande para llevarlo a cabo. Se trata específicamente de los parámetros <span style="font-family: "Courier New",Courier,monospace;">SORT_AREA_SIZE</span> y <span style="font-family: "Courier New",Courier,monospace;">SORT_AREA_RETAINED_SIZE</span>.<br />
<br />
</span><br />
<div class="code_block">
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">NAME TYPE VALUE</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">------------------------- -------- -------</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">nls_sort string</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">sort_area_retained_size integer 0</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">sort_area_size integer 65536</span></div>
<span class="fullpost"><br />
Por default en 10g, el parámetro <span style="font-family: "Courier New",Courier,monospace;">SORT_AREA_SIZE</span> tiene un valor de 64K y el parámetro <span style="font-family: "Courier New",Courier,monospace;">SORT_AREA_RETAINED_SIZE</span> tiene 0, puesto que RMAN requiere hacer un ordenamiento pero el tamaño del buffer no le alcanza para hacerlo, acude al segundo recurso que es el <span style="font-family: "Courier New",Courier,monospace;">TEMP</span> (tablespace temporal), sin embargo, como la base de datos en este momento solo se encuentra en estado <span style="font-family: "Courier New",Courier,monospace;">MOUNT</span> no es posible utilizar el TEMP, de ahí que el único recurso sea aumentar el valor de esos dos parámetros.<br />
<br />
</span><div class="code_block">
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> alter system set sort_area_size=10485760 scope=spfile;</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">System altered.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> alter system set sort_area_retained_size=10485760 scope=spfile;</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">System altered.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> shutdown immediate;</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">ORA-01109: database not open</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">Database dismounted.</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">ORACLE instance shut down.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> startup mount;</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">ORACLE instance started.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">Database mounted.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> show parameter sort</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">NAME TYPE VALUE</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">------------------------- -------- -------</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">nls_sort string</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">sort_area_retained_size integer 10485760</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">sort_area_size integer 10485760</span></div>
<span class="fullpost">
<br />
10 Mb deberían ser suficientes para lanzar el restore sin problemas. Una vez recuperado el respaldo y comprobado que la instancia abre sin problemas es necesario regresar los parámetros con sus valores originales. Como dba no lleva mucho tiempo darse cuenta de qué se trata y su posible solución, como implementador de soluciones de respaldo sin conocimientos profundos en RMAN u Oracle, como por ejemplo Data Protector de HP o Avamar de EMC que crean scripts personalizados para lanzarlos desde Recovery Manager, podría ser un dolor de cabeza ya que no tienen acceso para modificar parámetros -que de hecho no deberían hacerlo, solo previa autorización- o peor aún tardarse horas o días en encontrar de qué se trata el problema y aplicar la posible solución.</span><br /></div>
Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com1tag:blogger.com,1999:blog-8107960283713266625.post-24652615503630294972010-08-09T17:13:00.001-05:002010-08-09T17:16:21.932-05:00Y tu, ¿Qué aplicaciones Open Source usas?<div style="text-align: justify;">Todas las aplicaciones que instalamos en nuestras computadoras cuentan con un licenciamiento, comenzando por el sistema operativo. Las licencias van desde las que tienes que pagar recibiendo unicamente copia de los ejecutables hasta las que son libres (no confundir con gratis) y te dan acceso al código fuente.<br />
<br />
La gran diferencia entre el software "gratis" y el de "código abierto" es que el primero va implícito en el segundo pero en el segundo tienes la oportunidad de ver como es la aplicación por dentro, es decir, su código fuente. Como usuario final lo más importante es aprovechar al máximo la facilidad de uso que te brinda una aplicación, como desarrollador es interesante ver como son aplicadas diversas técnicas de programación, desde la forma de escribir el código hasta el empleo de paradigmas computacionales tanto simples como avanzados.<br />
<a id="more"></a><span class="fullpost"><br />
Las aplicaciones Open Source de uso cotidiano que no pueden faltar en mi máquina:<br />
<ul><li><a href="http://www.mozilla.com/en-US/products/firefox/">Firefox</a> - No necesita descripción.</li>
<li><a href="http://www.mozilla.com/en-US/products/thunderbird/">Thunderbird</a> - Excelente cliente de correo.</li>
<li><a href="http://www.workrave.org/">Workrave</a> - Te ayuda a hacer pausas en el uso de la computadora. Excelente para quienes pasan periodos largos de tiempo frente a una.</li>
<li><a href="http://notepad-plus-plus.org/">Notepad++</a> - Excelente editor de texto, con muchas y muy útiles opciones.</li>
<li><a href="http://www.winscp.org/">WinSCP</a> - Mejor y más completo cliente para transferencia de archivos que Filezilla (para mi gusto claro).</li>
<li><a href="http://sourceforge.net/projects/pdfcreator">PDFCreator</a> - Excelente aplicación para crear archivos PDF via una impresora virtual, con muchas otras opciones de formatos de salida, no solo PDF. Muy recomendable para esas ocasiones en que necesitas guardar páginas web.</li>
<li><a href="http://www.cygwin.com">Cygwin</a> - Emulador de comandos Linux para Windows. Recomendable para los administradores que no temen a la línea de comandos.</li>
<li><a href="http://www.privoxy.org">Privoxy</a> - ¿Cansado de ver sitios web donde lo que más resalta (y en osaciones estorba) es la publicidad? Con esta aplicación te olvidarás de toda esa basura visual.</li>
<li><a href="http://www.gimp.org">GIMP</a> - Excelente aplicación para manipular imágenes.</li>
<li><a href="http://www.bunkus.org/videotools/mkvtoolnix">MKVToolnix</a> - Excelente herramienta para manipular archivos tipo Matroska.</li>
<li><a href="htt://www.jubler.org">Jubler</a> - Muy buena aplicación para editar archivos de subtítulos (SRT) aunque podría ser todavía mejor.</li>
<li><a href="http://www.sharpdevelop.com">SharpDevelop</a> - Muy buena IDE para programar en C#, entre otros lenguajes de programación de la plataforma .NET</li>
<li><a href="http://sourceforge.net/projects/mpc-hc/">Media Player Classic - Home Cinema</a> - Reproductor multimedia con soporte para varios formatos multimedia.</li>
</ul></span> </div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com1tag:blogger.com,1999:blog-8107960283713266625.post-40873202751581735762010-08-06T08:00:00.002-05:002014-05-31T21:43:19.515-05:00Transporte de datos encriptados con ASO<img alt="" border="0" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" id="BLOGGER_PHOTO_ID_5364399772137510626" style="float: right; height: 100px; margin: 5px 0px 0px 10px; width: 200px;" /><br />
<div style="text-align: justify;">
Por default, la comunicación entre la base de datos y un cliente remoto se lleva a cabo sin ningún método de encriptamiento, es decir, que todas las instrucciones ejecutadas así como los datos pueden ser interceptados por alguien que esté a la escucha en la red usando un 'sniffer'. En empresas donde se maneja información confidencial el riesgo de fuga es muy alto por lo que alguien con habilidades en reconocimiento de patrones podría fácilmente hacerse de esta información.<br />
<br />
Oracle tiene una funcionalidad llamada 'Oracle Advanced Security' la cual es necesario configurar tanto en el servidor como en el cliente. Esta configuración se hace en el archivo <span style="font-family: "Courier New",Courier,monospace;">sqlnet.ora</span> por lo que no es necesario alterar las aplicaciones ni reiniciar la instancia. Las conexiones remotas hechas después de la configuración ya estarán empleando el método de encriptamiento que se haya definido no así las conexiones ya existentes.<br />
<a href="https://www.blogger.com/null" id="more"></a><span class="fullpost"><br />
En el esquema <span style="font-family: "Courier New",Courier,monospace;">SCOTT</span> tengo la tabla <span style="font-family: "Courier New",Courier,monospace;">CUSTOMER</span> con la siguiente definición y datos:<br />
</span><div class="code_block">
<span class="fullpost">SQL> select name,credit_card from scott.customer;</span><br />
<br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">NAME CREDIT_CARD</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">-------- --------------------</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">sergio 1234-1234-1234-1234</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">pedro 1234-1234-1234-1235</span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">juan 1234-1234-1234-1236</span></div>
<span class="fullpost"><br />
Usando la herramienta <a href="http://erwan.l.free.fr/">IP Tools</a> como 'sniffer' y aplicándolo al query anterior obtenemos lo siguiente.<br />
<br />
La definición:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs72y5JuGI/AAAAAAAAAMA/n091E_M-qvw/s1600/snif1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs72y5JuGI/AAAAAAAAAMA/n091E_M-qvw/s320/snif1.jpg" /></a></div>
<br />
y el resultado:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_t1WQBJYuFhI/TFs9Z-vSjnI/AAAAAAAAAMI/Z2_L29mZrK4/s1600/snif2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/TFs9Z-vSjnI/AAAAAAAAAMI/Z2_L29mZrK4/s320/snif2.jpg" /><span id="goog_1010877947"></span><span id="goog_1010877948"></span></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/_t1WQBJYuFhI/TFs9fz-oVcI/AAAAAAAAAMQ/F7H_D0URbwk/s1600/snif3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/TFs9fz-oVcI/AAAAAAAAAMQ/F7H_D0URbwk/s320/snif3.jpg" /></a></div>
<br />
Además de muchos caracteres conocidos y otro tanto extraños, vemos que se logra distinguir a simple vista los nombres 'sergio', 'pedro', 'juan' acompañados de sus números de tarjetas de crédito. En un ambiente productivo esta situación por supuesto que no es aceptable.<br />
<br />
He aquí donde entra en juego la seguridad a través de encriptamiento.<br />
<br />
Usando la herramienta 'Oracle Net Manager' expandes el nodo 'Local' y seleccionas 'Profile'. En la parte superior del panel derecho abres el 'combo box' y seleccionas 'Oracle Advanced Security'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFtAhYBtK5I/AAAAAAAAANQ/9b6sJJPcAbU/s1600/netmgr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFtAhYBtK5I/AAAAAAAAANQ/9b6sJJPcAbU/s320/netmgr.jpg" /></a></div>
<br />
Si la opción 'Oracle Advanced Security' no aparece desplegada, tendrás que hacer lo siguiente. Edita el archivo <span style="font-family: "Courier New",Courier,monospace;">NetProperties</span> del directorio <span style="font-family: "Courier New",Courier,monospace;">$ORACLE_HOME/network/tools</span>, y agrega "<span style="font-family: "Courier New",Courier,monospace;">ASO</span>" al final de la línea que comienza con "<span style="font-family: "Courier New",Courier,monospace;">INSTALLEDCOMPONENTS</span>".<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">INSTALLEDCOMPONENTS=CLIENT,ORACLENET,ANO,ASO</span></div>
<br />
Cierra el 'Oracle Net Manager' y ejecútalo nuevamente, la opción 'Oracle Advanced Security' ya debería aparecer.<br />
<br />
Selecciona la pestaña 'Integrity', en el item 'Integrity' selecciona "SERVER", en 'Checksum Level' selecciona "requested" y en la lista 'Available Methods' selecciona "MD5" y presiona el botón con '>'<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs_D0MdIAI/AAAAAAAAAMw/3FBZg8snfME/s1600/integrity_server.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs_D0MdIAI/AAAAAAAAAMw/3FBZg8snfME/s320/integrity_server.jpg" /></a></div>
<br />
Después selecciona la pestaña 'Encryption', en el item 'Encryption' selecciona "SERVER", en 'Encryption Type' selecciona "requested", en 'Encryption Seed' escribe una cadena lo suficientemente larga que servirá para hacer el cifrado y en la lista 'Available Methods' selecciona "3DES168" y presiona el botón con '>'<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/_t1WQBJYuFhI/TFs_JvoxHvI/AAAAAAAAAM4/c2xsBpk9yic/s1600/encryption_server.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/TFs_JvoxHvI/AAAAAAAAAM4/c2xsBpk9yic/s320/encryption_server.jpg" /></a></div>
<br />
La configuración en cada uno de los clientes es básicamente la misma, solo tienes que cambiar el valor de los items 'Integrity' y 'Encryption' de "SERVER" a "CLIENT" y especificar en 'Encryption Seed' una cadena totalmente distinta a la del servidor.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs_PDTEHBI/AAAAAAAAANA/k6TMnM2CMdc/s1600/integrity_client.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs_PDTEHBI/AAAAAAAAANA/k6TMnM2CMdc/s320/integrity_client.jpg" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFs_WBbmI4I/AAAAAAAAANI/IeBRLdz2sho/s1600/encryption_client.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFs_WBbmI4I/AAAAAAAAANI/IeBRLdz2sho/s320/encryption_client.jpg" /></a></div>
<br />
No olvides grabar las configuraciones hechas en 'Oracle Net Manager' (File -> Save Network Configuration), luego cuando se nos olvida nos preguntamos por qué no funciona e incluso se llega a buscar una solución más allá del problema, suele pasar :) .<br />
<br />
Finalmente, para probar que todo funciona correctamente hay que cerrar la sesión de SQL*Plus, abrir una nueva, habilitar el 'sniffer' y ejecutar el query sobre la tabla scott.customer nuevamente.<br />
<br />
Vemos ahora que solo aparece un conjunto de caracteres sin sentido y no es posible ver la definición:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs-o71l7II/AAAAAAAAAMY/wqrttHdAolc/s1600/snif4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TFs-o71l7II/AAAAAAAAAMY/wqrttHdAolc/s320/snif4.jpg" /></a></div>
<br />
así como tampoco es posible ver ya los datos:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_t1WQBJYuFhI/TFs-vnT7X4I/AAAAAAAAAMg/t-L4FkaOUYc/s1600/snif5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/TFs-vnT7X4I/AAAAAAAAAMg/t-L4FkaOUYc/s320/snif5.jpg" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFs-0CjuT9I/AAAAAAAAAMo/DaURtsN-RZs/s1600/snif6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/TFs-0CjuT9I/AAAAAAAAAMo/DaURtsN-RZs/s320/snif6.jpg" /></a></div>
<br />
Todos los métodos de encriptamiento mostrados en 'Oracle Net Manager' son estándares industriales, por lo que dependerá prácticamente del grado de encriptamiento que se requiera el que se elija cualquiera de ellos.<br />
<br />
¿Cambios en las aplicaciones? Ninguno. ¿Suspensión del servicio de base de datos? Ninguno. ¿Grado de confiabilidad? Completo.<br />
<br />
Nota: Como la mayoría de "componentes extra" que vienen con la base de datos, es posible que esta funcionalidad tenga un costo de licenciamiento extra por lo que recomendaría verificarlo antes de implementarlo en un ambiente productivo.</span><br /></div>
Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-26336061738891197802010-08-04T11:25:00.001-05:002014-05-31T21:51:42.871-05:00Obteniendo DDLs con Oracle export/import y Pretoria<img alt="" border="0" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" id="BLOGGER_PHOTO_ID_5351467101110248818" style="float: left; height: 100px; margin: 5px 10px 0px 0px; width: 200px;" /><br />
<div style="text-align: justify;">
Una manera rápida y elegante de extraer las instrucciones <a href="http://en.wikipedia.org/wiki/Data_Definition_Language">DDL</a> de la base de datos es crear un archivo dmp solo con las estructuras, extraer las instrucciones SQL con import (opción indexfile) y aplicarle formato con Pretoria.<br />
<br />
<a href="http://sourceforge.net/projects/pretoria/">Pretoria</a> es una herramienta que analiza la estructura del archivo creado con import -específicamente con la opción indexfile-. Puede buscar y reemplazar los parámetros de almacenamiento de las tablas, índices y clusters, además de separar las instrucciones de creación de tablas e índices en su propio archivo. Con estos archivos se pueden pre-crear todos los segmentos de la base de datos, básicamente para reorganizarla. Si se tiene una base de datos con cientos de tablas, hacer una reorganización manual en las instrucciones DDL llevaría mucho tiempo. Emplear Pretoria toma solo unos minutos.<br />
<br />
<h3>
Creando el archivo dmp</h3>
La herramienta de Oracle export básicamente lo que hace es extraer la definición de los segmentos de base de datos (tablas, índices) y los datos que contienen. Para este ejercicio usaré el esquema SCOTT creado por Oracle como parte de los esquemas de ejemplo para una base de datos 10gR2 montada en Linux RHEL 4.<br />
<a href="https://www.blogger.com/null" id="more"></a><span class="fullpost"><br />
Si SCOTT está bloqueado, habrá que desbloquearlo y asignarle una contraseña.<br />
</span><br />
<div class="code_block">
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> alter user scott account unlock;</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">User altered.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">SQL> alter user scott identified by tiger;</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span class="fullpost" style="font-family: "Courier New", Courier, monospace;">User altered.</span></div>
<span class="fullpost"><br />
Se ejecuta el export sin segmentos de bd.<br />
</span><div class="code_block">
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">[oracle@testserver ~]$ exp scott/tiger@orcl file=~/sch_scott.dmp owner=scott grants=n rows=n statistics=none</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;"></span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Export: Release 10.2.0.4.0 - Production on Tue Aug 3 12:40:14 2010</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;"></span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Copyright (c) 1982, 2007, Oracle. All rights reserved.</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;"></span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;"></span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">With the Partitioning, OLAP, Data Mining and Real Application Testing options</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Export done in US7ASCII character set and AL16UTF16 NCHAR character set</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">server uses AL32UTF8 character set (possible charset conversion)</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Note: table data (rows) will not be exported</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Note: grants on tables/views/sequences/roles will not be exported</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting pre-schema procedural objects and actions</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting foreign function library names for user SCOTT </span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting PUBLIC type synonyms</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting private type synonyms</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting object type definitions for user SCOTT </span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">About to export SCOTT's objects ...</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting database links</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting sequence numbers</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting cluster definitions</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. about to export SCOTT's tables via Conventional Path ...</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table BONUS</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table DEPT</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table EMP</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table SALES</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table SALGRADE</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. . exporting table TEST3</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting synonyms</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting views</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting stored procedures</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting operators</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting referential integrity constraints</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting triggers</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting indextypes</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting bitmap, functional and extensible indexes</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting posttables actions</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting materialized views</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting snapshot logs</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting job queues</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting refresh groups and children</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting dimensions</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting post-schema procedural objects and actions</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">. exporting statistics</span></span><br />
<span class="fullpost"><span style="font-family: "Courier New", Courier, monospace;">Export terminated successfully without warnings.</span></span></div>
<span class="fullpost">
<br />
Puedes especificar en lugar de owner=y sea full=y o incluso por tablas específicas.<br />
<br />
<h3>
Creando el archivo indexfile</h3>
Se crea el archivo de índices -opción indexfile- con import.<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">[oracle@testserver ~]$ imp scott/tiger@orcl file=sch_scott.dmp fromuser=scott touser=scott indexfile=sch_scott.idx constraints=y</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">Import: Release 10.2.0.4.0 - Production on Tue Aug 3 12:47:02 2010</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">Copyright (c) 1982, 2007, Oracle. All rights reserved.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production</span><br />
<span style="font-family: "Courier New", Courier, monospace;">With the Partitioning, OLAP, Data Mining and Real Application Testing options</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">Export file created by EXPORT:V10.02.01 via conventional path</span><br />
<span style="font-family: "Courier New", Courier, monospace;">import done in US7ASCII character set and AL16UTF16 NCHAR character set</span><br />
<span style="font-family: "Courier New", Courier, monospace;">import server uses AL32UTF8 character set (possible charset conversion)</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Import terminated successfully without warnings.</span></div>
<br />
El archivo resultante 'sch_scott.idx' contiene las DDL de tablas, constraints e índices. Las dos primeras aparecen como comentarios (con REM al principio de la línea) lo único legible a primera vista son las instrucciones CREATE INDEX. Es aquí donde entra en juego la herramienta Pretoria. La ejecución del import con la opción indexfile en realidad no ejecuta ninguna instrucción DDL o importa datos (en caso de usar un archivo dmp completo) lo único que hace es extraer las DDLs y almacenarlas en el archivo especificado en la opción indexfile.<br />
<br />
<h3>
Segregando instrucciones DDL</h3>
Pretoria es en realidad un conjunto de clases Java convertidas a este lenguaje multiplataforma para evitar los inconvenientes que representa la codificación de shell scripts en los diferentes tipos de *nix particularmente la herramienta AWK. En la parte de documentación trae una gráfica con el esquema que los desarrolladores emplearon para hacerlo eficiente.<br />
<br />
Si lo que nos interesa es extraer las instrucciones DDL tal como están, basta con ejecutar la siguiente instrucción:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">[oracle@testserver ~]$ java Pretoria -i sch_scott.idx -ot scott_tables.ddl -oi scott_indexes.ddl -nc</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn input thread !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn process threads !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn output threads !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Input thread done !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">All done !</span></div>
<br />
Con esto, el archivo sch_scott.idx apenas legible a primera vista es procesado y dividido en dos archivos, uno con la definición de las tablas y otro con la definición de índices y constraints.<br />
<br />
Ejemplo de código sin aplicar Pretoria:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">REM CREATE TABLE "SCOTT"."BONUS" ("ENAME" VARCHAR2(10), "JOB" </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM VARCHAR2(9), "SAL" NUMBER, "COMM" NUMBER) PCTFREE 10 PCTUSED 40 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS ;</span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM CREATE TABLE "SCOTT"."DEPT" ("DEPTNO" NUMBER(2, 0), "DNAME" </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM VARCHAR2(14), "LOC" VARCHAR2(13)) PCTFREE 10 PCTUSED 40 INITRANS 1 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">REM BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS ;</span></div>
<br />
Ejemplo de código aplicando Pretoria:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">CREATE TABLE "SCOTT"."BONUS"</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( "ENAME" VARCHAR2 ( 10 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "JOB" VARCHAR2 ( 9 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "SAL" NUMBER ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "COMM" NUMBER ) </span><br />
<span style="font-family: "Courier New", Courier, monospace;">PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">STORAGE</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( INITIAL 65536</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELISTS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELIST GROUPS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> BUFFER_POOL DEFAULT ) TABLESPACE "USERS" LOGGING NOCOMPRESS ; </span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">CREATE TABLE "SCOTT"."DEPT"</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( "DEPTNO" NUMBER ( 2 ,0 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "DNAME" VARCHAR2 ( 14 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "LOC" VARCHAR2 ( 13 ) ) </span><br />
<span style="font-family: "Courier New", Courier, monospace;">PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">STORAGE</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( INITIAL 65536</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELISTS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELIST GROUPS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> BUFFER_POOL DEFAULT ) TABLESPACE "USERS" LOGGING NOCOMPRESS ;</span></div>
<br />
Ejemplo especificando archivo de parámetros.<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">[oracle@testserver ~]$ java Pretoria -s storage -i sch_scott.idx -ot scott_tables.ddl -oi scott_indexes.ddl -nc</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Hashing storage parameters...</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Done !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn input thread !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn process threads !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Spawn output threads !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Input thread done !</span><br />
<span style="font-family: "Courier New", Courier, monospace;">All done !</span></div>
<br />
El archivo parámetros debe contener lo que necesitamos actualizar en el script de salida. Para el ejemplo anterior solo especifiqué que actualice el tablespace para las tablas BONUS y DEPT:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">"SCOTT"."BONUS" TABLESPACE TS1</span><br />
<span style="font-family: "Courier New", Courier, monospace;">"SCOTT"."DEPT" TABLESPACE TS2</span></div>
<br />
Siendo el resultado:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">CREATE TABLE "SCOTT"."BONUS"</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( "ENAME" VARCHAR2 ( 10 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "JOB" VARCHAR2 ( 9 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "SAL" NUMBER ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "COMM" NUMBER ) </span><br />
<span style="font-family: "Courier New", Courier, monospace;">PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">STORAGE</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( INITIAL 65536</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELISTS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELIST GROUPS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> BUFFER_POOL DEFAULT ) TABLESPACE <b>TS1</b> LOGGING NOCOMPRESS ; </span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">CREATE TABLE "SCOTT"."DEPT"</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( "DEPTNO" NUMBER ( 2 ,0 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "DNAME" VARCHAR2 ( 14 ) ,</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> "LOC" VARCHAR2 ( 13 ) ) </span><br />
<span style="font-family: "Courier New", Courier, monospace;">PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 </span><br />
<span style="font-family: "Courier New", Courier, monospace;">STORAGE</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ( INITIAL 65536</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELISTS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> FREELIST GROUPS 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> BUFFER_POOL DEFAULT ) TABLESPACE <b>TS2</b> LOGGING NOCOMPRESS ;</span></div>
<br />
Cambiando el tablespace de USERS a TS1 para la tabla BONUS y TS2 para DEPT.<br />
<br />
Todavía mejor aún, si vas a reorganizar la base de datos moviendo las tablas de tablespace puedes hacerlo con la siguiente línea en el archivo de parámetros:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">DEFAULT_TABLE("SCOTT") TABLESPACE TS_DATA</span></div>
<br />
Haciendo que a todas las tablas del esquema SCOTT se les asigne el tablespace TS_DATA por default, bastante útil si se trata de cientos de tablas. Puedes incluso especificar el tablespace en tablas particulares, por ejemplo:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">DEFAULT_TABLE("SCOTT") TABLESPACE TS_DATA</span><br />
<span style="font-family: "Courier New", Courier, monospace;">"SCOTT"."BONUS" TABLESPACE TS1</span></div>
<br />
es decir, asigna por default a las tablas del esquema SCOTT el tablespace TS_DATA excepto a la tabla BONUS a la cual le vas a asignar TS1.<br />
<br />
Además del tablespace los parámetros que puedes especificar en el archivo para actualizar el script con estos valores están:<br />
<ul>
<li><span style="font-family: "Courier New", Courier, monospace;">PCTUSED</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">PCTFREE</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">INITIAL</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">NEXT</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">MINEXTENTS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">MAXEXTENTS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">PCTINCREASE</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">FREELISTS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">FREELIST GROUPS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">INITRANS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">MAXTRANS</span></li>
<span style="font-family: "Courier New", Courier, monospace;">
</span>
<li><span style="font-family: "Courier New", Courier, monospace;">DEGREE</span></li>
</ul>
<br />
El resto de las opciones que incluye Pretoria pueden verse ejecutando:<br />
<div class="code_block">
<span style="font-family: "Courier New", Courier, monospace;">[oracle@testserver ~]$ java Pretoria</span><br />
<span style="font-family: "Courier New", Courier, monospace;">java Pretoria [-l] [-ss] [-nc] [-nv] -i <indexfile> -s <storagefile> -ot <table outputfile> -oi <index outputfile></span><br />
<span style="font-family: "Courier New", Courier, monospace;">java Pretoria -p [-l] [-ss][-nc] [-nv] -i <indexfile> -ot <table outputfile> -oi <index outputfile></span><br />
<span style="font-family: "Courier New", Courier, monospace;">java Pretoria -p [-l] [-ss] [-nc] [-nv] -o1|2 -i <indexfile> -ot <table outputfile> -oi <index outputdiretory> -oc <contraint outputfile></span><br />
<span style="font-family: "Courier New", Courier, monospace;">-i : indexfile name</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-s : storage parameter file - not used in combination with -p switch</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-ot : outputfile for table DDL</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-oi : outputfile for index DDL</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-oi : using -o1 switch - output directory for index DDL</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-oc : using -o1 or -o2 switch - outputfile for constraint DDL</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-o1 : output mode 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-o2 : output mode 2</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-l : line mode - print each DDL statement on one cowabunga line</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-p : pretty printing only - do not process new storage parameters</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-ss : strip storage clause - except for LOB's</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-nc : no connect - do not generate CONNECT commands</span><br />
<span style="font-family: "Courier New", Courier, monospace;">-nv : no validate - add NOVALIDATE in enable constraint DDL</span><br />
<span style="font-family: "Courier New", Courier, monospace;"></span><br />
<span style="font-family: "Courier New", Courier, monospace;">Pretoria 3c - Kurt Van Meerbeeck - www.ora600.be</span></div>
<br />
En la parte superior de los scripts generados por Pretoria aparece un apartado en comentarios donde los autores mencionan que antes de ejecutar el script en SQL*Plus deben activar lo siguiente 'set SQLBLANK on' ya que puede haber líneas en blanco entre las líneas de las instrucciones lo que daría lugar a errores al momento de ejecutarlo.</span><br /></div>
Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-517683999709748832010-08-02T12:15:00.001-05:002012-05-05T11:58:46.763-05:00Sin espacio en la Flash Recovery Area (FRA)<img alt="" border="0" id="BLOGGER_PHOTO_ID_5364399772137510626" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" style="float: right; height: 100px; margin: 5px 0px 0px 10px; width: 200px;" /><div style="text-align: justify;">Como parte del respaldo de una base de datos 10g en RHEL 4, tengo que se ejecuta uno de nivel 0 (Full) todos los domingos, incremental lunes, martes, miércoles, viernes y sábado e incremental cumulativo el jueves, todos con RMAN, sin embargo, me encuentro con el siguiente mensaje registrado en el log de ejecución del respaldo de nivel 0:<br /><br /><div class="code_block">[oracle@testserver ~]$ tail rman/logs/Level0-1008021002.log<br />piece handle=/opt/oracle/flash_recovery_area/ORCL/backupset/2010_08_02/o1_mf_nnnd0_WEEKLY_BACKUP_65fqjdjj_.bkp tag=WEEKLY_BACKUP comment=NONE<br />channel ORA_DISK_1: backup set complete, elapsed time: 00:02:56<br />RMAN-00571: ===========================================================<br />RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============<br />RMAN-00571: ===========================================================<br />RMAN-03002: failure of backup plus archivelog command at 08/02/2010 10:05:46<br />ORA-19809: limit exceeded for recovery files<br />ORA-19804: cannot reclaim 52428800 bytes disk space from 2147483648 limit<br /><br />Recovery Manager complete.</div><a href="" id="more"></a><span class="fullpost"><br />Vemos que se trata en realidad de tres mensajes. El primero (RMAN-03002) indica que RMAN falló en la ejecución del respaldo incluyendo archivelogs. El segundo (ORA-19809) que no hay espacio para almacenar más respaldos y finalmente (ORA-19804) que no se pudieron liberar cerca de 52 Mb de espacio en la FRA.<br /><br />Revisando el tamaño del directorio designado para FRA a nivel sistema operativo vemos que:<br /><div class="code_block">[oracle@testserver oracle]$ du -sk flash_recovery_area<br />1835880 flash_recovery_area</div><br />Tiene ocupados poco más de 1.8 Gb y revisando la configuración a nivel Oracle:<br /><div class="code_block">SQL> show parameter db_recovery_file_dest_size<br /><br />NAME TYPE VALUE<br />------------------------------------ ----------- ------------------------------<br />db_recovery_file_dest_size big integer 2G</div><br />El tamaño de la FRA es de 2 Gb.<br /><br />Para solucionarlo, Oracle propone ejecutar cualquier de las siguientes 5 opciones:<ol><li>Respaldar la FRA usando RMAN.</li><li>Cambiar la política de retención de RMAN.</li><li>Cambiar la política de borrado de los archive logs.</li><li>Agregar espacio en disco e incrementar el valor del parámetro DB_RECOVERY_FILE_DEST_SIZE.</li><li>Eliminar archivos de la FRA usando RMAN.</li></ol>La FRA puede configurarse para ocupar solo una porción de disco -dos 2 Gb por default- por lo que en este caso la opción más conveniente es aumentar su tamaño.<br /><div class="code_block">SQL> alter system set db_recovery_file_dest_size=3G scope=both;<br /><br />System altered.</div><br />Hecho esto, solo tienes que lanzar nuevamente tu respaldo.<br /><div class="code_block">[oracle@testserver ~]$ tail rman/logs/Level0-1008021027.log<br /><br />Starting Control File and SPFILE Autobackup at 02-AUG-10<br />piece handle=/opt/oracle/flash_recovery_area/ORCL/autobackup/2010_08_02/o1_mf_s_725970724_65fs7ooy_.bkp comment=NONE<br />Finished Control File and SPFILE Autobackup at 02-AUG-10<br /><br />using channel ORA_DISK_1<br />using channel ORA_DISK_2<br />no obsolete backups found<br /><br />Recovery Manager complete.</div><br />Revisando el log de ejecución, vemos que esta vez ya no regresó ningún mensaje de error. Y vemos la diferencia de espacio ocupado en la FRA que pasó de 1.8 Gb a poco más de 2.6, es decir, se necesitaban poco más de 800 Mb de espacio libre en la FRA para que el respaldo pudiera ejecutarse sin problemas.<br /><div class="code_block">[oracle@testserver oracle]$ du -sk flash_recovery_area<br />2635256 flash_recovery_area</div><br />Si el espacio configurado para la FRA fuera igual al tamaño del disco o filesystem y no tuviera espacio adicional, tendría entonces que emplear alguna de las otras 4 opciones que implican deshacerse de archivos para liberar espacio en la FRA. Antes de eliminar cualquier archivo administrado por RMAN asegúrate que exista un respaldo fuera de la FRA, en cinta por ejemplo o cualquier otro medio de almacenamiento, con esto te aseguras que ante una eventualidad en la base de datos productiva, tendrás los medios para poder restaurarla.</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com2tag:blogger.com,1999:blog-8107960283713266625.post-68734334678328982992010-07-30T12:52:00.003-05:002010-07-30T17:17:51.672-05:00Científicos rompen la barrera de ordenamiento del terabyte<div style="text-align: justify;">Científicos en computación de la Universidad de California, San Diego (E.U.) rompieron "la barrera del terabyte" —y un récord mundial— al ordenar más de un terabyte de información (1,000 gigabytes o 1 millón de megabytes) en solo 60 segundos.<br /><br />En la competencia de este 2010 organizada por <a href="http://sortbenchmark.org/">Sort Benchmark</a> —la "Copa del Mundo del ordenamiento de datos"— los científicos en informática de la Escuela de Ingeniería Jacobs de la UC San Diego empataron también un récord mundial para la tasa de ordenamiento más veloz. Ordenaron un trillón de registros en 172 minutos y lo lograron con solo un cuarto de los recursos computacionales del récord anterior.<br /><br />Compañías en busca de tendencias, eficiencia y otras ventajas en competitividad han volteado hacia este tipo de ordenamiento pesado el cual exige poder de procesamiento del hardware típico en los data centers. La Internet ha creado también varios escenarios donde el ordenamiento de la información es crítico. La publicidad en las páginas de Facebook, las recomendaciones personalizadas de Amazon, y los resultados de búsqueda al-segundo de Google todos son resultado de ordenar conjuntos de datos gigantes múltiplos de los petabytes. Un petabyte equivale a 1,000 terabytes.<br /><a id="more"></a><span class="fullpost"><br />"Si una corporación grande quisiera correr una consulta a través de todas las visitas a sus páginas o de productos vendidos, puede requerir ordenar un conjunto de datos multi-petabyte y sobre todo aquellas que crecen varios gigabytes al día", comenta el profesor en informática de la UC San Diego Amin Vahdat, líder del proyecto. "Las compañías están llevando al límite la cantidad de información que pueden ordenar, y cuan veloz. Esto es análisis de información en tiempo real", explica Vahdat. Se necesitan mejores tecnologías de ordenamiento, sin embargo.<br /><br />“En data centers, el ordenamiento es el cuello de botella más frecuente de muchas actividades de alto nivel”, apunta Vahdat quien dirige el Centro de Sistemas de Redes (CNS) en la UC San Diego.<br /><br />Los dos nuevos récords mundiales de la UC San Diego están entre los resultados revelados recientemente en sortbenchmark.org — sitio dirigido por científicos en informática voluntarios de academias y empresas quienes administran las competencias. Estas competencias proveen de marcas en cuanto a ordenamientos de datos y de un foro interactivo para investigadores trabajando en mejorar técnicas de ordenamiento.<br /><br /><h3>Records Mundiales</h3>Este es el primer año que los científicos entran a la competencia y ganan en El Ordenamiento Indy en un Minuto y el Ordenamiento Indy Gris.<br /><br />En el primero, los investigadores ordenaron 1,014 terabytes en un minuto — rompiendo así la barrera del minuto por primera vez.<br /><br />"Pusimos nuestra agenda de investigación en torno a como mejorarlo... además de hacerlo más genérico", comenta el estudiante en doctorado en ciencias de la computación de la UC San Diego Alex Rasmussen, lider de estudiantes de posgrado del equipo.<br /><br />Además el equipo empató el récord mundial en el "Ordenamiento Indy Gris" que mide la tasa de ordenamiento por minuto por 100 terabytes de información.<br /><br />"Utilizamos una cuarta parte de computadoras que el equipo del récord anterior empleó para alcanzar la misma tasa de ordenamiento — lo cual implicó usar solo una cuarta parte de energía eléctrica, enfriamiento y espacio físico", comenta George Porter, científico investigador en la CNS de la UC San Diego.<br /><br />Los dos récords mundiales están en la categoría "Indy" — lo que significa que los sistemas fueron diseñados en torno a parámetros específicos para la competencia. El equipo busca generalizar sus resultados para la competencia "Daytona" y que se puedan emplear en ambientes reales.<br /><br />"El ordenamiento es también un medio interesante hacia varios problemas de procesamiento de información. En general, es una buena manera de medir qué tan rápido se puede leer una gran cantidad de datos de un conjunto de discos, aplicarles algo de procesamiento, distribuirlos por una red y escribirlos en otro conjunto de discos", explica Rasmussen. "Ordenar mete mucha presión a todo el subsistema de entrada/salida, desde los discos duros y las tarjetas de red hasta el sistema operativo y las aplicaciones".<br /><br /><h3>Sistemas balanceados</h3>El desafío de ordenar datos que tomaron los científicos son muy diferentes a los modestos ordenamientos que los sistemas de bases de datos convencionales pueden hacer mediante la comparación de dos tablas. La mayor diferencia es que los ordenamientos de datos de terabytes y petabytes van más allá de la capacidad de memoria del servidor que lo hace.<br /><br />Al crear el sistema de ordenamiento para trabajo pesado, los científicos lo diseñaron para balanceo y rapidez. Un sistema balanceado es uno en el cual los recursos como memoria, almacenamiento y ancho de banda de red son aprovechados en su totalidad y solo se desaprovechan unos cuantos recursos.<br /><br />"Nuestro sistema muestra lo que es posible si se pone atención en la eficiencia — y queda aún mucho qué mejorar", comenta Vahdat "Nos planteamos la pregunta ¿Qué significa construir un sistema balanceado en el no se desaprovechan recursos de sistema que tiene un alto desempeño de computo? Si tienes procesadores ociosos o sin usar toda la RAM, estás desperdiciando energía y perdiendo eficiencia". A menudo la memoria usa la misma energía que un procesador o más inclusive, por ejemplo, sin embargo, nadie se fija en eso.<br /><br />Para romper la barrera del terabyte en el Ordenamiento Indy en un Minuto, los investigadores construyeron un sistema hecho de 52 nodos de computadoras. Cada nodo es un servidor estándar con dos procesadores quad-core, 24 gigabytes de memoria y 16 discos todos interconectados mediante un switch Cisco Nexus 5020. Cisco donó los switches como parte del tratado de investigación que tienen con el Centro de Sistemas de Redes de la UC San Diego. El cluster de computadoras se hospedó en el Instituto para Telecomunicaciones y Tecnologías de la Información de California(Calit2).<br /><br />Para ganar el Ordenamiento Indy Gris, los investigadores ordenaron un trillón de registros en 10.318 segundos (aproximadamente 172 minutos), quedando su récord mundial empatado con un ordenamiento de 0.582 terabytes por minuto por 100 terabytes de datos. El sistema vencedor está hecho de 47 nodos similares a los usados en el ordenamiento de un minuto.<br /><br />100 terabytes de información equivalen a 4,000 discos Blu-Ray de una capa, 21,000 DVDs de una capa, 12,000 DVDs de doble capa o 142,248 CDs (asumiendo que son CDs de 703 MB).<br /><br />Vía:<br /><a href=”http://www.drdobbs.com/database/226300166”>Dr. Dobbs</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-67744142179796016392010-07-13T21:38:00.002-05:002012-05-05T16:07:12.948-05:00Y tú ¿que tan DBA eres?<img style="float:left; margin:5px 10px 0px 0px;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" /><div style="text-align: justify;"><span style="font-weight:bold;">Rescato del libro <span style="font-style:italic;">"Oracle 11g Underground Advice for Database Administrator's - Beyond the basics - A real-world DBA survival guide for Oracle 11g database implementations"</span> escrito por April Sims y publicado por Packt Publishing el siguiente texto que lista atinadamente las actividades que como DBA deberían cumplirse, tomando en cuenta por supuesto el ambiente de trabajo ya que no todas aplican para todos los casos. Por ejemplo, una persona que fue contratada para estar a cargo de digamos 20 bases de datos con las que la empresa funciona, tiene muchas más responsabilidades que un consultor, ya que —en primer lugar— un consultor cobrará en la medida de su consumo de horas por atención y generalmente el costo de este servicio no es nada barato. Por supuesto que dependiendo del contrato, el consultor podrá desde realizar diagnósticos por tal o cual problema que la base de datos presenta, hasta implementar soluciones que bien corrigen problemas de desempeño o aplican nuevas funcionalidades todo esto en pro de mejorar los procesos informáticos organizacionales. Se puede decir que ambos cuentan con perfiles similares pero con distintas especializaciones.</span><br /><br /><h3>¿Qué hace un DBA todo el día?</h3>Entre las responsabilidades están, instalar, configurar y administrar la base de datos, estas responsabilidades pueden dividirse en tareas programadas para ejecutarse a ciertos intervalos. Lo anterior es una lista generalizada y dependiendo del lugar de trabajo pueden o no aplicar.<br /><a id="more"></a><span class="fullpost"><br />Tareas como el monitoreo y rotación de logs pueden hacerse desde el Enterprise Manager, Grid Control, scripts shell de Unix, DBMS_SCHEDULER, Perl, herramientas de base de datos de terceros o combinaciones de algunos de estos.<br /><br /><h3>Priorizando actividades—diarias, semanales, mensuales, trimestrales o anuales</h3>Veamos cuales son las actividades prioritarias que se necesitan cubrir. La calendarización dependerá del lugar de trabajo, necesidades de la aplicación y el peso que tengan las actividades en general.<br /><br /><span style="text-decoration: underline;">Diarias</span><br /><ul><li>Respaldos — usualmente son incrementales o acumulativas, uno completo por semana y los logs son almacenados y enviados por correo al DBA en caso de fallas.</li><li>Alert Log de la base de datos — tales como errores ORA, notificaciones automáticas por correo, mensajes a localizadores.</li><li>ADRCI — Automatic Repository Utility and Log Rotation.</li><li>Espacio en el filesystem, CPU y estadísticas de I/O — requiere de apoyo del administrador del SO.</li><li>Instrucciones SQL — Sentencias que están entre el top 5 y 10.</li><li>Corrupción — logs de RMAN, logs de exports y/o datapump, dbverify, <span style="font-family: courier new;">v$database_block_corruption</span>.</li><li>Crecimiento de tablespaces — crecerlos, administración de particiones, tablespaces temporales, undo.</li><li>Data Guard — revisar en los logs que la aplicación/transporte esté en sincronía.</li><li>Logs del listener SQL*NET — detección de intrusos.</li><li>Auditoría de logs y evidencias — detección de intrusos, quitar cuentas sin uso.</li><li>Dumps del core y usuario — espacio que ocupan, bugs de Oracle.</li><li>Creación de nuevas cuentas — debería ser al menos automatizado parcialmente.</li><li>Actualizar al usuario sobre la seguridad — al menos con 24 horas de anticipación.</li><li>Migrar esquemas y cambios al código o actualizaciones específicas de SQL.</li><li>Crecimiento de las tablas grandes, crecimiento uniforme del tablespace.</li><li>Llevar un registro de los cambios diarios a la base de datos — publicarlos para ciertas personas del staff de IT.</li></ul><br /><br /><span style="text-decoration: underline;">Semanales</span><br /><ul><li>Respaldos — usualmente de toda la base de datos.</li><li>Clonaciones para bases de datos no productivas — automatizado o con scripts.</li><li>Crecimiento de tablespaces — el diario acumulado en uno semanal.</li><li>Mejora de versión de Oracle o proyectos de migración para aplicar parches — Actualizaciones significativas.</li><li>Pruebas en sitio de Data Guard.</li><li>Revisar actualizaciones de My Oracle Support(MOS) — nuevos parches, actualizaciones o nuevas versiones.</li><li>Actualizaciones en la intranet local sobre procedimientos operacionales.</li></ul><br /><br /><span style="text-decoration: underline;">Mensuales</span><br /><ul><li>Clonaciones para bases de datos no productivas — automatizado o con scripts.</li><li>Monitoreo del crecimiento de tablespaces — el semanal acumulado en uno mensual.</li><li>Tendencias y previsiones — consumo de CPU, estadísticas de I/O, accesos</li><li>Cambio de passwords en producción — sys, system, wallet, schema, grid control, OAS.</li><li>Licensiamiento de uso de Oracle y cuanto abarca.</li><li>Poner en práctica escenarios de recuperación.</li></ul><br /><br /><span style="text-decoration: underline;">Trimestrales</span><br /><ul><li>Aplicación de CPUs(Critical Patch Upate) y PSUs(Patch Set Updates) en producción con planeación de la suspensión del servicio. Aplicación de CPUs, PSUs una sola vez en instancias no productivas.</li><li>Monitoreo del crecimiento de tablespaces — el mensual acumulado en un anual</li><li>Cursos de actualización de Oracle — de Oracle University(en línea o presenciales), libros, encuentros informales.</li><li>Acumulación de tendencias y previsiones.</li></ul><br /><br /><span style="text-decoration: underline;">Anuales</span><br /><ul><li>Crecimiento de tablespaces — reporte anual.</li><li>Suma de tendencias y previsiones.</li><li>Ir a conferencias sobre Oracle — grupos de usuarios locales o nacionales.</li><li>Actualizaciones de Oracle con suspensión de servicio planeado — versión + parches + PSUs + aplicación una sola vez.</li><li>Licenciamiento de software y renovación de servicios.</li><li>Evaluación y actualización de hardware.</li><li>Renovación de certificados SSL, Oracle Wallets.</li></ul><br /><br />Así es, se ve como un conjunto desolador de actividades qué realizar, sin embargo, se cuenta con el apoyo de herramientas tales como el OEM, Grid Control, monitoreo de terceros o scripts hechos a medida. Es por eso que se hace la reiteración de que la automatización de estas tareas es de gran importancia.<br /><br /><span style="font-weight:bold;">Si se generalizan varios de los puntos mencionados arriba, veremos que no aplican exclusivamente para la plataforma Oracle sino que pueden servir también como referencia para administrar otros manejadores de bases de datos.</span></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com2tag:blogger.com,1999:blog-8107960283713266625.post-2729598092886257952010-07-07T23:26:00.012-05:002010-07-13T21:42:37.810-05:00Evitando meter la pata (en serio) como DBA Oracle<img style="margin: 5px 0px 0px 10px; float: right; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" alt="" id="BLOGGER_PHOTO_ID_5364399772137510626" border="0" /><div style="text-align: justify;"><span style="font-weight:bold;">Leyendo el libro "<span style="font-style:italic;">Oracle Database 11g—Underground Advice for Database Administrators. Beyond the basics. A real-world DBA survival guide for Oracle 11g database implementations</span>" de la editorial Packt Publishing escrito por April C. Sims, hace una excelente recapitulación de situaciones o actividades que como DBA Oracle en caso de suceder podrían hacernos pasar un mal día o a nuestro jefe o al jefe del jefe. Ser precavido, concentrarse en lo que se hace y en algunos casos hacer una doble revisión de lo que vas a ejecutar y en cual servidor no es más que parte del desempeño para hacer bien tu trabajo y más si se porta el título de "DBA". En serio, hay quienes tienen la idea equivocada sobre lo que hace un DBA, pero ese es tema para otra entrada.<br /><br />Estos son los puntos que A. Sims tiene bien a mencionar.</span><br /><a id="more"></a><span class="fullpost"><br /><ul><li>Evita usar <span style="font-family: courier new;">rm -rf *.*</span> en cualquier momento y por el motivo que sea, procura ser específico <span style="font-family: courier new;">rm *.log</span> o <span style="font-family: courier new;">*.lis</span> o <span style="font-family: courier new;">*.trc</span>: lo más seguro es respaldar el directorio y usar mejor <span style="font-family: courier new;">rmdir</span>. Sería aún mejor si renombraras el directorio completo y lo dejaras ahí por uno o dos días.</li><li>Asumir que todos los archivos que ves en un directorio pertenecen a una sola base de datos es presagio de un desastre, esos archivos pueden crearse en cualquier lugar del filesystem al que Oracle tenga acceso de escritura.</li><li>Modificar el acceso a una instancia productiva a nivel SQL*Plus no es una regla y por lo general no se concede directamente a los desarrolladores a menos que haya una persona que se haga cargo de tal responsabilidad, como el jefe de desarrollo.</li><li>Es bueno usar la herramienta de Unix <span style="font-family: courier new;">fuser</span> contra un archivo para determinar si está o no siendo usado antes de ejecutar los comandos <span style="font-family: courier new;">rm</span> o <span style="font-family: courier new;">mv</span>. Otra manera sería forzar un checkpoint y revisar el timestamp antes de eliminarlo. Si el archivo está activo, el timestamp se habrá actualizado.</li><li>Agrega el ORACLE_SID y el usuario al prompt de SQL. Esto prevendrá desastres al revisar visualmente el prompt antes de ejecutar un script en lo que tu piensas que es un servidor no productivo.</li><li>Usa un prompt extendido a nivel Unix que contenga el hostname, usuario y ORACLE_SID lo cual agregará más pistas visuales para que te asegures de saber exactamente que es lo que vas a modificar.</li><li>Copiar y pegar directamente en SQL*Plus u otra herramienta de línea de comando puede ocasionar que se ejecute el código equivocado. Mejor copia y pega en un editor de texto. De esta manera checas exactamente que es lo que está en el buffer del copy/paste.</li><li>Teclea la palabra <span style="font-family: courier new;">produccion</span> en la ventana de línea de comando después de que terminas de usarla. Esto prevendrá desastres accidentales al cambiar entre ventanas si ejecutas algo que no debías. Sólo se producirá un error ya que no existe un comando llamado produccion.</li><li>Es bueno correr escenarios de recuperación en un servidor diferente al de producción. Además de probar restauraciones a nivel sistema operativo. El sitio donde se hará la recuperación en caso de desastre debería estar en un servidor diferente para contar con capacidades de permutación reales.</li><li>Asegúrate de saber como usar todas las herramientas de Oracle desde línea de comando y del uso del editor <span style="font-family: courier new;">vi</span> de Unix en caso de que no cuentes con nada más a tu disposición.</li><li>De preferencia cambia los colores de entorno de las aplicaciones, ventanas o herramientas de línea de comando como Putty que están conectadas a ambientes productivos de las que están conectadas a ambientes no productivos y de aumentar el tamaño de guardado del historial al mayor posible. Unix cuenta con una herramienta de captura del historial llamada <span style="font-family: courier new;">script</span>.</li><li>Avisa que vas a hacer una modificación... por si acaso. Decirlo en voz alta puede darle tiempo a alguien para detenerte o al menos confirmarte que lo vas a hacer.</li><li>Los scripts de rotación de archivos logs pueden causar estragos si nombraste los online redo logs con la extensión <span style="font-family: courier new;">log</span>. Sería más seguro usar la extensión <span style="font-family: courier new;">rdo</span>.</li><li>Un consultor externo desconocido no necesariamente te dará el mejor consejo. Sé precavido hasta que estés seguro de su expertise y habilidad. Si es posible, solicita hacer tú el trabajo bajo su tutela de manera que sepas que es lo que está haciendo.</li><li>Usar el número 8 en cualquier tipo de script, en el <span style="font-family: courier new;">ORACLE_SID</span> o en lo te vas a apoyar para correr algo, puede causar estragos al momento de ejecutarlo ya que el caracter comodín * se encuentra arriba del 8—es muy fácil equivocarse y teclearlo accidentalmente.</li><li>Has siempre una revisión exhaustiva sobre el rendimiento del sistema operativo en el servidor, específicamente de que no se quede sin espacio en disco.</li><li>Ten cuidado al usar la opción 'reuse' cuando agregas o modificas un archivo de base de datos. El comando sobreescribe el datafile actual destruyendo cualquier información.</li><li>Sé precavido con scripts generados por herramientas de terceros, pueden tener instrucciones poderosas. Un script puede recrear un objeto eliminándolo primero lo cual puede ser desastroso en caso de que no se haya respaldado la información.</li><li>Tú eres el responsable de los respaldos. No es aconsejable delegarlo de ninguna manera.</li><li>Asegúrate de investigar el consumo de recursos de los usuarios que tienen acceso especial en producción. Esos usuarios pueden adueñarse fácilmente de CPU o I/O que son más necesarios para las aplicaciones OLTP.</li><li>La cuenta de Unix root no es para uso diario y en especial para tareas dedicadas para Oracle. Investiga el uso de <span style="font-family: courier new;">sudo</span> para rastrear actividades autorizadas con root.</li><li>Este es el tip más importante para evitar meter la pata—en caso de duda lo más aconsejable es no hacer nada que no puedas deshacer, revertir o arreglar.</li></ul><br /><span style="font-weight:bold;">En la lista se mencionan buenas prácticas que no se deberían olvidar en el quehacer diario de un DBA. Las consecuencias de cometer un error grave en una base de datos productiva puede ir desde una amonestación hasta perder el trabajo o incluso meterse en problemas legales.</span></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-46175777408120014962010-07-05T23:42:00.010-05:002010-07-06T00:15:31.113-05:00Crystal Clear<div style="text-align: justify;">Uno de los conjuntos de íconos más populares hasta la fecha son los creados por el diseñador gráfico Brasileño <a href="http://en.wikipedia.org/wiki/Crystal_icons#Crystal">Everaldo Cohelo</a> por ahí del año 2001 para la interfaz gráfica de Linux KDE y que al día de hoy aparecen en el mismo.<br /><br />El conjunto de íconos está bajo licencia <a href="http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License">LGPL (GNU Lesser General Public License)</a><br /><br /><img style="position:relative; right:-40px; margin:0px auto 10px;width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/TDK09h1YA_I/AAAAAAAAALY/OiUSRG78ROQ/s200/Konqueror-icon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490649864865317874" /><img style="position:relative; right:-40px; margin:0px auto 10px; width: 128px; height: 128px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/TDK08idGW9I/AAAAAAAAALI/1TQs9Fs74kU/s200/Crystal_Clear_app_terminal.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490649847852063698" /><img style="position:relative; right:-40px; margin:0px auto 10px; width: 128px; height: 128px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/TDK09PIfS7I/AAAAAAAAALQ/VryZTNxIOyc/s200/Crystal_Clear_Networksettings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490649859845213106" /><img style="position:relative; right:-40px; margin:0px auto 10px; width: 128px; height: 128px;" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TDK08G_pHKI/AAAAAAAAALA/5BTpHMog1W8/s200/Crystal_Clear_app_kmenu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490649840480754850" /><img style="position:relative; right:-40px; margin:0px auto 10px; width: 128px; height: 128px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/TDK07xQwv5I/AAAAAAAAAK4/ZT-FYM2kXNY/s200/Crystal_Clear_app_download_manager.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490649834646978450" /><br /><a id="more"></a><span class="fullpost"><br />Si necesitas darle a tu aplicación un toque más gráfico seguro que estos íconos te serán de utilidad.<br /><br />Actualmente Everaldo dirige su propia consultoría de diseño gráfico desde <a href="http://yellowicon.com/">Yellow.com</a> empleando a 12 personas en la misma área.<br /><br />¿Quien dice que darse a conocer mediante proyectos de código abierto no es redituable?<br /><br />El conjunto completo en varias presentaciones y formatos lo encuentras en:<br /><a href="http://openiconlibrary.sourceforge.net/downloads.html">http://openiconlibrary.sourceforge.net/downloads.html</a><br /><br />Las vistas previas las encuentras en Wikimedia:<br /><a href="http://commons.wikimedia.org/wiki/Crystal_Clear">http://commons.wikimedia.org/wiki/Crystal_Clear</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-12534596397454035062010-07-04T21:13:00.003-05:002012-05-05T10:59:04.060-05:00Las Alternativas NoSQL<div style="text-align: justify;">Una nueva generación de software de base de datos de alto-desempeño y bajo costo está emergiendo muy rápido llegando a retar el dominio de SQL en procesos distribuidos y aplicaciones con grandes volúmenes de datos. Algunas compañías ya reemplazaron la alta funcionalidad de SQL con estas nuevas opciones que les permiten crear, trabajar y administrar enormes conjuntos de datos.<br /><br />El aliciente para este movimiento, denominado <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a>, es que diferentes implementaciones web, empresariales y aplicaciones de <a href="http://en.wikipedia.org/wiki/Cloud_computing">cómputo en nube</a> tienen diferentes requerimientos para sus bases de datos. No toda aplicación requiere una consistencia de datos estricta, por ejemplo.<br /><a id="more"></a><span class="fullpost"><br />Además, cuando una aplicación usa datos distribuidos en cientos o incluso miles de servidores, los números(en cuestión de dinero) apuntan al uso de software servidor sin costo en lugar de pagar licencias por procesador. Una vez resuelto el tema de los costos de las licencias, se puede escalar horizontalmente con hardware comercial u optar por servicios de cómputo en nube y evitar un desembolso grande de entrada. Las herramientas previas no siempre facilitaban esto.<br /><br />Desafíos a la hegemonía de SQL vienen de productos especializados construidos desde cero para el análisis a gran escala y almacenamiento de documentos, así como para la construcción de sistemas que requieren de alta disponibilidad más que consistencia cuando se trata de particionar datos.<br /><br />Aplicaciones tales como las de procesamiento de transacciones en línea, inteligencia de negocios, gestión de relaciones con clientes, procesamiento de documentos y las redes sociales no tienen las mismas necesidades de datos, consultas o tipos de índices, ni tienen requisitos equivalentes de consistencia, escalabilidad y seguridad.<br /><br />Por ejemplo, las aplicaciones de <a href="http://en.wikipedia.org/wiki/Business_intelligence">BI(inteligencia de negocios)</a> ejecutan consultas de análisis y de toma de decisiones que pueden aprovechar los índices bitmap para las operaciones en bases de datos de gigas o terabytes de tamaño. Análisis web, descubrimiento de fármacos, modelos financieros y otras aplicaciones similares voltean hacia los sistemas distribuidos por su procesamiento eficaz de conjuntos de datos de gigas o teras. <a href="http://en.wikipedia.org/wiki/OLTP">OLTP</a> es sinónimo de fiabilidad. Y las aplicaciones de redes sociales como Facebook y Amazon.com han adoptado propiedades <a href="http://en.wikipedia.org/wiki/Eventual_consistency">BASE (básicamente disponibles, flexibles, eventualmente consistentes)</a> por arriba de las ya conocidas <a href="http://en.wikipedia.org/wiki/ACID">ACID (atomicidad, consistencia, aislamiento, durabilidad)</a> para soportar sus comunidades masivas de usuarios web de millones.<br /><br />Estas diferencias son una razón por las que bases de datos NoSQL no relacionales, bases de datos enfocadas a documentos y de almacenamiento vertical hayan cobrado fuerza. Son más como herramientas especializadas en lugar de Navajas Suizas con funcionalidad de plataformas SQL.<br /><br />Los arquitectos de sistemas deberían considerar las características y funciones especializadas que necesita una aplicación al momento de elegir una base de datos. Las base de datos NoSQL pueden construirse específicamente para funciones tales como BI, OLTP, <a href="http://en.wikipedia.org/wiki/Customer_relationship_management">CRM</a>, redes sociales y data warehousing, e incluyen características tales como escalabilidad, particionamiento, seguridad y versatilidad.<br /><br /><h3>Escalabilidad y Alta Disponibilidad</h3>Para cómputo en nube y sitios web con altos volúmenes de datos como eBay, Amazon, Twitter y Facebook, la escalabilidad y alta disponibilidad son esenciales. De hecho, son la razón para que en las bases de datos distribuidas se hayan relajado los requerimientos en cuanto a consistencia.<br /><br />Los sistemas que operan en ambientes de alta disponibilidad deben sobrevivir a fallas de software, hardware y red, y estar listos para escalar a pesar de la impredecible demanda en materia de recursos de cómputo. Un enfoque para la construcción de sistemas es el uso de bases de datos distribuidas con una <a href="http://en.wikipedia.org/wiki/Shared-nothing_architecture">arquitectura de compartición nula</a> y <a href="http://en.wikipedia.org/wiki/Partition_%28database%29">particionamiento horizontal</a>. <a href="http://en.wikipedia.org/wiki/Apache_Cassandra#Elasticity">Elasticidad</a> y <a href="http://en.wikipedia.org/wiki/Shard_%28database_architecture%29">fragmentación (particionamiento)</a> — ambas característics NoSQL — son soluciones de escalamiento horizontal que proveen disponibilidad y procesamiento de grandes volúmenes de datos.<br /><br />Una variedad de almacenes de datos están cobrando popularidad para la creación de aplicaciones de sitios web escalables y ambientes elásticos tales como la nube pública o privada. Los almacenes distribuidos de clave-valor son estupendos cuando no necesitas aplicar reglas SQL, rigidez de consistencia, consultas complejas, encolamiento integrado o la capacidad de funcionar con bases de datos en operación que exceden la memoria RAM disponible.<br /><br />Nuevos almacenes de datos de baja-latencia ofrecen escalabilidad para aplicaciones que no requieren de consultas elaboradas ni capacidades analíticas. Amazon ha desarrollado SimpleDB y Google Bigtable. Otras opciones de baja-latencia de código abierto incluyen Cassandra, Hypertable, MongoDB, Project Voldemort, Redis, Tokyo Tyrant y Dynamo, base de datos usada para Amazon V3 que hasta marzo contenía 102 billones de objetos.<br /><br /><h3>Las Opciones</h3>Google ha desarrollado Bigtable para distribuir datos a través de miles de servidores y escalar a conjuntos de datos en el orden de los peta bytes. Aplicaciones como la indexación de la web, Google Earth, Google Maps, Blogger, YouTube y Gmail lo emplean. La colección de 100 millones de videos de YouTube requiere de 600 TB de espacio. Bigtable es propietario, pero el modelo de datos existe en implementaciones de código abierto como Hypertable, Cassandra y HBase. Bigtable puede usarse como entrada o salida de MapReduce, que permite el procesamiento distribuido de archivos o bases de datos usando mapeos o funciones de reducción.<br /><br />Dynamo fue creado para proporcionar un almacén de datos tipo clave-valor de alta disponibilidad, sin perder cambios en los datos debido a fallas en el servidor o problemas de red. Amazon construyó posteriormente SimpleDB como un almacén tipo clave-valor disponible para los clientes de Amazon Web Services. SimpleDB está limitado a no más de 256 atributos de pares nombre-valor, dominios no mayores a 10 GB y bases de datos de no más de 1 TB. Amazon dice que las copias de los datos son actualizados en un segundo para mantener la consistencia. SimpleDB utiliza un lenguaje de consulta parecido a SQL.<br /><br />Project Voldemort, un clon de código abierto de Amazon Dynamo, es un almacén de datos clave-valor que soporta versiones, consistencia eventual(donde la base de datos devuelve a veces la respuesta incorrecta con el fin de conservar su tamaño), y particionamiento y replicación automático. Claves y valores pueden ser objetos complejos tales como mapas o listas. El Proyecto Voldemort soporta la construcción de almacenes de datos distribuidos en modo apagado. Los desarrolladores de LinkedIn la crearon, y sitios como Lookery lo utilizan.<br /><br />Cassandra integra el modelo de datos Bigtable con el diseño distribuido de Dynamo. Ofrece consistencia eventual, no la rígida consistencia que las transacciones de comercio electrónico y operaciones en la Bolsa requieren. En lugar de almacenar los datos en secuencias de fila-principal o columna-principal, Cassandra utiliza el orden ColumnFamily inspirado por Bigtable.<br /><br />Cassandra es distribuido geográficamente a través de múltiples data centers, tal como están las zonas de disponibilidad de Amazon EC2. Se pueden hacer cargas masivas con Hadoop.<br /><br /><div style="padding-left:25px; padding-right:25px; padding-top:35px; padding-bottom:35px; border-top: thin solid red; border-bottom: thin solid red">El Costo de Escalar<br /><br />SimpleGeo, proveedor de datos geográficos, utiliza Apache Cassandra, opción de código abierto NoSQL, para evitar los costos de licencias de gestores de bases de datos comerciales como parte de su esfuerzo para escalar a una arquitectura de base de datos multiservidor.<br /><br />"Corre un cluster de 50 nodos, que abarca tres data centers del servicio de Amazon EC2 pagando cerca de USD$10,000 al mes", comenta el director de tecnología de la empresa Joe Stump, quien anteriormente utilizó Cassandra en Digg. "En contraste, el soporte premium de MySQL costaría cerca de USD$5,000 por nodo al año, o USD$250,000 por todos al año — más del doble por la implementación de Cassandra" agreaga Stump, "y Microsoft SQL Server puede costar hasta USD$55,000 por procesador al año".<br /><br />"USD$10,000 es un gasto operable todo lo contrario a un gasto mayor, y eso es 'un poco agradable fiscalmente'", comenta.</div><br />Cassandra proporciona disponibilidad y escalabilidad a una cantidad de sitios bastante conocidos, incluyendo las vastas comunidades de Twitter y Facebook. Cuando el número de usuarios de Twitter despegó, migraron de MySQL a una combinación MySQL/memcached más 45 nodos corriendo Cassandra. Ese ambiente combinado se encarga ahora de 50 millones de 'tweets' al día. Facebook agrega cerca de 60 millones de fotos a la semana usando Cassandra. En Digg, Cassandra administra cerca de 3 TB de información.<br /><br />Digg anunció con bombo y platillo su movimiento de MySQL a Cassandra. La razón principal de Digg para moverse de plataforma fue "lo problemático que se volvió hacer que la aplicación tuviera un alto rendimiento cuando la escritura(en la base de datos) se volvió intensa en un conjunto de datos que crece rápidamente, y al cual no le ves fin" comenta John Quinn, vice presidente de ingeniería de Digg. El crecimiento forzó a Digg a tomar estrategias de particionamiento horizontal y vertical que eliminaron la mayoría de conceptos de una base de datos relacional, y aún así había sobrecarga", agrega Quinn.<br /><br />"Nuestro sistema crece rápidamente y necesita que se le proporcione rendimiento y redundancia con múltiples data centers y para agregar capacidad o reemplazar nodos con fallas inmediatamente. En cuanto a la consistencia de la información, los ingenieros de Digg pueden implementar controles a nivel aplicación más eficientemente con Cassandra que con MySQL", comenta Quinn.<br /><br />Tokyo Tyrant es un servidor de base de datos de código abierto, acompañado de un motor de búsqueda de texto, que tiene seguimiento en la comunidad NoSQL. Es una base de datos clave-valor con una estructura de índices hash y b-tree, capaz de insertar 1 millón de registros en 0.4 segundos por registro y de ejecutar 58,000 consultas por segundo. Soporta replicación asíncrona y procesamiento de transacciones con propiedades ACID y <a href="http://en.wikipedia.org/wiki/Write-ahead_logging">registro prematuro de transacciones</a>. Puede usarse con varios lenguajes de programación, incluyendo Perl, Java, Ruby y PHP. Implementaciones productivas incluyen Scribd y Mixi, el equivalente Japonés de Facebook. LightCloud modificó Tokyo Tyrant en una base de datos distribuida escalable horizontalmente agregando una capa hash universal. El diario social Plurk utiliza esta opción de LightCloud Tokyo Tyrant.<br /><br /><h3>Almacenes de Base de Datos de Documentos</h3>CouchDB y MongoDB son ejemplos de bases de datos de documentos de la clase JSON, a la vez que hay un gran número de productos que almacenan documentos codificados en formato XML. MongoDB es un producto popular basado en la arquitectura de base de datos cliente-servidor con índices b-tree y comunicación sobre redes TCP/IP.<br /><br />MongoDB administra colecciones de objetos JSON y provee de escalabilidad con <a href="http://en.wikipedia.org/wiki/Shard_%28database_architecture%28">fragmentación</a> y replicación. Las consultas son objetos JSON además de proporcionar también de búsquedas geoespaciales en 2-D. Existen APIs controladoras para varios lenguajes incluidos JavaScript, Java, Perl, PHP, Python, Ruby y C++. Entre las implementaciones productivas que usan MongoDB destacan Justin.tv, The New York Times, Disqus, Electronic Arts y Business Insider.<br /><br />CouchDB es un almacén de datos que carece de esquema y proporciona una API estilo REST para operaciones CRUD(crear, recuperar, actualizar, eliminar) sobre documentos. CouchDB puede hacer recuperaciones usando valores clave y puede operar con Hadoop MapReduce para consultas nada triviales. Es posible también la generación de vistas usando funciones JavaScript. Crear una vista puede tomar tiempo, pero las consultas posteriores que la van usan son muy rápidas.<br /><br />CouchDB soporta replicación multimaster y distribución de datos a través de múltiples instancias. Administra documentos en formato JSON y utiliza el motor JavaScript SpiderMonkey por lo que es muy apropiado para aplicaciones web, como con Erlang, HTTP, JavaScript, PHP, Python y Ruby.<br /><br />Para aplicaciones donde son preferibles los documentos XML y XQuery sobre los documentos JSON y las consultas en JavaScript, hay una cantidad de productos de código abierto y comerciales. Además de los almacenes de documentos XML, hay una docena de procesadores XQuery. La lista incluye Apache Xindice, Berkeley DB, eXist-db, IBM DB2, MonetDB, Mark Logic, Sedna, WebMethods Tamino y TigerLogic XDMS.<br /><br /><h3>Procesamiento Distribuido</h3>Cuando se trata de procesamiento distribuido de conjuntos de datos masivos, Hadoop MapReduce se ha convertido en la tecnología por excelencia. Investigadores en Yahoo, por ejemplo, lo usaron en 3,800 nodos para ordenar un petabyte de información en 16.25 horas.<br /><br />Google desarrolló y patentó recientemente MapReduce. La función de mapeo produce una lista de pares clave-valor que MapReduce convierte a una lista de valores.<br /><br />El Proyecto Hadoop de Apache incluye el Sistema de Archivos Distribuído Hadoop (HDFS), MapReduce, base de datos HBase, lenguaje de análisis Pig, la herramienta de consulta y análisis Hive, entre otros. HBase es un almacén vertical(por columna) distribuido, modelado después de Google Bigtable que puede servir como entrada o salida para MapReduce.<br /><br />HBase es uno de los muchos almacenes verticales compitiendo en el mercado del análisis e inteligencia de negocios. Almacenar tablas en orden de columna-principal proporciona mejoras de desempeño sustanciales sobre las tablas almacenadas en fila-principal. Beneficios como ubicación mejorada y desempeño del cache hacen que el desempeño de la lectura mejore, sin embargo el desempeño es pobre para escritura. Otros almacenes verticales incluyen Sybase IQ, Vertica y CStore que es una colaboración entre varias universidades y es de código abierto.<br /><br />El creciente interés de búsquedas semánticas y de información relacionada ha puesto en los reflectores a los <a href="http://en.wikipedia.org/wiki/RDF_Data_Store">almacenes de triples RDF(Resource Description Framework)</a>. Estas opciones incluyen AllegroGraph, Bigdata, Garlik, Jena, Ontotext Big-OWLIM, OpenLink Virtuoso, Oracle 11g y Sesame. Varios de estos han sido implementados en Amazon EC2 para explotar el poder del procesamiento distribuido de la nube. Los investigadores de Raytheon BBN usaron también Hadoop MapReduce para crear un almacén RDF distribuido que soporta procesamiento de consulta <a href="http://en.wikipedia.org/wiki/SPARQL">SPARQL</a>.<br /><br /><h3>Restricciones y Mejores Prácticas</h3>Para asegurar la durabilidad e integridad de la información, las bases de datos SQL proveen de registro de transacciones y replicación. Las opciones NoSQL necesitan algo similar. Cassandra, por ejemplo, soporta ambos. Tokyo Cabinet y HBase soportan <a href="http://en.wikipedia.org/wiki/Write-ahead_logging">registro prematuro</a>. Tokyo Cabinet y CouchDB soportan replicación master-master, mientras que MongoDB soporta replicación master-slave y pares de réplicas.<br /><br />Los arquitectos que emplean bases de datos orientadas a documentos deben lidiar con como almacenar cada tipo de documento y si les conviene tener o no una base de datos para cada tipo. En vez de separar en bases de datos se puede incluir un atributo que especifique el tipo o usar colecciones.<br /><br />La nueva generación de almacenes de datos está dirigida a atender necesidades de disponibilidad y escalabilidad, aunque aplican ciertas restricciones para alcanzar su mayor eficacia. Con Amazon SimpleDB, por ejemplo, el tiempo máximo que puede durar una consulta es 5 segundos. Si la consulta demora más, SimpleDB regresa el resultado parcial y la aplicación debe hacer consultas adicionales para complementarla. SimpleDB restringe el resultado de una consulta a un máximo de 250 items, mientras que recientemente Google aumentó el resultado máximo de una consulta del almacén de datos AppEngine a 1,000 items.<br /><br />En sistemas particionados horizontalmente las consultas que necesitan hacer joins cruzados-fragmentados son costosos, de ahí que el diseño de algoritmos para particionamiento requieran de habilidad y conocimiento en patrones de uso de datos. Cuando se requiere de consultas complejas con agregación, las bases de datos NoSQL no son una buena opción, sin embargo pueden ser fuentes de datos para soluciones separadas encargadas de análisis. Las organizaciones que utilizan almacenes de datos clave-valor a veces necesitan las capacidades de indexación y consulta de SQL. Pueden recurrir a otros programas que soporten indexación y consulta como Lucene de Apache. Independientemente de si la organización usa bases de datos SQL o NoSQL, es una buena idea emplear control de versiones y bases de datos separadas para pruebas y producción.<br /><br />Para todas las áreas que abordan las opciones NoSQL, todavía nos quedamos con la pregunta de qué software de base de base de datos adoptar. La respuesta depende de cosas fundamentales: ¿Cuánto y qué tipo de datos se almacenarán? ¿Será usado para consultas complejas? ¿Cuantos usuarios concurrentes tendrá? ¿Escalará la base de datos según aumente la cantidad de usuarios e información? SQL o NoSQL, es lo primero a definir.<br /><br />Vía <a href="http://www.drdobbs.com/database/224900500">Dr. Dobbs</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com3tag:blogger.com,1999:blog-8107960283713266625.post-28775472361131420922010-06-29T11:29:00.005-05:002010-06-29T11:46:58.622-05:00Lesión por Esfuerzo Repetitivo - Workrave<img style="float:right; margin:5px 0px 0px 10px;width: 200px; height: 100px;" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/TCodixrSjPI/AAAAAAAAAKw/iZIg_v7HeQI/s320/workrave.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5488231579192036594" /><div style="text-align: justify;">Ya con varios años trabajando frente a una computadora -de 8 a 9 horas al día por supuesto, en contadas ocasiones han sido más- comienzas a adolecer de ciertas molestias que en un principio inconscientemente es probable que ni siquiera notes. Entre los ejemplos más notables están la vista cansada, leve dolor en las manos para ser más preciso en la parte de la palma con la que te apoyas cuando escribes en el teclado, entumecimiento leve de los dedos, molestia leve en la espalda baja, y peor aún si experimentas frecuentes periodos de estrés producto ya sea de la carga de trabajo, el ambiente laboral, problemas personales, <ponga aquí su motivo>, etc.<br /><br />Específicamente el medio con el cual llegamos a plasmar las ideas en cosas tangibles(computacionalmente hablando) es con nuestras manos usando el teclado y el ratón en un 99% de los casos me atrevería a decir, el otro 1% (el cual se me hace demasiado) pongámoslo así, utiliza programas de reconocimiento de voz u otro medio de entrada, empleados por personas con enfermedad crónica o con alguna discapacidad.<br /><a id="more"></a><span class="fullpost"><br />Derivado del uso constante del teclado y el ratón por largos periodos durante el día, se puede llegar a desarrollar la llamada lesión por esfuerzo repetitivo o <a href="http://en.wikipedia.org/wiki/Repetitive_strain_injury">RSI(Repetitive Strain Injury)</a> por sus siglas en inglés. Desafortunadamente, la mayoría no sabemos sobre este tema ni qué tan grave puede ser.<br /><br /><h3>¿Cuales son los síntomas?</h3>Citándolos de <a href="http://www.eecs.umich.edu/~cscott/rsi.html#symptoms">esta página</a>.<br />Experimentas:<ol><li>¿Fatiga o falta de resistencia?</li><li>¿Debilidad en las manos o antebrazos?</li><li>¿Hormigueo, entumecimiento o pérdida de sensibilidad?</li><li>Pesadez: ¿Sientes que tus manos parecen peso muerto?</li><li>Torpeza: ¿Dejas caer seguido las cosas?</li><li>¿Falta de fuerza en las manos? ¿Se te dificulta abrir frascos o cortar las verduras?</li><li>¿Falta de control o coordinación?</li><li>¿Casi todo el tiempo tienes las manos frías?</li><li>¿Que estás consciente de algo? Estar al pendiente de una parte de tu cuerpo puede ser indicio de que algo anda mal.</li><li>¿Hipersensibilidad?</li><li>¿Auto-masajes frecuentes? (subconscientemente)</li><li>¿Afinidad al dolor? ¿Tus manos te duelen cuando alguien más habla sobre su dolor en las manos?</li></ol><br /><h3>Cómo reducir el riesgo de desarrollar RSI</h3><ul><li>Haz pausas, cuando uses la computadora cada 10, 20 o 30 minutos.</li><li>Ejercitarse regularmente puede prevenir las lesiones incluyendo las RSI</li><li>Mejora tu postura. Ajusta tu escritorio y/o silla para soportar los músculos necesarios y tener una buena postura</li></ul><br /><h3>Workrave</h3>Es un programa de código abierto cuyo propósito es ayudar a prevenir la RSI o la miopía en los usuarios de computadoras. Este bloquea periódicamente la pantalla mientras una figura animada guía al usuario a través de diversos ejercicios de estiramiento y los insta a tomar un descanso. El programa avisa con frecuencia a tomar micro-pausas, descansos y restringe tu límite de horas al día con el horario establecido.<br /><br /><h3>Instalando Workrave</h3>Ejecuta el siguiente comando si tu sistema es Linux Debian / Ubuntu:<div class="code_block">sudo apt-get install workrave</div><br />En caso de tener instalado Fedora:<div class="code_block">su - -c 'yum install workrave'</div><br />O si tienes Windows, descargas el instalador de aquí:<br /><a href="http://www.workrave.org/download/">http://www.workrave.org/download/</a><br /><br />La configuración por default es para personas en recuperación de RSI, micropausas de 25 segundos por cada dos minutos y medio de actividad y descansos de 10 minutos por cada 20 minutos de actividad. Si nunca has tenido molestias puedes comenzar tomando micropausas de digamos 10 segundos por cada 10 minutos y descansos de 5 minutos por cada hora de actividad. Es complicado recomendar tal o cual configuración, lo mejor es ir probando hasta encontrar la que se ajuste y haga disminuir tu padecimiento.<br /><br />Enlaces recomendados:<br /><a href="http://www.eecs.umich.edu/~cscott/rsi.html">Repetitive Strain Injury: How to prevent, identify, and manage RSI</a><br /><br />Vía: <a href="http://www.cyberciti.biz/tips/repetitive-strain-injury-prevention-software.html">nixCraft</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-49055077590961309712010-05-06T16:08:00.013-05:002010-05-07T23:10:41.388-05:00[Caso de estudio] Oracle export -> import usando Netcat<img style="float:left; margin:5px 10px 0px 0px;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" /><div style="text-align: justify;">Existen muchas razones para ejecutar un export, el principal, es hacer un respaldo de la base de datos a manera de "protección" en caso de que esta se pierda. En principio, este mecanismo de respaldo es el más básico y, por supuesto, no se recomienda para bases de datos productivas de varios gigas de tamaño; para eso hay otros métodos más sofisticados que van desde el uso de RMAN hasta los respaldos a nivel filesystem como Netbackup de Veritas, EMC, etc.<br /><br />Otro uso común del export es trasladar un esquema o esquemas o incluso la base de datos completa de un ambiente a otro, como por ejemplo: "planchar"(hacer una copia de la base de datos) el ambiente <a href="http://en.wikipedia.org/wiki/User_acceptance_testing#User_acceptance_testing">UAT</a> con una copia del ambiente productivo, es decir, ejecutas un export de la base de datos productiva, se genera el archivo dump(.dmp) y ejecutas un import en la base de datos UAT. ¿Suena sencillo no? y lo es si la base de datos es relativamente pequeña, las complicaciones vienen cuando la base de datos es relativamente grande y el espacio en los filesystems no es suficiente para crear el archivo dump.<br /><a id="more"></a><span class="fullpost"><br />Otro uso no tan común es usar export/import para migrar una base de datos ó solo los objetos(esquemas) que interesan cuando se trata de un cambio de plataforma(sistema operativo), es decir, que si la base de datos está montada en un servidor Linux 64 bits e interesa montarla en un servidor con Solaris(SPARC) no es posible hacerlo copiando solo los archivos de base de datos de un servidor a otro como generalmente se hace cuando los servidores son de la misma plataforma, el mismo caso aplica cuando se trata de migrar de Solaris(SPARC) a HP-UX(RISC o Itanium) o viceversa. No es posible hacerlo debido al <a href="http://en.wikipedia.org/wiki/Endian">ENDIAN</a> que emplea cada plataforma.<br /><br />Haciendo a un lado la discusión del por qué cambiar de una plataforma a otra y enfocando la atención en cuales son los puntos a considerar(para migrar la base de datos de un servidor a otro) y poder llevarla a cabo en el menor tiempo posible, poniendo el caso de que se trata de una base de datos productiva relativamente grande(mayor a 1 Tb) y que no puede estar fuera de línea por un periodo largo de tiempo, se vuelve un reto con muchas vertientes.<br /><br />La solución ideal, revisas en la documentación de RMAN la matriz que te muestra las plataformas para las que puedes crear "tablespaces transportables" con la versión del motor de tu bd actual. Si aplica, generas los tablespaces transportables correspondientes, los cargas en la bd de la nueva plataforma, bajas la base de datos productiva, aplicas los archive logs generados en la bd productiva desde que inició la generación de los tablespaces transportables en la bd de la nueva plataforma, levantas la nueva bd, pides que hagan pruebas con la aplicación apuntando a la nueva bd para validar que funciona correctamente y es todo, no debería llevarte más de un par de horas desde que bajas la base de datos productiva hasta que las pruebas con la aplicación puedan ser dadas como satisfactorias y la bd en la nueva plataforma se convierta ahora en la bd productiva. Por supuesto que tiene que haber todo un proceso de validaciones previas para que el plan sea exitoso, y sobre todo haber ejecutado el plan tantas veces como hayan sido posibles para afinar todos los detalles, resolver los errores presentados, entre otros muchos puntos.<br /><br />Los puntos en contra, qué pasa si no puedes crear "tablespaces transportables" entre las dos plataformas, qué pasa si la plataforma lo permite(crear tablespaces transportables) pero no tienes espacio en los filesystems, qué pasa si la plataforma no lo permite(crear tablespaces transportables) y además no cuentas con espacio en los filesystems. Qué pasa si cuentas con el espacio suficiente y se requiere comprimir el respaldo para transferirlo por la red, qué pasa si el ancho de banda en la red no es aceptable(100 Mbps), etc., etc., etc.<br /><br />Las variables en este sentido hacen que el proceso se vuelva complejo y lo mejor en este caso es ponerlas sobre la mesa y consultar con la empresa la posibilidad de que adquiera estos medios(más espacio, red gigabit o mejor, etc.)<br /><br />Que tal si la empresa no está en posibilidad de adquirir ninguno de estos medios(más espacio, red gigabit, etc.); no en este momento quizá más por cuestiones de presupuesto que de no querer adquirirlo.<br /><br />La solución. Usando recursos de *nix en combinación con el export/import es posible hacer la migración directa de base de datos a base de datos sin tener que generar el archivo dump, en donde además ambos procesos corren paralelamente, es decir, que desde que el export es lanzado, la salida que genera es transferida de manera immediata vía red al servidor donde se lanzó el import aplicando los datos al instante. ¿Cool cierto?<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/S-MweG1FsLI/AAAAAAAAAKU/55SCCeHWtVk/s1600/ora-netcat1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 106px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/S-MweG1FsLI/AAAAAAAAAKU/55SCCeHWtVk/s400/ora-netcat1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5468267666345406642" /></a><br /><h3>¿Qué necesitas?</h3><ul><li>Galleta(Poder de procesamiento) en ambos servidores.</li><li>Que la red sea velóz(mínimo Gigabit).</li><li>Optimizar la base de datos para el import.</li></ul><br /><br /><h3>Ventajas</h3>Si ambos servidores tienen dos o más procesadores o procesadores con cores, se pueden lanzar en paralelo dos, tres, cuatro o hasta cinco procesos export/import. De entre tantas, tienes una tabla particionada de 300 Gb la cual puedes transferir por ejemplo en tres procesos que se encarguen de 100 Gb cada uno.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/S-MweQMu5PI/AAAAAAAAAKc/uxw69ETMQWM/s1600/ora-netcat2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 110px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/S-MweQMu5PI/AAAAAAAAAKc/uxw69ETMQWM/s400/ora-netcat2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5468267668860495090" /></a><br />Compresión. Mejor aún, ¿que tal si en lugar de transferir 300 Gb por la red, sólo se transfiriera un porcentaje relatívamente mínimo? Suponiendo que la tabla en cuestión contiene solo campos con tipos de datos comunes(no LOBs, ni LONGs) el nivel de compresión con gzip puede ser de hasta un 80% o mayor. Es decir, que en lugar de transferir los 300 Gb de punto a punto, se aplica compresión gzip estandar reduciendo la transferencia a 55 Gb. O todavía mejor, que tal si lo aplicas al ejemplo de los tres procesos, repartirías entonces la carga de transferencia en 18.3 Gb por cada uno. ¡Super cool! He aquí donde entra en juego la "galleta" de los servidores.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/S-MweuDoLxI/AAAAAAAAAKk/hGxPY-DSfN8/s1600/ora-netcat3.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 110px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/S-MweuDoLxI/AAAAAAAAAKk/hGxPY-DSfN8/s400/ora-netcat3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5468267676875370258" /></a><br />Es necesario optimizar la base de datos en donde vas a ejecutar el import, la nota en Metalink 93763.1 contiene justamente lo que debes hacer. Esta optimización SOLO es para el import, después de asegurarte de que todo ocurrió satisfactoriamente y antes de que hagas el cambio para que la nueva bd sea ahora la bd productiva, será necesario regresar los parámetros a sus valores originales.<br /><br />En el ejemplo de la tabla con un tamaño de 300 Gb, no tomé en cuenta los índices, es decir, solo tomo en cuenta que el tamaño de la tabla es de 300 Gb incluyendo el índice de la llave primaria, la tabla podría tener otros índices lo cual aumentaría considerablemente el volumen de transferencia, por ejemplo, si la tabla tiene además 5 índices con un tamaño en conjunto de 100 Gb, el total de transferencia sería de 400 Gb. Puesto que el objetivo es transferir lo esencial en el menor tiempo posible, es aceptable sólo transferir datos y posteriormente crear los índices en la bd destino. Generando por supuesto un script de la base de datos productiva con las sentencias para crearlos.<br /><br />Con dos bases de datos una en 9i(origen) y la otra en 10g(destino) montadas en servidores HP-UX y una red a 100 Mbps, los números obtenidos para transferir un esquema completo de 2.3 Gb son:<br /><br />Datos + índices + bd destino sin optimizar:<table cellspacing="0" cellpadding="3"><tr><td><span style="font-weight:bold;text-decoration:underline;">Mb Totales</span></td><td><span style="font-weight:bold;text-decoration:underline;">Método de compresión</span></td><td></td><td><span style="font-weight:bold;text-decoration:underline;">Tiempo de transferencia</span></td></tr><tr><td>2,336</td><td>compress</td><td>362 Mb</td><td align="right">16:16 Min</td></tr><tr><td>2,336</td><td>gzip</td><td>254 Mb</td><td align="right">15:33 min</td></tr></table><br /><br />Datos - índices + bd destino optimizada:<table cellspacing="0" cellpadding="3"><tr><td><span style="font-weight:bold;text-decoration:underline;">Mb Totales</span></td><td><span style="font-weight:bold;text-decoration:underline;">Método de compresión</span></td><td></td><td><span style="font-weight:bold;text-decoration:underline;">Tiempo de transferencia</span></td></tr><tr><td>1,387</td><td>compress</td><td>361 Mb</td><td align="right">07:01 Min</td></tr><tr><td>1,387</td><td>gzip</td><td>254 Mb</td><td align="right">06:12 min</td></tr></table><br />Como se puede observar, el volumen de bytes transferido es casi el mismo con o sin índices, sin embargo, la diferencia está en el tiempo de transferencia la cual se reduce en un poco más del 50%. El ejercicio incluye también la comparación empleando dos métodos de compresión, siendo el más eficiente gzip tanto en bytes como en tiempo.<br /><br />De acuerdo con Oracle, un import dura aproximadamente entre 2 y 2.5 veces la duración del export. En el caso del ejemplo, el tiempo de transferencia mostrado en las tablas es el tiempo que dura el import, más bien ambos, tanto el export como el import, de ahí que el mejor escenario sea de 6 minutos con 12 segundos(export/import optimizado) y el peor escenario sea de 15 minutos con 33 segundos(export/import tradicional), lo cual si lo aplicas a un ambiente de base de datos real en el orden de los cientos de gigas vemos que la diferencia es bastante considerable sobre todo por el hecho de que la migración se hace en un solo paso y dependes solamente del poder de procesamiento de los servidores y la velocidad de la red, ¿y el espacio en disco? ya no es ningún problema.<br /><br /><h3>Desventajas</h3><ul><li>Este método no funciona con Data Pump</li><li>Si la transferencia es interrumpida debido a problemas en la red, se tiene que reiniciar el proceso desde cero.</li></ul></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-18899384786545112002009-12-15T11:05:00.009-06:002009-12-15T11:16:21.901-06:00Algunos consejos al desarrollador de PL/SQL - Última parte<img style="margin: 5px 0px 0px 10px; float: right; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5364399772137510626" /><div style="text-align: justify;"><h3>Toma un enfoque creativo, radical inclusive</h3>La mayoría tendemos a caer en rutinas, en casi cualquier aspecto de nuestras vidas. Las personas son criaturas de hábitos: aprendes a escribir código de una manera; asumes ciertas limitaciones sobre el producto; dejas a un lado posibles soluciones sin una revisión más seria porque sabes que no se puede hacer. Los desarrolladores se vuelven abiertamente prejuiciosos incluso con sus propios programas, y muchas veces no de manera positiva. A menudo se les oye decir cosas como:<br /><a id="more"></a><span class="fullpost"><ul><li>"Ya no puede ejecutarse más rápido; es un asco"</li><li>"No puedo hacer que funcione como quiere el usuario; tendrá que esperar hasta la siguiente versión"</li><li>"Si usara X o Y o tal producto, quedaría al instante. Pero con este, solo se batalla"</li></ul>En la realidad tu programa casi siempre puede ejecutarse un poco más rápido. Y que puede, de hecho, funcionar <span style="font-style:italic;">justo</span> de la manera que el usuario desea. Y aunque cada producto tiene sus limitaciones, fortalezas y debilidades, nunca deberías tener que esperar hasta la siguiente versión. ¿No es más gratificante poder decirle a tu terapista que le entraste al problema de frente, que no pusiste excusas, y armaste una solucion?<br /><br />¿Cómo lo logras? Echa abajo esa barrera de las mismas soluciones de siempre y dale una mirada fresca al mundo (o tal vez solo a tu cubículo). Revalora tus hábitos de programación. Sé creativo—apártate de los métodos rutinarios, de los enfoques mecánicos y limitados que son reforzados constantemente en nuestros lugares de trabajo.<br /><br />Intenta algo nuevo: experimenta con lo que parezca ser un cambio radical a lo de siempre. Te sorprenderás de cuanto aprenderás y crecerás como programador y solucionador de problemas. A través de los años -dice Steven-, me he sorprendido una y otra vez de hasta donde puedes llegar cuando de repente dices "¡Eso no se puede hacer!" en lugar de simplemente asentir y murmurar, "Veamos, si lo hago de esta manera..."</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-86248503614718479652009-11-02T20:23:00.004-06:002009-11-02T20:29:43.772-06:00Algunos consejos al desarrollador de PL/SQL - 2da parte<img style="float:left; margin:5px 10px 0px 0px;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" /><div style="text-align: justify;"><h3>Que no te de miedo pedir ayuda</h3>Es probable que, si eres un profesional del software, seas una persona muy inteligente. Estudiaste muy duro, perfeccionaste tus habilidades y ahora te das la buena vida escribiendo código. Resuelves casi cualquier problema que tocas y eso te enorgullece. Desafortunadamente, el éxito puede también hacerte egoísta, arrogante, y renuente a pedir ayuda cuando te atoras. Esta dinámica es uno los aspectos más peligrosos y destructivos del desarrollo de software.<br /><br />El software es escrito por seres humanos; y por lo tanto, es importante reconocer que la psicología humana juega un papel importante en el desarrollo de software. Un ejemplo de esto es el siguiente.<br /><a id="more"></a><span class="fullpost"><br />Joe, un desarrollador con antigüedad en un equipo de seis, tiene un problema con su código. Lo ha revisado por horas, incrementando su frustración y sin poder encontrar donde está el bug. No se le ocurre ni siquiera pensar el pedir ayuda a sus compañeros porque ninguno de ellos tiene la experiencia de él. Finalmente, su cabeza no le da más y termina "dándose por vencido". Suspirando, levanta su teléfono y marca una extensión: "Sandra, ¿podrías venir y darle una revisada a mi código? tengo un problema el cual no encuentro en donde puede estar". Sandra pasa por su lugar y, de una rápida revisada al código de Joe, señala lo que para él debió ser obvio desde hace mucho. ¡Hurra! El código funciona, y Joe le da las gracias, aunque de hecho se siente apenado en su interior.<br /><br />Pensamientos como "¿Cómo es que no lo vi antes?" y "Si hubiera pasado otros cinco minutos haciendo mis pruebas lo hubiera encontrado" pasan por la mente de Joe. Es entendible aunque también muy estúpido. El punto aquí es que con frecuencia no alcanzamos a ver nuestros problemas porque estamos muy metidos en nuestro propio código. Algunas veces todo lo que necesitamos es una nueva perspectiva, la visión relativamente objetiva de alguien sin nada en juego. No tiene nada que ver con la antigüedad, pericia o competencia.<br /><br />Steven recomienda fuertemente establecer dentro de la organización los siguientes lineamientos:<br /><br /><span style="font-style:italic;">Retribuye admisiones de ignorancia</span><br />Ocultar lo que no sabes acerca de una aplicación o su código es muy peligroso. Desarrolla una cultura de preguntas y peticiones de ayuda.<br /><br /><span style="font-style:italic;">Pide ayuda</span><br />Si no puedes encontrar la causa de un bug en 30 minutos, pide ayuda inmediata. Puedes incluso idear un "sistema amigo", de tal manera que cada quien tiene asignado a alguien del grupo a quien <span style="font-style:italic;">se espera</span> se le pida soporte. No te permitas (o a otros en tu grupo) estar por horas golpeándote contra la pared en una infructuosa búsqueda de respuestas.<br /><br /><span style="font-style:italic;">Establece un proceso de revisión de código por un compañero</span><br />No permitas que ningún código se suba a producción sin que sea leído y criticado (en una manera positiva y constructiva) por uno o más desarrolladores en tu equipo</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-10997815079559281422009-10-31T14:15:00.000-06:002009-10-31T14:33:06.527-06:00Algunos consejos al desarrollador de PL/SQL - 1ra parte<img style="margin: 5px 0px 0px 10px; float: right; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5364399772137510626" /><div style="text-align: justify;"><span style="font-weight:bold;">Leyendo el libro de Steven Feuerstein Oracle PL/SQL Programming 5ta ed. -el cual es dicho sea de paso material de referencia altamente recomendado para quienes desarrollan en PL- comparte los siguientes consejos que en su opinión son el resultado de haber capacitado, enseñar y trabajar con miles de desarrolladores en PL y en cuyo proceso ha obtenido algunas conclusiones sobre la forma en la que todos hacemos nuestro trabajo en el mundo de PL/SQL.</span><br /><br /><h3>¡No desarrolles a las prisas!</h3>Casi siempre estamos trabajando con tiempos de entrega apretados, o poniéndonos al día por alguno que otro contratiempo. No tenemos tiempo que perder y si mucho código que escribir. Asi que manos a la obra—¿cierto?<br /><br />Falso. Si nos metemos así de pronto y de lleno a construir código convirtiendo al pie de la letra los requerimientos en cientos, miles o incluso cientos de miles de líneas de código, vamos a terminar con un caos total que es casi imposible de depurar y mantener.<br /><a id="more"></a><span class="fullpost"><br />No hay que entrar en pánico ante las fechas de entrega; lo más probable es que cumplas si haces una cuidadosa planeación.<br /><br />Steven recomienda a resistir la presión de la entrega y a asegurarse de hacer lo siguiente antes de comenzar una nueva aplicación, o inclusive alguna parte específica de la aplicación:<br /><br /><span style="font-style:italic;">Construir casos y scripts de prueba antes de escribir el código</span><br />Debes determinar como vas a verificar una implementación exitosa antes de escribir una sola línea código del programa. Haciéndolo, es más probable que la interfaz de tu programa sea la correcta, e identifiques plenamente qué es lo que tu programa necesita hacer.<br /><br /><span style="font-style:italic;">Establecer reglas claras de como los desarrolladores escribirán las sentencias SQL en la aplicación</span><br />En general, Steven no recomienda que cada desarrollador escriba montones de SQL. En vez de eso, los queries que regresan un solo registro, inserts y updates deberían estar "ocultos" en procedimientos y funciones preconstruídos y bien probados (llamado <span style="font-style:italic;">encapsulamiento de información</span>). Estos programas se pueden probar, optimizar y mantener de una manera más efectiva que solo sentencias SQL (algunas de ellas redundantes) desparramadas por todo el código.<br /><br /><span style="font-style:italic;">Establecer reglas claras de como los desarrolladores manejarán las excepciones en la aplicación</span><br />Todos los desarrolladores del equipo deberían lanzar, manejar y registrar los errores de la misma manera. Para lograrlo, lo mejor es crear un solo paquete de manejo-de-errores que oculte los detalles de como se registran estos, que establezca como se lanzan y propagan las excepciones hacia arriba a través de bloques anidados, y que evite la codificación en duro de excepciones específicas-de-la-aplicación. Asegurarse de que todos usen ese paquete y que <span style="font-style:italic;">no</span> escriban su propio código de manejo de errores complicado, que consume tiempo y que es propenso a errores.<br /><br /><span style="font-style:italic;">Usar el "refinamiento paso a paso" (también llamado diseño top-down) para limitar la complejidad de los requerimientos a enfrentar en un momento dado</span><br />Si utilizas este enfoque, verás que las partes ejecutables de tus módulos son cortos y fáciles de entender, lo que hace que el código sea fácil de mantener y de mejorarlo con el tiempo. Los módulos locales o anidados juegan un papel clave en el seguimiento de este principio de diseño.<br /><br />Estas son solo unas cuantas cosas importantes a tener en cuenta para <span style="font-style:italic;">antes</span> de comenzar a escribir todo ese código. Solo recuerda: en el mundo del desarrollo de software, la prisa no solo hace cosas frágiles, prácticamente garantiza un generoso ofrecimiento de bugs y de fines de semana perdidos.</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-56682472798590386692009-09-03T12:01:00.021-05:002009-09-03T18:48:50.636-05:00Fundamentos de Rendimiento de Software - Referencia rápida<div style="text-align: justify;"><span style="font-weight: bold;">Muchas veces cuando nos ponemos a programar nos olvidamos que no solo se trata de escribir líneas de código que "hagan algo" y ya, nos olvidamos que el ambiente de desarrollo en el que trabajamos no tiene ni la décima parte de la carga de trabajo que tiene un ambiente productivo y es en este último que sucede lo que no consideramos -en el peor de los casos- y tenemos que hacer una revisión de los puntos donde podría estarse presentando el cuello de botella. Leyendo una entrada en el blog de Cary Millsap me encontré con lo que él llama una <a href="http://carymillsap.blogspot.com/2009/07/fundamentals-of-software-performance.html">"Referencia rápida sobre los Fundamentos de Rendimiento del Software"</a> de los términos que deberíamos tener presentes cuando algo no funciona eficientemente.</span><br /><br /><h3>Glosario</h3><b>eficiencia</b> Es la medida de cuantos recursos está consumiendo la ejecución de una tarea. Eficiencia es lo inverso a cuanto del tiempo total de servicio de la ejecución de la tarea puede eliminarse sin incrementar su capacidad ni sacrificar la función de negocio.<br /><br /><b>ocupación</b> Es el valor de utilización de un recurso cuya tasa de transferencia se maximiza con un mínimo impacto en los tiempos de respuesta. El valor de ocupación para un número dado de canales de servicio es menor o igual que el valor mostrado a continuación:<br /><br /><table align="center" cellpadding="3" cellspacing="0" border="0"><tbody><tr><td style="border-top-width: medium;border-top-style: solid;"># de canales de servicio</td><td style="border-top-width: medium;border-top-style: solid;" align="center">1</td><td style="border-top-width: medium;border-top-style: solid;" align="center">2</td><td style="border-top-width: medium;border-top-style: solid;" align="center">4</td><td style="border-top-width: medium;border-top-style: solid;" align="center">8</td><td style="border-top-width: medium;border-top-style: solid;" align="center">16</td><td style="border-top-width: medium;border-top-style: solid;" align="center">32</td><td style="border-top-width: medium;border-top-style: solid;" align="center">64</td><td style="border-top-width: medium;border-top-style: solid;" align="center">128</td></tr><tr><td style="border-bottom-width: medium;border-bottom-style: solid;" align="center">Ocupación</td><td style="border-bottom-width: medium;border-bottom-style: solid;">50%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">57%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">66%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">74%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">81%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">86%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">89%</td><td style="border-bottom-width: medium;border-bottom-style: solid;">92%</td></tr></tbody></table><br /><b>carga</b> Competencia por un recurso inducido por las ejecuciones concurrentes de tareas, medida como utilización.<br /><br /><b>rendimiento</b> Velocidad de ejecución de la tarea, medido ya sea como tasa de transferencia o tiempo de respuesta.<br /><br /><b>perfil</b> Descomposición tabular del tiempo de respuesta, listado comúnmente en orden descendente de la aportación del tiempo de respuesta del componente.<br /><br /><b>demora en la cola</b> Duración que una tarea pasa encolada en un recurso dado, a la espera de su oportunidad de consumirlo, medido en tiempo de ejecución por tarea: <i>segundos por click</i>.<br /><br /><b>tiempo de respuesta</b> Duración de ejecución de una tarea, medido en tiempo por tarea: <i>segundos por click</i>. El tiempo de respuesta es la suma de la demora en la cola y el tiempo de servicio.<br /><br /><b>diagrama de secuencia</b> Es un diagrama especificado en el Lenguaje de Modelado Unificado (UML), usado para mostrar las interacciones entre objetos en el orden secuencial en que estas ocurren. Este diagrama es útil para visualizar el tiempo de respuesta.<br /><br /><b>canal de servicio</b> Un sub-recurso que comparte una sola cola con otros sub-recursos, como una cabina de cuota en un centro comercial o un CPU en una computadora SMP.<br /><br /><b>tiempo de servicio</b> Duración que una tarea pasa consumiendo un recurso dado, medido en tiempo por ejecución de tarea: <i>segundos por click</i>.<br /><br /><b>tarea</b> Unidad de trabajo orientada al negocio. Éstas pueden anidarse: <i>imprimir facturas</i> es una tarea; <i>imprimir una factura</i>—subtarea— es también un tarea.<br /><br /><b>tasa de transferencia</b> Conteo de las ejecuciones completadas por la tarea dentro de un intervalo específico de tiempo: <i>clicks por segundo</i>.<br /><br /><b>utilización</b> Uso de recurso dividido por capacidad por un intervalo de tiempo específico; una medida cuantitativa de carga.<br /><a id="more"></a><span class="fullpost"><br /><h3>Principios</h3>1. Un <i>diagrama de secuencia</i> es una herramienta útil para conceptualizar el tiempo de respuesta, sin embargo, para tareas que ejecutan miles de invocacioes (incluso docenas), es más útil el <i>perfil</i>.<br /><br />2. La tasa de transferencia es el recíproco del tiempo de respuesta. Si agregas carga para crear altas tasas de transferencia <i>cambias</i> el tiempo de respuesta ya que añades <i>espera en la cola</i>.<br /><br />3. La diferencia entre el tiempo de respuesta de una tarea que tiene un recurso con carga ligera y su tiempo de respuesta con carga pesada es la espera en la cola.<br /><br />4. La duración de una tarea en la cola para obtener un recurso depende del número de <i>canales de servicio</i> de ese recurso además de su <i>carga</i>:<br /><ol type="a"><li>Agregar canales de servicio reduce la espera en la cola para una carga dada. Sin embargo, el beneficio disminuye cuando los agregas.</li><br /><li>Reducir la carga disminuye la espera en la cola para una determinada arquitectura. No hay un límite de escalabilidad para reducir la carga</li></ol>5. La ocupación es el valor de utilización que define el umbral entre carga ligera y carga pesada sobre un recurso.<br /><ol type="a"><li>En un recurso con carga pesada, los tiempos de respuesta se degradan exponencialmente cuando la carga crece.</li><br /><li>En un recurso con carga pesada, los tiempos de respuesta mejoran exponencialmente cuando la carga disminuye</li></ol>6. Para sistemas con peticiones de servicio de tiempo aleatorio, permitir excesivas cargas sostenidas en los recursos con respecto al valor de ocupación resulta en tiempos de respuesta severamente degradados y tasas de transferencia que fluctúan constantemente con cambios microscópicos en la carga.<br /><br />7. Para un conjunto de recursos de una computadora, no se puede mejorar el rendimiento haciendo que el código se <i>ejecute velózmente</i>; se puede mejorar el rendimiento <i>solamente</i> eliminando las instrucciones innecesarias en el código, o en el código que compite contra tu código para hacerse de recursos.<br /><br />8. Mejorar el enfoque de tu código de manera eficiente reduce el tiempo de servicio <i>y</i> carga, los cuales mejoran el tiempo de respuesta, los cuales mejoran exponencialmente el rendimiento en recursos con demasiada carga pesada.<br /><br />9. No se puede optimizar la tasa de transferencia de una tarea ineficaz. Para analizar la eficiencia de una tarea, se debe analizar su tiempo de respuesta. De aquí que, para optimizar la tasa de transferencia primero se debe analizar el tiempo de respuesta.<br /><br />10. No le atinarás a la primera en donde es que un programa consume su tiempo, y que es ineficaz tratar de optimizar cualquier cosa que le veas. Analizar su comportamiento ayuda a escribir código que sea más veloz.</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-69469052159841023782009-08-05T22:24:00.014-05:002009-08-05T23:24:28.797-05:00Creador y colaboradores de CentOS llegan a acuerdo<div style="text-align: justify;">Vaya que sí resonó la carta publicada por el equipo de desarrolladores del proyecto CentOS ya que finalmente estos y Lance Davis se reunieron para llegar a acuerdos sobre los puntos mencionados en un post anterior donde los primeros solicitaban entre otros puntos, el que hubiera un delegado tanto para la administración del dominio 'centos.org' como de los canales IRC.<br /><br />Ahora el proyecto está en control de los dominios 'centos.org' y 'centos.info', además de tener todos los derechos sobre las marcas registradas, materiales y trabajo gráfico contenido en las distribuciones de CentOS.<br /><a id="more"></a><span class="fullpost"><br />Por supuesto que no muere el proyecto, hay un plan de acción elaborado de mutuo acuerdo para los casos extraordinarios.<br /><br />El proyecto es llevado completamente por voluntarios y están conscientes de que requiere un estilo diferente de administración. Han y continúan trabajando para evitar que situaciones como estas ocurran en el futuro.<br /><br />Los desarrolladores están completamente comprometidos con el proyecto, por lo que seguiremos viendo actualizaciones sobre las versiones actuales, esperando también, por supuesto, nuevos releases.<br /><br />Enhorabuena</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-58245269723022645132009-07-30T18:34:00.006-05:002009-08-05T23:25:04.060-05:00¿Adiós a CentOS?<img style="margin: 5px 0px 0px 10px; float: right; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SnItK8NxVuI/AAAAAAAAAJo/QJdRx5RKwXI/s320/linux.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5364399772137510626" /><div style="text-align: justify;"><a href="http://www.centos.org/">CentOS</a> es una distro Linux -nacida del código fuente del Red Hat Enterprise(RHEL)- el cual cobró fuerza cuando Red Hat comenzó a comercializar su sistema operativo por medio de lincencias de uso y de soporte. CentOS por su parte surge como una alternativa de software libre ofreciendo la calidad y robustes de RHEL sin pagar costosas licencias y pólizas de soporte sosteniéndo el proyecto únicamente a base de donaciones.<br /><br />El día de hoy el equipo base de desarrolladores de este proyecto, hizo pública una carta dirigida a su fundador Lance Davis.<br /><a id="more"></a><span class="fullpost"><br /><blockquote>Julio 30, 2009 04:39 GMT<br /><br />Carta abierta a Lance Davis de los miembros que desarrollan CentOS.<br /><br />Es lamentable que nos veamos obligados a escribir esta carta no nos quedó otra opción. De algún tiempo a la fecha hemos tratado de arreglar estos problemas:<br /><br />Parece que te arrastraste hacia un agujero ... y no es aceptable.<br /><br />Por mucho tiempo diste por hecho que habría fondos para el proyecto CentOS; al día de hoy no hemos visto nada.<br /><br />Sólo tú tienes control del dominio 'centos.org' sin nadie más delegado; no es lo apropiado.<br /><br />Sólo tú, así parece, eres el único que tiene privilegios de 'Fundador' en los canales de IRC sin nadie más delegado; no es lo apropiado.<br /><br />Cuando traté de comunicarme (Russ) a los números telefónicos de Linux UK o a tu número, he escuchado el mensaje 'Líneas temporalmente ocupadas' durante las últimas dos semanas. Finalmente ayer, me respondió una máquina contestadora en la cual te dejé un mensaje solicitando que me regreses la llamada con caracter urgente. Karanbir reportó que también te ha llamado dejándote mensajes sin respuesta.<br /><br />Por favor no mates CentOS sólo por el hecho de tener miedo en querer compartir la administración del proyecto.<br /><br />Está claro que el proyecto muere si todos los desarrolladores se van.<br /><br />Contáctame de favor, o a cualquiera de los demás que firman esta carta para ponernos de acuerdo sobre la información arriba mencionada y mantener vivo el proyecto con el dominio 'centos.org'.<br /><br />Firman,<br /><br />Russ Herrold<br />Ralph Angenendt<br />Karanbir Singh<br />Jim Perrin<br />Donavan Nelson<br />Tim Verhoeven<br />Tru Huynh<br />Johnny Hughes</blockquote><br /><br />CentOS ha sido adoptado por empresas de todos los calibres demostrando su calidad, sería una verdadera pena que por actitudes de esta naturaleza pudiera ver su fin un proyecto tan bueno como este.<br /><br />Vía<br /><a href="http://www.cyberciti.biz/tips/centos-linux-project-in-trouble.html">CentOS Linux Project In Trouble</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-17609506396949855762009-07-15T16:55:00.012-05:002012-05-05T11:30:30.946-05:00¿Quien bloqueó mi sesión?<img style="float:left; margin:5px 10px 0px 0px;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" /><div style="text-align: justify;"><span style="font-weight:bold;">Recientemente me encontré con el siguiente <a href="http://www.orafaq.com/node/854" target="_blank">artículo de Natalka Roshak</a> publicado en orafaq.com que espero les sea de utilidad.</span><br /><br />Cuando un usuario o desarrollador te dice que tiene su sesión bloqueada, —entendiendo por bloqueo la ejecución de una instrucción <a href="http://en.wikipedia.org/wiki/Data_Manipulation_Language">DML</a> la cual después de lanzarla deja de responder— sabes cuan útil puede ser identificar no solo quien lo está haciendo, sino también cual objeto es ó mejor aún, puedes identificar el registro exacto que tu sesión está esperando bloquear.<br /><br /><h3>Creando el bloqueo</h3>Usaré la tabla <span style="font-family:courier new;">emp</span> del esquema <span style="font-family:courier new;">SCOTT</span>. Abro una sesión de SQL*Plus y configuro los siguiente parámetros<br /><div class="code_block">SQL> set sqlprompt "SESION1> "<br />SESION1> set linesize 200</div><br />actualizo todos los registros<br /><div class="code_block">SESION1> update emp<br /> 2 set sal=1000*1.05;<br /><br />14 rows updated.</div><a id="more"></a><br /><span class="fullpost"><span style="font-weight:bold;">sin dar commit</span> abro otra sesión de SQL*Plus actualizo la variable<br /><div class="code_block">SQL> set sqlprompt "SESION2> "<br />SESION2></div><br />y en esta actualizo sólo un registro<br /><div class="code_block">SESION2> update emp<br /> 2 set sal=1000<br /> 3 where empno=7369;</div><br />después de presionar ENTER no regresa de immediato al prompt, he aquí el bloqueo.<br /><br /><h3>Identificando la sesión que está bloqueando</h3>En una nueva sesión de SQL*Plus revisas el contenido de <span style="font-family:courier new;">v$lock</span> que muestra los bloqueos que existen actualmente en la base así como la relación entre quien bloquea a quien aunque no de manera explícita<br /><div class="code_block">SQL> select * from v$lock;<br /><br />ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK<br />-------- -------- ------- -- ------- ------- ------- --------- ------- -------<br />........ ........ ....... .. ....... ....... ....... ......... ....... .......<br />2887B03C 2887B068 144 TX 196639 3891 0 6 323 0<br />0E3CBE90 0E3CBEC0 144 TM 69948 0 3 0 323 0<br />0E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0<br />27CF5D14 27CF5D54 137 TX 196639 3891 6 0 570 <span style="font-weight:bold;">1</span></div><br />observa la última columna <span style="font-family:courier new;">BLOCK</span>, si una sesión mantiene un bloqueo que a su vez bloquea a otra verás que <span style="font-family:courier new;">BLOCK=1</span>. Llendo más allá, puedes ver cuál sesión es la que está siendo bloqueada comparando <span style="font-family:courier new;">ID1</span> e <span style="font-family:courier new;">ID2</span>. La sesión bloqueada tendrá los mismos valores en <span style="font-family:courier new;">ID1</span> e <span style="font-family:courier new;">ID2</span> que la que bloquea, y, ya que está haciendo la petición de bloqueo que no puede obtener, tendrá <span style="font-family:courier new;">REQUEST>0</span>.<br /><br />En el query anterior puedes ver que el SID 137 está bloqueando al SID 144. SID 137 corresponde a SESION1 y SID 144 es SESION2 que está bloqueada.<br /><br />Para no hacer la comparación sólo viendo los datos de ese query puedes ejecutar lo siguiente<br /><div class="code_block">SQL> select l1.sid || ' ESTA BLOQUEANDO ' || l2.sid<br /> 2 from v$lock l1, v$lock l2<br /> 3 where l1.block = 1<br /> 4 and l2.request > 0<br /> 5 and l1.id1 = l2.id1<br /> 6 and l1.id2 = l2.id2;<br /><br />L1.SID||'ESTABLOQUEANDO'||L2.SID<br />-----------------------------------<br />137 ESTA BLOQUEANDO 144</div><br />ó mejor aún, si se incluye la tabla <span style="font-family:courier new;">v$session</span> la información es aún más legible<br /><div class="code_block">SQL> select s1.username || '@' || s1.machine<br /> 2 || ' ( SID=' || s1.sid || ' ) esta bloqueando '<br /> 3 || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' as estado_bloqueos<br /> 4 from v$lock l1, v$session s1, v$lock l2, v$session s2<br /> 5 where s1.sid = l1.sid<br /> 6 and s2.sid = l2.sid<br /> 7 and l1.block = 1<br /> 8 and l2.request > 0<br /> 9 and l1.id1 = l2.id1<br /> 10 and l2.id2 = l2.id2;<br /><br />ESTADO_BLOQUEOS<br />-------------------------------------------------------------------------------------------<br />SCOTT@TESTSERVER ( SID=137 ) esta bloqueando SCOTT@TESTSERVER ( SID=144 )</div><br />Hay aún más información en la tabla <span style="font-family:courier new;">v$lock</span>, pero para leerla, es neceario entender un poquito más sobre los tipos de bloqueos y los crípticas columnas <span style="font-family:courier new;">ID1</span> e <span style="font-family:courier new;">ID2</span><br /><br /><h3>Tipo de bloqueo y las columnas ID1 / ID2</h3>En este caso el tipo de bloqueo es DML exclusivo ya que fuí yo quien lanzó la instrucción que bloquea. Sin embargo, su puede obtener esta información de <span style="font-family:courier new;">v$lock</span> sin tanto esfuerzo.<br /><br />Lo primero es ver la columna <span style="font-family:courier new;">TYPE</span>. Hay decenas de tipos de bloqueos, sin embargo, la gran mayoría son de sistema. Estos últimos por lo general son muy breves y no ayuda mucho ajustar el library cache, undo logs, etc. si te metes con <span style="font-family:courier new;">v$lock</span>.<br /><br />Sólo hay tres tipos de bloqueos de usuario, TX, TM y UL. UL es un bloqueo definido por el usuario —aquel definido con el paquete DBMS_LOCK. TX es un bloqueo de transacción de registros; se obtiene cada vez que hay una transacción para alterar datos, sin importar la cantidad de objetos que intervendrán en esa transacción. Las columnas <span style="font-family:courier new;">ID1</span> e <span style="font-family:courier new;">ID2</span> apuntan a los segmentos de rollback y a la tabla de entradas de transacciones de esa transacción.<br /><br />TM es un bloqueo DML. Se obtiene cada vez que un objeto es alterado. La columna <span style="font-family:courier new;">ID1</span> identifica el objeto en cuestión.<br /><br /><h3>Modos de bloqueo</h3>Se puede ver más información observando los modos de bloqueo TM y TX. Las columnas <span style="font-family:courier new;">LMODE</span> y <span style="font-family:courier new;">REQUEST</span> usan ambas la misma numeración que los modos de bloqueo, en orden de exclusividad incremental: desde 0 para sin bloqueo, hasta 6 para bloqueo exclusivo. Una sesión debe hacerse de un bloqueo exclusivo TX para que pueda alterar los datos; <span style="font-family:courier new;">LMODE</span> será 6. Si no puede obtener el bloqueo exclusivo debido a que algunos de los registros que quiere alterar están bloqueados por otra sesión, entonces hará la petición TX en modo exclusivo; <span style="font-family:courier new;">LMODE</span> será 0 ya que no está bloqueando, y <span style="font-family:courier new;">REQUEST</span> será 6. Esto se puede observar en el query ejecutado anteriormente<br /><div class="code_block">ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK<br />-------- -------- ------- -- ------- ------- -------- -------- ------- -------<br />2887B03C 2887B068 144 TX 196639 3891 0 6 323 0<br />27CF5D14 27CF5D54 137 TX 196639 3891 6 0 570 1</div><br />Observa en SESION2 que <span style="font-family:courier new;">ID1</span> e <span style="font-family:courier new;">ID2</span>, la cual está solicitando un bloqueo TX (<span style="font-family:courier new;">LMODE</span>=0, <span style="font-family:courier new;">REQUEST</span>=6), apunta hacia las entradas de transacciones y rollback de SESION1 que es lo que permite determinar la sesión que bloquea a SESION2.<br /><br />Es posible que te encuentres también con bloqueos TX en modo 4 de modo compartido(Shared). Si un bloqueo no encuentra ninguna entrada disponible en la Lista de Transacciones Invocadas(ITL - Interest Transaction List) y tiene registros que va a alterar, entonces la sesión obtiene un bloqueo TX en modo 4 mientras espera por la entrada(ITL). Si notas que hay contención sobre un objeto por bloqueos TX-4, es probable que necesites incrementar su parámetro <span style="font-family:courier new;">INITRANS</span>.<br /><br />Los bloqueos TM generalmente son requeridos y adquiridos en modo 3, también llamado registro compartido exclusivo(Shared-Row Exclusive) y modo 6. Las operaciones <a href="http://en.wikipedia.org/wiki/Data_Definition_Language">DDL</a> requieren de un bloqueo TM exclusivo. (Nótese que la instrucción CREATE TABLE no requiere de un bloqueo TM —y no lo necesita ya que el objeto en cuestión ¡no existe todavía!) Las operaciones DML requieren de un bloqueo Shared-Row Exclusive. De los registros seleccionados arriba sobre <span style="font-family:courier new;">v$lock</span>, puedes ver por lo niveles de bloqueo TM que son de tipo DML<br /><div class="code_block">ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK<br />-------- -------- ------- -- -------- -------- ------- -------- ------- -------<br />0E3CBE90 0E3CBEC0 144 TM 69948 0 3 0 323 0<br />0E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0</div><br /><h3>Encontrando el objeto bloqueado</h3>Ahora que sabemos que cada registro TM apunta a un objeto bloqueado, se puede usar el campo <span style="font-family:courier new;">ID1</span> para identificarlo.<br /><div class="code_block">SQL> select object_name from dba_objects where object_id=69948;<br /><br />OBJECT_NAME<br />---------------------------------------------------------------<br />EMP</div><br />A veces es suficiente con sólo saber de cuál objeto se trata; sin embargo, su puede ahondar aún más, identificando no solo el objeto, sino también el bloque de datos e incluso el registro exacto por el que espera SESION2.<br /><br /><h3>Encontrando el registro bloqueado</h3>Esta información se obtiene de <span style="font-family:courier new;">v$session</span> mediante la entrada de la sesión bloqueada<br /><div class="code_block">SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#<br /> 2 from v$session<br /> 3 where sid=144;<br /><br />ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#<br />------------- -------------- --------------- -------------<br /> 69948 4 147 0</div><br />esto regresa el ID del objeto, el número relativo de archivo, el bloque en el archivo de datos y el registro en el bloque que está esperando la sesión. Si estos datos te suenan conocidos, es porque estos son los cuatro componentes de un ROWID extendido. Se puede construir el ROWID extendido de dicho registro a partir de estos componentes usando el paquete DBMS_ROWID. La función ROWID_CREATE toma esos datos como argumentos para regresar el ROWID<br /><div class="code_block">SQL> select do.object_name, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,<br /> 2 dbms_rowid.rowid_create(1, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#)<br /> 3 from v$session s, dba_objects do<br /> 4 where sid = 144<br /> 5 and s.row_wait_obj# = do.object_id;<br /><br />OBJECT_NAM ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C<br />---------- ------------- -------------- --------------- ------------- ------------------<br />EMP 69948 4 147 0 AAARE8AAEAAAACTAAA</div><br />con el cual podemos inspeccionar directamente el registro<br /><div class="code_block">SQL> select * from scott.emp where rowid='AAARE8AAEAAAACTAAA';<br /><br /> EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<br />---------- ---------- --------- ---------- --------- ---------- ---------- ----------<br /> 7369 SMITH CLERK 7902 17-DEC-80 800 20</div><br /><br />Con lo anterior puedes identificar una sesión que está bloqueando y cómo llegar hasta el registro que está esperando la sesión bloqueada.</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com5tag:blogger.com,1999:blog-8107960283713266625.post-29285516934126390252009-07-06T15:25:00.011-05:002009-07-16T00:59:34.859-05:00Qué es una 'fork bomb' y como prevenirla<div style="text-align: justify;">En términos computacionales, 'fork' es la referencia a cuando un proceso(denominado <a href="http://en.wikipedia.org/wiki/Parent_process">proceso padre</a>) crea una copia de sí mismo(<a href="http://en.wikipedia.org/wiki/Child_process">proceso hijo</a>). En ambientes <a href="http://en.wikipedia.org/wiki/Multithreading">multihilos</a> esto significa que el hilo en ejecución(padre) es duplicado(hijo).<br /><br />Una <a href="http://en.wikipedia.org/wiki/Fork_(operating_system)">operación 'fork'</a> aparta un espacio de memoria para el hijo. Este último, es una copia exacta de todos los segmentos de memoria del proceso padre, y, a pesar de que se trate de una implementación semántica <a href="http://en.wikipedia.org/wiki/Copy-on-write">copy-on-write</a>, la memoria física podría no ser asignada(p.e. ambos procesos podrían llegar a compartir los mismos segmentos de memoria física durante algún tiempo). Tanto el proceso padre como el proceso hijo poseen los mismos segmentos de código, pero se ejecutan uno independiente del otro.<br /><br />Teniendo una breve idea de lo que significa 'fork' a nivel de sistema operativo, <a href="http://en.wikipedia.org/wiki/Fork_bomb">'fork bomb'</a> es un ataque de tipo Denegación de Servicio o <a href="http://en.wikipedia.org/wiki/Denial_of_service">DoS (Denial of Service)</a> en inglés, que implementa la operación fork (o una funcionalidad equivalente).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/SlJLAcvdx9I/AAAAAAAAAJQ/Yx9PAQ2Hf0g/s1600-h/fork_bomb.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 197px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/SlJLAcvdx9I/AAAAAAAAAJQ/Yx9PAQ2Hf0g/s320/fork_bomb.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5355425377984301010" /></a><a id="more"></a><span class="fullpost"><br />Una 'fork bomb' no se trata de un <a href="http://en.wikipedia.org/wiki/Computer_virus">virus</a> ya que no infecta otros programas o documentos, tampoco se trata de un <a href="http://en.wikipedia.org/wiki/Computer_worm">gusano</a> ya que no usa los recusos de red de la máquina para esparcirse, entra más bien en la categoría de <a href="http://en.wikipedia.org/wiki/Wabbit">'wabbit'</a>. El término 'wabbit' se atribuye probablemente a la pronunciación que hace Elmer Gruñón(caricaturas de Bugs Bunny) -en la versión en inglés- queriendo decir 'rabbit', que en español significa conejo y que al igual que los conejos una 'fork bomb' tiene la habilidad de multiplicarse rápidamente y "tumbar"(incapacitar) un sistema que confía en la asunción(generalmente válida) de que los programas y procesos que puede ejecutar simultáneamente tienen un límite.<br /><br />Esta crea rápidamente una gran cantidad de procesos con el fin de saturar los espacios disponibles en la lista de procesos que guarda el sistema operativo. Si esta se satura, no podrá ejecutarse otro programa hasta que termine otro proceso y aún si esto sucediera, no es muy probable que este programa se ejecute ya que cada una de las instancias de la bomba tratarán por sí mismas de ocupar cualquier espacio disponible.<br /><br />El siguiente código muestra la que podría considerarse una de las 'fork bomb' más elegantes. Presentada por <a href="http://en.wikipedia.org/wiki/Jaromil">Jaromil</a> como una pieza de arte de código abierto en 2002. Ejecutas los siguientes 13 caracteres en un shell tipo Unix como bash o zsh.<br /><div class="code_block">:(){ :|:& };:</div><br />Lo cual significa<br /><div class="code_block">:() <span style="font-style:italic;"># define ':' -- lo que sea que digamos ':', haz esto:</span><br />{ <span style="font-style:italic;"># inicio de lo que dijimos que tiene que hacer ':'</span><br /> : <span style="font-style:italic;"># carga otra copia de la función ':' en memoria...</span><br /> | <span style="font-style:italic;"># ...lo cual será entrada para...</span><br /> : <span style="font-style:italic;"># ...otra copia de la función ':', que tiene que cargarse en memoria</span><br /> <span style="font-style:italic;"># (por lo tanto, ':|:' sencillamente carga dos copias de ':' como sea que ':' se llame)</span><br /> & <span style="font-style:italic;"># libera las funciones -- si matan la primera ':', todas las demás que esta inició NO deberían auto-matarse</span><br />} <span style="font-style:italic;"># fin de lo que hace ':'</span><br />; <span style="font-style:italic;"># Habiendo definido ':', ahora debería...</span><br />: <span style="font-style:italic;"># ...llamar a ':', iniciando una reacción en cadena: cada ':' iniciará dos más.</span></div><br />Dado que ':' es un nombre arbitrario para la función, una versión más entendible sería:<br /><div class="code_block">forkbomb(){ forkbomb|forkbomb & };forkbomb</div><br /><span style="font-weight:bold;">Otros ejemplos.</span><br />Versión en Windows usando lenguaje batch<br /><div class="code_block">%0|%0</div><br />ó un ejemplo que reaccione rápidamente<br /><div class="code_block">:s<br />start %0<br />%0|%0<br />goto :s</div><br />un poema en Perl<br /><div class="code_block">fork while fork</div><br />en Haskell<br /><div class="code_block">import Control.Monad<br />import System.Posix.Process<br /> <br />forkBomb = forever $ forkProcess forkBomb</div><br />en Python<br /><div class="code_block">import os<br /> <br />while True:<br /> os.fork()</div><br />en Ruby<br /><div class="code_block">loop { fork }</div><br /><br /><h3>Prevención</h3>Una manera de prevenirlas es limitando el número de procesos que puede manejar un usuario. Cuando un proceso intente crear uno nuevo y el usuario esté al límite de procesos permitidos, este fallará. Los administradores deben configurar este tope lo suficientemente bajo de tal manera que si todos los usuarios lanzan una bomba simultáneamente, queden suficientes recursos para evitar el desastre; lo cual es prácticamente improbable(que todos los usuarios al mismo tiempo lancen una bomba).<br /><br />Los sistemas tipo Unix, usualmente tienen un límite de procesos controlado por el comando de shell <span style="font-style:italic;">ulimit</span>. Los kernels Linux configuran y respetan la variable <span style="font-weight:bold;">RLIMIT</span>(límite de recursos) de un proceso. De igual manera tanto en Linux como en *BSD puedes editar el archivo de configuración de pam_limits: <span style="font-family:courier;">/etc/security/limits.conf</span> y agregar la siguiente línea. Sin embargo, verifica que está habilitado ya que no todas las distribuciones de Linux vienen con pam_limits configurado por default.<br /><div class="code_block"><os_user> hard nproc 200</div><br />Si no tienes PAM habilitado intenta poniendo la siguiente línea en tu archivo de configuración <span style="font-family:courier;">/etc/profile.conf</span><br /><div class="code_block">ulimit -u 200</div><br /><br />Limitar el número de procesos que un proceso puede crear no previene de una 'fork bomb' ya que se quedarán ahí a la espera de crear más y más procesos. Un sistema que distribuya los recursos por cuota compartiendo los recursos del proceso padre podría funcionar, aunque este tipo de sistemas no son muy comunes.<br /><br />Fuentes<br /><a href="http://en.wikipedia.org/wiki/Fork_bomb">Fork bomb</a><br /><a href="http://www.cyberciti.biz/tips/linux-limiting-user-process.html">How to: Prevent a fork bomb by limiting user process</a><br /></span><br /></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com1tag:blogger.com,1999:blog-8107960283713266625.post-84227510948846057872009-07-02T17:54:00.010-05:002012-05-05T11:09:22.443-05:00De cuando el botón 'Finish' del Oracle Database Configuration Asistant (dbca) en 11g no funciona<img style="margin: 5px 0px 0px 10px; float: right; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" border="0" /><div style="text-align: justify;">Hace un par de días me pidieron cambiar una base de datos que estaba montada en una lap con Windows XP y 11g a un servidor con Solaris 10 y mismo motor (11g), trabajo para no más de medio día -dije yo-. Pues bien, dejé haciendo un export en la lap y puse a transferir la instalación y parches al servidor. Configuré el ambiente en Solaris, levanté el ambiente X en mi máquina con Cygwin y ejecuté la instalación gráfica(dbca), me tomé mi tiempo para configurar todo lo requerido y cuando finalmente llegué a la última pantalla y presioné el botón 'Finish' me doy cuenta de que no aparece ni hace nada, dudando de si me había hecho falta algo -cosa que no es posible sino no puedes avanzar- me regresé ingénuamente a revisar cada pantalla y todo estaba en orden(como era de esperarse).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/Sk00SixlVNI/AAAAAAAAAJA/PUj7oxmXM34/s1600-h/dbca_p14.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 229px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/Sk00SixlVNI/AAAAAAAAAJA/PUj7oxmXM34/s320/dbca_p14.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5353993025190450386" /></a><a id="more"></a><span class="fullpost"><br />Cerré el instalador y lo volví a lanzar con la esperanza de que esta vez si funcionara pero no fue así. Lo lancé una tercera vez pero en esta ocasión puse atención a cualquier detalle, pista o mensaje de error, siendo lo siguiente lo primero que observé<br /><div class="code_block">$ dbca<br />Warning: Cannot convert string "-monotype-arial-regular-r-normal--*-140-*-*-p-*-iso8859-1" to type FontStruct</div><br />¿Un aviso no un mensaje de error propiamente podría ser el casusante de dicho comportamiento? Veamos que dice el archivo log <span style="font-family: courier new;">[ORACLE_BASE]/cfgtoollogs/dbca/<dbname>/trace.log</span><br /><div class="code_block">[AWT-EventQueue-0] [11:20:29:828] [DBCAWizard.onFinish:1139] m_bFinishClicked: true<br />[AWT-EventQueue-0] [11:20:30:2] [DBCAWizard.onFinish:1139] m_bFinishClicked: true<br />[AWT-EventQueue-0] [11:20:35:126] [SQLEngine.done:1958] Done called</div><br />El evento de presionar el botón si aparace ¿Entonces por qué no continua?<br /><br />Buscando en Metalink información al respecto encontré la nota <a href="https://metalink2.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=NOT&p_id=727290.1">727290.1</a> la cual básicamente te dice que el problema está en tu cliente X(Cygwin en mi caso) y te sugieren que intentes con otro cliente X o con VNC.<br /><br />¿Cambiar de ambiente X en tu máquina sólo porque un insignificante botón no continua con la creación de la base? No se justifica -creo yo- y por la parte de VNC pues tampoco es opción ya que no soy quien administra el servidor.<br /><br />Opción 2, crear la base con el <span style="font-family: courier new;">dbca</span> usando el modo "silencioso". Antes de usar la opción 2 es necesario crear un template -para no tener que especificar variable por variable en la línea de comandos- con el mismo <span style="font-family: courier new;">dbca</span>. Ejecuta el asistente, configura todo lo necesario y en la última pantalla selecciona la opción "Save as a Database Template" presiona el botón 'Finish' y listo.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_t1WQBJYuFhI/Sk03BMPWxZI/AAAAAAAAAJI/azBuYJxyCGg/s1600-h/dbca_p14_temp.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 229px;" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/Sk03BMPWxZI/AAAAAAAAAJI/azBuYJxyCGg/s320/dbca_p14_temp.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5353996025618417042" /></a><br />Desde línea de comando ejecutas<br /><div class="code_block">$ dbca -silent -createDatabase -templateName <b>testdb.dbc</b> -gdbName testdb -sid testdb -sysPassword syspass -systemPassword systempass -emConfiguration LOCAL -dbsnmpPassword dbsnmppass -sysmanPassword sysmanpass</div><br />el cual sólo te mostrará el porcentaje de avance y los eventos más significativos<br /><div class="code_block">Copying database files<br />DBCA_PROGRESS : 1%<br />DBCA_PROGRESS : 3%<br />DBCA_PROGRESS : 11%<br />DBCA_PROGRESS : 18%<br />DBCA_PROGRESS : 26%<br />DBCA_PROGRESS : 37%<br />Creating and starting Oracle instance<br />DBCA_PROGRESS : 40%<br />DBCA_PROGRESS : 45%<br />DBCA_PROGRESS : 50%<br />DBCA_PROGRESS : 55%<br />DBCA_PROGRESS : 56%<br />DBCA_PROGRESS : 60%<br />DBCA_PROGRESS : 62%<br />Completing Database Creation<br />DBCA_PROGRESS : 66%<br />DBCA_PROGRESS : 70%<br />DBCA_PROGRESS : 73%<br />DBCA_PROGRESS : 77%<br />DBCA_PROGRESS : 88%<br />DBCA_PROGRESS : 100%<br />Database creation complete. For details check the logfiles at:<br /> /opt/oracle/product/cfgtoollogs/dbca/testdb.<br />Database Information:<br />Global Database Name:testdb<br />System Identifier(SID):testdb<br /><br />The Database Control URL is https://<SERVER_NAME>:1158/em<br /><br />Management Repository has been placed in secure mode wherein Enterprise Manager data will be encrypted. The encryption key has been placed in the file: /opt/oracle/product/rdbms/11.1.0.7.0/testserver_testdb/sysman/config/emkey.ora. Please ensure this file is backed up as the encrypted data will become unusable if this file is lost.</div><br />Lo anterior se graba en el archivo<br /><div class="code_block">$ cat [ORACLE_BASE]/cfgtoollogs/dbca/<DBNAME>/testdb.log</div><br />Listo, base creada y lista para lanzar el import -por la tarde noche- en el servidor con el archivo dmp generado en la lap. Por supuesto que ya no quedó en medio día como lo tenía previsto, pero la experiencia cuenta para próximas ocasiones.<br /><br />La nota de Metalink que puse arriba, menciona que este comportamiento puede presentarse también en 10g versiones 10.2.0.1 a 10.2.0.4 y en cualquier plataforma.</span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com1tag:blogger.com,1999:blog-8107960283713266625.post-35922459821720989462009-06-23T10:23:00.052-05:002012-05-05T11:37:34.610-05:00Arreglando el error: ORA-27102: out ot memory en Oracle y Solaris 10<img style="float:left; margin:5px 10px 0px 0px;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ6-aTdpXI/AAAAAAAAAI4/FV-4OuhPSSQ/s200/oracle.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351467101110248818" /><div style="text-align: justify;">Al cambiar los archivos de una base de datos Oracle en un servidor con Solaris 9 a uno con Solaris 10 y querer levantarla me encontré con el siguiente error<br /><div style="width:69%; float:right;" class="code_block">SQL> startup<br />ORA-27102: out of memory<br />SVR4 Error: 22: Invalid argument</div><br /><br /><br /><br />según el mensaje de error el servidor no tiene memoria suficiente, veamos que dice la documentación al respecto<br /><div class="code_block">$ oerr ORA 27102<br />27102, 00000, "out of memory"<br />// *Cause: Out of memory<br />// *Action: Consult the trace file for details</div><a id="more"></a><span class="fullpost"><br />nada alentador el panorama. Revisemos lo último que se registró en el archivo alert.log<br /><div class="code_block">$ cat alert.log<br />Fri Jun 5 18:19:45 2009<br />Starting ORACLE instance (normal)<br />Fri Jun 5 18:19:46 2009<br />WARNING: EINVAL creating segment of size 0x000000008c400000<br />fix shm parameters in /etc/system or equivalent</div><br />Oracle está tratando de crear un segmento de memoria compartida de 2G (dependiendo del tamaño de SGA/PGA), pero el sistema operativo respondió con un mensaje de error de argumento no válido (EINVAL). Se muestra además una pequeña pista sobre configurar los parámetros shm en <span style="font-family:courier new;">/etc/system</span>.<br /><br />Antes de Solaris 10, se configuraba el parámetro <span style="font-family:courier new;">shmsys:shminfo_shmmax</span> en <span style="font-family:courier new;">/etc/system</span> con el tamaño máximo de segmento de memoria que puede crearse. El valor por default en Solaris 9 y versiones anteriores es de 8M; mientras que en Solaris 10 o superior es 1/4 de la memoria física. Lo puedes verificar de la siguiente manera:<br /><div class="code_block">$ prtconf | grep Mem<br />Memory size: 2048 Megabytes<br />$ id -p<br />uid=110(oracle) gid=201(dba) projid=<b>3</b>(default)<br />$ prctl -n project.max-shm-memory -i project <b>3</b><br />project: 3: default<br />NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT<br />project.max-shm-memory<br /> privileged 479M - deny -<br /> system 16.0EB max deny -</div><br />He ahí el problema, el sistema está usando el valor por default de 479M para este caso, cuando Oracle está tratando de crear un segmento de memoria (2G) mayor a 479M.<br /><br />La solución es configurar el sistema con un tamaño suficientemente grande para que el segmento de memoria compartida sea creado y Oracle pueda levantar la instancia.<br /><br />En Solaris 9 y versiones anteriores, esto puede hacerse agregando la siguiente línea en <span style="font-family: courier new;">/etc/system</span>, teniendo que reiniciar el sistema para que tome el nuevo valor.<br /><div class="code_block">set shminfo_shmmax = 0x000000008c400000</div><br />En Solaris 10 el parámetro <span style="font-family: courier new;">shminfo_shmmax</span> es obsoleto y Sun no recomienda configurarlo en <span style="font-family: courier new;">/etc/system</span> aún a pesar de que funcione como se espera.<br /><br />En Solaris 10 y posterior, este valor puede cambiarse dinámicamente por proyecto con la ayuda de los servicios de control de recursos. Así es como se hace en Solaris 10 y posterior<br /><div class="code_block">$ prctl -n project.max-shm-memory -r -v <b>2G</b> -i project 3<br />$ prctl -n project.max-shm-memory -i project 3<br />NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT<br />project.max-shm-memory<br /> privileged 2.0G - deny -<br /> system 16.0EB max deny -</div><br />Todos los cambios hechos con el comando <span style="font-family: courier new;">prctl</span> se aplican al sistema de manera temporal por lo que se perderán cuando se reinicie. Para hacerlo permanente, crea un proyecto con el comando <span style="font-family: courier new;">projadd</span><br /><div class="code_block">$ projadd -p 200 -c 'Oracle config' -U oracle -G dba -K 'project.max-shm-memory=(privileged,2G,deny)' oracle</div><br />Finalmente cerciórate que fue creado con el comando <span style="font-family: courier new;">projects -l</span> ó <span style="font-family: courier new;">cat /etc/project</span><br /><div class="code_block">$ projects -l<br />...<br />...<br />oracle<br /> projid : 200<br /> comment: "Oracle config"<br /> users : oracle<br /> groups : dba<br /> attribs: project.max-shm-memory=(priv,2147483648,deny)<br />$ cat /etc/project<br />...<br />...<br />oracle:200:Oracle config:oracle:dba:project.max-shm-memory=(priv,2147483648,deny)</div><br />Con estos cambios, Oracle debería arrancar la base de datos de manera normal.<br /><div class="code_block">SQL> startup<br />ORACLE instance started.<br /><br />Total System Global Area 2333054160 bytes<br />Fixed Size 734416 bytes<br />Variable Size 1191182336 bytes<br />Database Buffers 1073741824 bytes<br />Redo Buffers 67395584 bytes<br />Database mounted.<br />Database opened.</div><br />Otro caso que puede presentar el mismo síntoma es cuando aumentas la SGA en la instancia resultado posiblemente de un tuning el cual si es mayor al segmento de memoria configurada para el sistema, cuando intentes levantar la instancia tendrá este mismo comportamiento.<br /><br />Vía<br /><a href="http://technopark02.blogspot.com/2006/09/solaris-10oracle-fixing-ora-27102-out.html">Mandalika's scratchpad</a></span><br /></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com1tag:blogger.com,1999:blog-8107960283713266625.post-70638553756984615832009-06-22T10:51:00.018-05:002009-07-07T10:30:07.222-05:00Autenticación por base de datos en Apache 2.2.x usando mod_dbd, mod_authn_dbd y mod_auth_user en Windows 2003 Server<img style="MARGIN: 5px 0px 0px 10px; WIDTH: 200px; FLOAT: right; HEIGHT: 100px;" id="BLOGGER_PHOTO_ID_5351459470255739826" border="0" alt="" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SkQ0CPJ-U7I/AAAAAAAAAIw/L8aTC2TtBwo/s200/apache.jpg" /><div style="TEXT-ALIGN: justify">En un post anterior, explico cómo configurar el <a href="http://sartigas.blogspot.com/2009/01/seguridad-bsica-de-apache.html">acceso a un directorio usando la utilería htpasswd</a> el cual funciona para pocos usuarios ya que debe hacerse manualmente por cada uno. La autenticación por base de datos ofrece una configuación más flexible, menos laboriosa e ideal para ambientes donde la cantidad de usuarios es elevada.<br /><br />Para este ejercicio usaré una base de datos Oracle 11g(11.1.0.7.0) el cual está soportado de acuerdo con la documentación de Apache que viene en el archivo <span style="font-family:courier new;">[APACHE_HOME]\README-win32.txt</span>. Es necesario tener instalado el cliente de Oracle y configurar adecuadamente una cadena de conexión(tnsnames) como la de la siguiente imagen<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/Sj7-uvoNIgI/AAAAAAAAAIY/h855LucXD3M/s1600-h/net_manager.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 244px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5349993486375264770" border="0" alt="" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/Sj7-uvoNIgI/AAAAAAAAAIY/h855LucXD3M/s320/net_manager.jpg" /></a><a id="more"></a><span class="fullpost"><br />abre una sesión de sqlplus<br /><div class="code_block">C:\>sqlplus sys as sysdba<br /><br />SQL*Plus: Release 11.1.0.7.0 - Production on Sun Jun 21 23:17:37 2009<br /><br />Copyright (c) 1982, 2008, Oracle. All rights reserved.<br /><br />Enter password:<br /><br />Connected to:<br />Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production<br />With the Partitioning, OLAP, Data Mining and Real Application Testing options<br /><br />SQL></div><br />crea un usuario<br /><div class="code_block">SQL> create user apache identified by test account unlock;<br /><br />User created</div><br />asígnale los correspondientes privilegios<br /><div class="code_block">SQL> grant create session to apache;<br /><br />Grant succeeded.<br /><br />SQL> grant resource to apache;<br /><br />Grant succeeded.</div><br />conéctate con el usuario apache, crea la tabla e inserta un registro que servirá para las pruebas de conexión<br /><div class="code_block">SQL> conn apache/test<br />Connected.<br />SQL> create table users (<br />2 username varchar2(10 byte),<br />3 passwd varchar2(10 byte)<br />4 );<br /><br />Table created.<br /><br />SQL> insert into users(username, passwd) values ('sergio', 'test');<br /><br />1 row created.<br /><br />SQL> commit;<br /><br />Commit complete.</div><br />Actualiza tu archivo de configuración de Apache <span style="font-family:courier new;">[APACHE_HOME]\conf\httpd.conf</span> para activar las siguientes líneas<br /><div class="code_block">LoadModule authn_dbd_module modules/mod_authn_dbd.so<br />LoadModule dbd_module modules/mod_dbd.so</div><br />y al final agrega lo siguiente. No olvides crear el directorio <span style="font-family:courier new;">C:\Apache22\htdocs\private</span><br /><div class="code_block"># mod_dbd configuration<br />DBDriver oracle<br />DBDParams "host=testserver port=1521 user=apache pass=test dbname=testdb"<br /><br />DBDMin 4<br />DBDKeep 8<br />DBDMax 20<br />DBDExptime 300<br /><br /><Directory "C:/Apache22/htdocs/private"><br /># core authentication and mod_auth_basic configuration<br /># for mod_authn_dbd<br />AuthType Basic<br />AuthName "Private directory"<br />AuthBasicProvider dbd<br /><br /># core authorization configuration<br />Require valid-user<br /><br /># mod_authn_dbd SQL query to authenticate a user<br />AuthDBDUserPWQuery "SELECT passwd FROM users WHERE username = %s"<br /></Directory></div><br />Levanta Apache, pero hazlo desde línea de comandos ya que si lo haces desde la consola no apreciarías algún mensaje de error que pudiera ocurrir.<br /><div class="code_block">C:\Apache22\bin>httpd -k start</div><br />si no se muestra ningún mensaje de error no está de más revisar el archivo <span style="font-family:courier new;">[APACHE_HOME]\logs\error.log</span><br /><br />Y finalmente hacer la prueba de conexión desde un navegador<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/Sj8R4ws0uNI/AAAAAAAAAIg/ZqM_-wC98LA/s1600-h/test_user.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5350014549182691538" border="0" alt="" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/Sj8R4ws0uNI/AAAAAAAAAIg/ZqM_-wC98LA/s320/test_user.jpg" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/Sj8SVevYhaI/AAAAAAAAAIo/vk62uCgARZs/s1600-h/test_user2.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5350015042577794466" border="0" alt="" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/Sj8SVevYhaI/AAAAAAAAAIo/vk62uCgARZs/s320/test_user2.jpg" /></a><br /><br /><span style="font-size:130%;">Resolviendo problemas</span><br />P: Aparece el siguiente mensaje cuando trato de levantar Apache:<br /><div class="code_block">C:\Apache22\bin>httpd -k start<br />Syntax error on line 485 of C:/Apache22/conf/httpd.conf:<br />Invalid command 'DBDriver', perhaps misspelled or defined by a module not included in the server configuration</div><br />R: No has activado en tu archivo <span style="font-family:courier new;">[APACHE_HOME]\conf\httpd.conf</span> la línea<br /><div class="code_block">LoadModule dbd_module modules/mod_dbd.so</div><br /><br />P: Aparece el siguiente mensaje cuando trato de levantar Apache:<br /><div class="code_block">C:\Apache22\bin>httpd -k start<br />Syntax error on line 498 of C:/Apache22/conf/httpd.conf:<br />Unknown Authn provider: dbd</div><br />R: No has activado en tu archivo <span style="font-family:courier new;">[APACHE_HOME]\conf\httpd.conf</span> la línea<br /><div class="code_block">LoadModule authn_dbd_module modules/mod_authn_dbd.so</div><br /><br />P: Ya levantó Apache pero no se conecta con la base de datos, reviso el archivo <span style="font-family:courier new;">[APACHE_HOME]\logs\error.log</span> y aparece el siguiente error<br /><div class="code_block">(20014)Internal error: DBD: Can't connect to oracle<br />(20014)Internal error: DBD: failed to initialise</div><br />R: El mensaje de error es genérico y sólo te informa lo que sucedió sin ninguna pista de la causa, es aquí donde donde debes revisar lo que hiciste desde el principio para determinar qué sucede y cómo solucionarlo.<br /><ol><li>Revisa el archivo <span style="font-family:courier new;">[APACHE_HOME]\README-win32.txt</span> y verifica que la versión del motor de base de datos que estás usando está soportada por la versión de Apache que instalaste.</li><li>Revisa que los parámetros en <span style="font-family:courier new;">DBDParams</span> estén correctos. A este respecto, la <a href="http://httpd.apache.org/docs/2.2/mod/mod_dbd.html#dbdparams">documentación de Apache</a> no es la correcta en cuanto a los de Oracle ya que especifica<br /><br /><div class="lbluebox">Oracle<br /> user, pass, dbname, server</div>sin embargo, especificamente "server" no lo reconoce como válido y por lo tanto es necesario usar "host" y "port" en su lugar.</li></ol><br /><br />P: El navegador me pide el usuario y la contraseña pero después de escribirlos me aparece el mensaje de error "Internal Server Error"<br /><br />R: Revisa tu archivo <span style="font-family:courier new;">[APACHE_HOME]\logs\error.log</span> en busca de detalles específicos. Te puedes encontrar, por ejemplo, con que el query que especificaste en el parámetro <span style="font-family:courier new;">AuthDBDUserPWQuery</span> no está correcto<br /><div class="code_block">(20014)Internal error: DBD: failed to prepare SQL statements: ORA-00904: "USER_NAME": invalid identifier<br />(20014)Internal error: DBD: failed to initialise</div><br /><br />Referencia<br /><a href="http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html">http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html</a><br /></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0tag:blogger.com,1999:blog-8107960283713266625.post-38896786238935639642009-06-15T19:25:00.012-05:002009-06-23T10:44:03.539-05:00Instalando SSH en Windows 2003 Server<div style="text-align: justify;"><a href="http://en.wikipedia.org/wiki/Ssh">SSH</a> o Secure Shell, es un protocolo de red que permite el intercambio de información usando un canal seguro entre el cliente y el servidor. SSH se usa comunmente para accesar de manera remota y ejecutar comandos, sin embargo, permite también crear túneles, rutear puertos TCP y conexiones X11, además de poder transferir archivos usando los protocolos <a href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol">SFTP</a> y <a href="http://en.wikipedia.org/wiki/Secure_copy">SCP</a>. Usado principalmente en sistemas Unix y Linux, SSH fue diseñado como reemplazo de Telnet y otros shells remotos no confiables los cuales transfieren información -como contraseñas- en texto plano pudiendo ser interceptados por una tercera persona.<br /><br />Aquí trataré de explicar como instalar este servicio en Windows 2003 Server usando Cygwin y OpenSSH.<br /><a id="more"></a><span class="fullpost"><br />Primero, te descargas el instalador de Cygwin:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbI_jC5RWI/AAAAAAAAAGg/omElcCb0OQo/s1600-h/desc_cygwin_exe.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 224px; height: 182px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbI_jC5RWI/AAAAAAAAAGg/omElcCb0OQo/s320/desc_cygwin_exe.jpg" alt="" id="BLOGGER_PHOTO_ID_5347682601613739362" border="0" /></a><br />lo ejecutas y sigues el asistente para descargar OpenSSH junto con las utilerías necesarias, ajustando por supuesto los parámetros que consideres necesario<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbJl3cVIGI/AAAAAAAAAGo/JqP3OJkI8ew/s1600-h/welcome_cyg.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbJl3cVIGI/AAAAAAAAAGo/JqP3OJkI8ew/s320/welcome_cyg.jpg" alt="" id="BLOGGER_PHOTO_ID_5347683259924160610" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_t1WQBJYuFhI/SjbKXEIZ9iI/AAAAAAAAAGw/tVr6udtOI34/s1600-h/down_source.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/SjbKXEIZ9iI/AAAAAAAAAGw/tVr6udtOI34/s320/down_source.jpg" alt="" id="BLOGGER_PHOTO_ID_5347684105143842338" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbLFfVPI0I/AAAAAAAAAG4/y8l8VngMosw/s1600-h/install_dir.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbLFfVPI0I/AAAAAAAAAG4/y8l8VngMosw/s320/install_dir.jpg" alt="" id="BLOGGER_PHOTO_ID_5347684902719398722" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbL0Ei2s6I/AAAAAAAAAHA/6t90fuRCyuE/s1600-h/local_pack_dir.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbL0Ei2s6I/AAAAAAAAAHA/6t90fuRCyuE/s320/local_pack_dir.jpg" alt="" id="BLOGGER_PHOTO_ID_5347685702982611874" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbMNLGbWpI/AAAAAAAAAHI/PMPojHfikLA/s1600-h/intern_conn.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbMNLGbWpI/AAAAAAAAAHI/PMPojHfikLA/s320/intern_conn.jpg" alt="" id="BLOGGER_PHOTO_ID_5347686134239156882" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbND9w5o_I/AAAAAAAAAHQ/Crlh4NE9dt8/s1600-h/down_site.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbND9w5o_I/AAAAAAAAAHQ/Crlh4NE9dt8/s320/down_site.jpg" alt="" id="BLOGGER_PHOTO_ID_5347687075552011250" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbQeF2rHJI/AAAAAAAAAHY/2hnGcbqbW1s/s1600-h/sel_pack.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbQeF2rHJI/AAAAAAAAAHY/2hnGcbqbW1s/s320/sel_pack.jpg" alt="" id="BLOGGER_PHOTO_ID_5347690822935190674" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_t1WQBJYuFhI/SjbShT0kWgI/AAAAAAAAAHg/gvlINjKvcN4/s1600-h/sel_pack2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://2.bp.blogspot.com/_t1WQBJYuFhI/SjbShT0kWgI/AAAAAAAAAHg/gvlINjKvcN4/s320/sel_pack2.jpg" alt="" id="BLOGGER_PHOTO_ID_5347693077247318530" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbTXTUaF3I/AAAAAAAAAHo/8oiDKFF-DHc/s1600-h/sel_pack3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbTXTUaF3I/AAAAAAAAAHo/8oiDKFF-DHc/s320/sel_pack3.jpg" alt="" id="BLOGGER_PHOTO_ID_5347694004825364338" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbT30LfcpI/AAAAAAAAAHw/socYlbsYqbg/s1600-h/progress.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbT30LfcpI/AAAAAAAAAHw/socYlbsYqbg/s320/progress.jpg" alt="" id="BLOGGER_PHOTO_ID_5347694563402150546" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbUdPMcUDI/AAAAAAAAAH4/fL4VNQN6gmg/s1600-h/progress2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/SjbUdPMcUDI/AAAAAAAAAH4/fL4VNQN6gmg/s320/progress2.jpg" alt="" id="BLOGGER_PHOTO_ID_5347695206309056562" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbU1rTxWsI/AAAAAAAAAIA/yg-qv3_FUE0/s1600-h/crea_icons.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_t1WQBJYuFhI/SjbU1rTxWsI/AAAAAAAAAIA/yg-qv3_FUE0/s320/crea_icons.jpg" alt="" id="BLOGGER_PHOTO_ID_5347695626172848834" border="0" /></a><br />Edita el archivo c:\cygwin\Cygwin.bat y añade lo siguiente<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbXN7Oz0iI/AAAAAAAAAII/wnedy8rU0NU/s1600-h/edit_bat.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="http://3.bp.blogspot.com/_t1WQBJYuFhI/SjbXN7Oz0iI/AAAAAAAAAII/wnedy8rU0NU/s320/edit_bat.jpg" alt="" id="BLOGGER_PHOTO_ID_5347698241787122210" border="0" /></a><br />Abre una sesión de Cygwin -doble click al ícono creado en tu escritorio de Windows- ó desde una sesión de línea de comandos de Windows (<span style="font-family:courier new;">cmd</span>) ejecuta el archivo <span style="font-family:courier new;">c:\cygwin\Cygwin.bat</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_t1WQBJYuFhI/Sjbaf6JZ5LI/AAAAAAAAAIQ/GXyXoPbU5xk/s1600-h/open_session.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 158px;" src="http://1.bp.blogspot.com/_t1WQBJYuFhI/Sjbaf6JZ5LI/AAAAAAAAAIQ/GXyXoPbU5xk/s320/open_session.jpg" alt="" id="BLOGGER_PHOTO_ID_5347701849268544690" border="0" /></a><br />ejecuta el siguiente comando para cambiar el prefijo de montaje de "/cygdrive" a "/". Cierras esta sesión y abres una nueva para resetear la variable de ambiente PATH.<br /><div class="code_block">$ mount -s --change-cygdrive-prefix /</div><br />crea el archivo de usuarios<br /><div class="code_block">$ mkpasswd -l > /etc/passwd</div><br />el archivo de grupos<br /><div class="code_block">$ mkgroup -l > /etc/group</div><br />asigna privilegio de lectura sobre ambos<br /><div class="code_block">$ chmod +r /etc/passwd<br />$ chmod +r /etc/group</div><br />asigna los siguientes privilegios sobre el directorio /var<br /><div class="code_block">$ chmod 755 /var</div><br />si no existe el directorio /home es recomendable que lo crees ya que ahí se guardarán los archivos de los usuarios, la ubicación por default es el directorio "Documents and Settings". Al crear el directorio /home usando la opción -p hará que cuando se cree un usuario su directorio de trabajo estará dentro del directorio c:\cygwin.<br /><div class="code_block">$ mkdir -p /home<br />$ mkdir /home/Administrator<br />$ cd</div><br />Hasta aquí tienes configurado tu ambiente, lo siguiente es instalar el servicio de ssh ejecutando el comando <span style="font-family: courier new;">ssh-host-config</span> el cual genera los archivos llave de ssh del host dentro de /etc. Nota que se crean dos usuarios, uno llamado sshd para manejar la separación de privilegios y otro llamado sshd_server requerido por Windows 2003 para correr el servicio y proveer de autenticación por llave pública. Tu salida debe ser algo parecida a esta<br /><div class="code_block">$ <b>ssh-host-config</b><br />*** Info: Generating /etc/ssh_host_key<br />*** Info: Generating /etc/ssh_host_rsa_key<br />*** Info: Generating /etc/ssh_host_dsa_key<br />*** Info: Creating default /etc/ssh_config file<br />*** Info: Creating default /etc/sshd_config file<br />*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.<br />*** Info: However, this requires a non-privileged account called 'sshd'.<br />*** Info: For more info on privilege separation read /usr/share/doc/openssh/README.privsep.<br />*** Query: Should privilege separation be used? (yes/no) <b>yes</b><br />*** Info: Note that creating a new user requires that the current account have<br />*** Info: Administrator privileges. Should this script attempt to create a<br />*** Query: new local account 'sshd'? (yes/no) <b>yes</b><br />*** Info: Updating /etc/sshd_config file<br /><br /><br />*** Warning: The following functions require administrator privileges!<br /><br />*** Query: Do you want to install sshd as a service?<br />*** Query: (Say "no" if it is already installed as a service) (yes/no) <b>yes</b><br />*** Info: Note that the CYGWIN variable must contain at least "ntsec"<br />*** Info: for sshd to be able to change user context without password.<br />*** Query: Enter the value of CYGWIN for the daemon: [ntsec] <b>ntsec</b><br />*** Info: On Windows Server 2003, Windows Vista, and above, the<br />*** Info: SYSTEM account cannot setuid to other users -- a capability<br />*** Info: sshd requires. You need to have or to create a privileged<br />*** Info: account. This script will help you do so.<br /><br />*** Info: You appear to be running Windows 2003 Server or later. On 2003<br />*** Info: and later systems, it's not possible to use the LocalSystem<br />*** Info: account for services that can change the user id without an<br />*** Info: explicit password (such as passwordless logins [e.g. public key<br />*** Info: authentication] via sshd).<br /><br />*** Info: If you want to enable that functionality, it's required to create<br />*** Info: a new account with special privileges (unless a similar account<br />*** Info: already exists). This account is then used to run these special<br />*** Info: servers.<br /><br />*** Info: Note that creating a new user requires that the current account<br />*** Info: have Administrator privileges itself.<br /><br />*** Info: No privileged account could be found.<br /><br />*** Info: This script plans to use 'cyg_server'.<br />*** Info: 'cyg_server' will only be used by registered services.<br />*** Query: Do you want to use a different name? (yes/no) <b>yes</b><br />*** Query: Enter the new user name: <b>sshd_server</b><br />*** Query: Reenter: <b>sshd_server</b><br /><br />*** Query: Create new privileged user account 'sshd_server'? (yes/no) <b>yes</b><br />*** Info: Please enter a password for new user sshd_server. Please be sure<br />*** Info: that this password matches the password rules given on your system.<br />*** Info: Entering no password will exit the configuration.<br />*** Query: Please enter the password:<br />*** Query: Reenter:<br /><br />*** Info: User 'sshd_server' has been created with password 'welcome'.<br />*** Info: If you change the password, please remember also to change the<br />*** Info: password for the installed services which use (or will soon use)<br />*** Info: the 'sshd_server' account.<br /><br />*** Info: Also keep in mind that the user 'sshd_server' needs read permissions<br />*** Info: on all users' relevant files for the services running as 'sshd_server'<br />.<br />*** Info: In particular, for the sshd server all users' .ssh/authorized_keys<br />*** Info: files must have appropriate permissions to allow public key<br />*** Info: authentication. (Re-)running ssh-user-config for each user will set<br />*** Info: these permissions corrently. [Similary restrictions apply, for<br />*** Info: instance, for .rhosts files if the rshd server is running, etc].<br /><br /><br />*** Info: The sshd service has been installed under the 'sshd_server'<br />*** Info: account. To start the service now, call `net start sshd' or<br />*** Info: `cygrunsrv -S sshd'. Otherwise, it will start automatically<br />*** Info: after the next reboot.<br /><br />*** Info: Host configuration finished. Have fun!</div><br />para levantarlo desde línea de comando ejecutas<br /><div class="code_block">$ net start sshd</div><br />ó<br /><div class="code_block">$ cygrunsrv -S sshd</div><br />o desde "Control Panel -> Administrative Tools -> Services" el servicio llamado "CYGWIN sshd".<br /><br />Nunca está de más una prueba antes de avisar que ya lo configuraste. La salida debería parecerse a la siguiente:<br /><div class="code_block">$ <b>ssh -v localhost</b><br />OpenSSH_5.1p1, OpenSSL 0.9.8k 25 Mar 2009<br />debug1: Reading configuration data /etc/ssh_config<br />debug1: Connecting to localhost [127.0.0.1] port 22.<br />debug1: Connection established.<br />debug1: identity file /home/Administrator/.ssh/identity type -1<br />debug1: identity file /home/Administrator/.ssh/id_rsa type -1<br />debug1: identity file /home/Administrator/.ssh/id_dsa type -1<br />debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1<br />debug1: match: OpenSSH_5.1 pat OpenSSH*<br />debug1: Enabling compatibility mode for protocol 2.0<br />debug1: Local version string SSH-2.0-OpenSSH_5.1<br />debug1: SSH2_MSG_KEXINIT sent<br />debug1: SSH2_MSG_KEXINIT received<br />debug1: kex: server->client aes128-cbc hmac-md5 none<br />debug1: kex: client->server aes128-cbc hmac-md5 none<br />debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192)<br />Warning: Permanently added 'localhost' (RSA) to the list of known hosts.<br />debug1: ssh_rsa_verify: signature correct<br />debug1: SSH2_MSG_NEWKEYS sent<br />debug1: expecting SSH2_MSG_NEWKEYS<br />debug1: SSH2_MSG_NEWKEYS received<br />debug1: SSH2_MSG_SERVICE_REQUEST sent<br />debug1: SSH2_MSG_SERVICE_ACCEPT received<br />debug1: Authentications that can continue: publickey,password,keyboard-interacti<br />ve<br />debug1: Next authentication method: publickey<br />debug1: Trying private key: /home/Administrator/.ssh/identity<br />debug1: Trying private key: /home/Administrator/.ssh/id_rsa<br />debug1: Trying private key: /home/Administrator/.ssh/id_dsa<br />debug1: Next authentication method: keyboard-interactive<br />debug1: Authentications that can continue: publickey,password,keyboard-interacti<br />ve<br />debug1: Next authentication method: password<br />Administrator@localhost's password:<br />debug1: Authentication succeeded (password).<br />debug1: channel 0: new [client-session]<br />debug1: Requesting no-more-sessions@openssh.com<br />debug1: Entering interactive session.<br /><br />Administrator@testserver ~<br />$</div><br /><br />Fuente<br /><a href="http://ist.uwaterloo.ca/~kscully/CygwinSSHD_W2K3.html">http://ist.uwaterloo.ca/~kscully/CygwinSSHD_W2K3.html</a><br /><br />Fuente con tips de solución a problemas en XP<br /><a href="http://pigtail.net/LRP/printsrv/cygwin-sshd.html">http://pigtail.net/LRP/printsrv/cygwin-sshd.html</a></span></div>Estergios Artigashttp://www.blogger.com/profile/16088291610241822376noreply@blogger.com0