<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Adobe User Group Granada &#187; mysql</title>
	<atom:link href="http://www.adobe-user-group-granada.es/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adobe-user-group-granada.es</link>
	<description>Grupo de usuarios de Adobe orientado a Dreamweaver y Spry en la ciudad de Granada</description>
	<lastBuildDate>Sat, 21 Jan 2012 19:10:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Almacenar la salida de un comando SQL en formato CSV</title>
		<link>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/</link>
		<comments>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 18:35:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=1004</guid>
		<description><![CDATA[El formato CSV resulta muy cómodo tanto de generar  como leer, por eso muchos programas lo aceptan. Se trata simplemente de  valores separados por comas (Comma-Separated Values). Vamos a ver como generar un fichero desde MySQL para almacenar datos.
Para generar el fichero desde un comando SQL en MySQL deberemos indicar INTO OUTFILE con [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>formato CSV</strong> resulta muy cómodo tanto de generar  como leer, por eso muchos programas lo aceptan. Se trata simplemente de  valores separados por comas (<strong>Comma-Separated Values</strong>). Vamos a ver como generar un fichero desde <strong>MySQL</strong> para almacenar datos.</p>
<p>Para generar el fichero desde un comando <strong>SQL</strong> en <strong>MySQL</strong> deberemos indicar <strong>INTO OUTFILE</strong> con el nombre de fichero y las siguientes opciones:</p>
<ul>
<li><strong>FIELDS TERMINATED BY</strong>: Indicamos como terminan los campos, en este caso deben ser separados por comas <strong>‘,’</strong></li>
<li><strong>OPTIONALLY ENCLOSED BY</strong>: Como se deben indicar en el caso que tengan el separador como valor. En este caso mediante comillas dobles <strong>‘”‘</strong></li>
<li><strong>ESCAPED BY</strong>: Indicamos como debemos escapar los carácteres, en este caso mediante la contrabarra <strong>‘\\’</strong></li>
<li><strong>LINES TERMINATED BY</strong>: Indicamos como especificamos una nueva fila, en este caso mediante un intro <strong>‘\n’</strong></li>
</ul>
<p>Por lo tanto el comando <strong>SQL</strong> quedaría:</p>
<pre>mysql&gt;  select * from loquesea
INTO OUTFILE "/tmp/inventari.txt"
FIELDS TERMINATED BY  ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY  '\\'
LINES TERMINATED BY '\n' from RackObject;
Query OK, 168 rows affected (0.29 sec)</pre>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/06/almacenar-la-salida-de-un-comando-sql-en-formato-csv" target="_blank">Systemadmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Modos de la query cache</title>
		<link>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/</link>
		<comments>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/#comments</comments>
		<pubDate>Mon, 23 May 2011 17:56:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=985</guid>
		<description><![CDATA[La query cache es un mecanismo mediante el cual si ejecuta la misma query multiples veces, sin que los datos se hayan modificado, devuelve los resultados de una zona de memoria que los conserva para no tener que tener que ir a buscarlos de nuevo si son pedidos repetidas veces.
Mediante SHOW VARIABLES podemos ver si tenemos la query cache disponible [...]]]></description>
			<content:encoded><![CDATA[<p>La <strong>query cache</strong> es un mecanismo mediante el cual <strong>si ejecuta la misma query multiples veces</strong>, sin que los datos se hayan modificado, devuelve los resultados de una <strong>zona de memoria</strong> que los conserva para no tener que tener que ir a buscarlos de nuevo si son pedidos repetidas veces.</p>
<p>Mediante <strong>SHOW VARIABLES</strong> podemos ver si tenemos la <strong>query cache</strong> disponible en el servidor de <strong>MySQL</strong>:</p>
<pre>mysql&gt; show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)</pre>
<p><span id="more-985"></span></p>
<p>En caso de tenerla disponible deberemos consultar las variables <strong>query_cache_size</strong>y <strong>query_cache_type</strong> para saber si esta habilitada y con que tamaño.</p>
<p>La variable <strong>query_cache_type</strong> puede tener tres valores:</p>
<ul>
<li><strong>0</strong> o <strong>OFF</strong>: La query cache esta <strong>deshabilitada</strong></li>
<li><strong>1</strong> o <strong>ON</strong>: La query cache esta <strong>habilitada para todas las queries</strong> menos las que indiquemos con el <strong>hint SQL_NO_CACHE</strong></li>
<li><strong>2</strong> o <strong>DEMAND</strong>: La query cache esta <strong>deshabilitada para todas las queries</strong> menos las que indiquemos con el <strong>hint SQL_CACHE</strong></li>
</ul>
<p>Por otro lado mediante <strong>query_cache_size</strong> también podemos deshabilitar la query cache, simplemente deberemos definir el <strong>tamaño a cero</strong>. En caso que definamos un valor positivo en este parámetro, la query cache estará habilitada o no según este definida la <strong>query_cache_type</strong>.</p>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/04/modos-de-la-query-cache" target="_blank">Systemadmin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL en modo bootstrap (similar a single user)</title>
		<link>http://www.adobe-user-group-granada.es/mysql-en-modo-bootstrap-similar-a-single-user/</link>
		<comments>http://www.adobe-user-group-granada.es/mysql-en-modo-bootstrap-similar-a-single-user/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 17:59:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=980</guid>
		<description><![CDATA[Una opción interesante del mysqld es la opción –bootstrap, esta se usa para inicializar la base de datos sin arrancar totalmente la instancia. Vamos a ver como funciona y como podemos usarla para tener el MySQL en un modo similar a lo que sería el single user de Unix.
Con dicha opción –bootstrap arranca el mínimo de la instancia sin tener [...]]]></description>
			<content:encoded><![CDATA[<p>Una opción interesante del <strong>mysqld</strong> es la opción<strong> –bootstrap</strong>, esta se usa para inicializar la base de datos sin arrancar totalmente la instancia. Vamos a ver como funciona y como podemos usarla para tener el <strong>MySQL</strong> en un modo similar a lo que sería el <strong>single user</strong> de Unix.</p>
<p>Con dicha <strong>opción –bootstrap</strong> arranca el mínimo de la instancia <strong>sin tener disponible ni el socket ni el puerto TCP</strong> para conexiones de clientes, sino que <strong>únicamente se comunica con el usuario por stdin</strong>.</p>
<p>Por lo tanto, deberemos pasar los comandos que queremos que ejecute. Cuando le mandemos el <strong>EOF</strong>, se cerrará la base de datos y terminará la aplicación. Por ejemplo, con el <strong>MySQL</strong> apagado ejecutamos el <strong>mysqld</strong> con la opción <strong>bootstap</strong> y le mandamos crear una base de datos:</p>
<p><span id="more-980"></span></p>
<pre><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;"># /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --bootstrap</span>
create database test_single_user;</pre>
<p>Finalizando la entrada de comandos con <strong>control-D</strong> (<strong>EOF</strong>).</p>
<p>Una vez arranquemos de nuevo el <strong>MySQL</strong> normalmente, podremos comprobar como se ha ejecutado el comando que hemos indicado:</p>
<pre># mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.10-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test_single_user   |
+--------------------+
4 rows in set (0.00 sec)

mysql&gt;</pre>
<p>Evidentemente, podemos ejecutar más de un comando, siendo de esta forma una buena manera de ejecutar ciertas operaciones delicadas que no queremos que <strong>nadie nos pueda molestar</strong>:</p>
<pre># /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --bootstrap
use test_single_user
create table a2 as select * from a1;</pre>
<p>Nuestra fuente:  <a href="http://systemadmin.es/2011/04/mysql-en-modo-bootstrap-similar-a-single-user" target="_blank">systemadmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/mysql-en-modo-bootstrap-similar-a-single-user/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Índices en tablas particionadas</title>
		<link>http://www.adobe-user-group-granada.es/indices-en-tablas-particionadas/</link>
		<comments>http://www.adobe-user-group-granada.es/indices-en-tablas-particionadas/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 22:33:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=363</guid>
		<description><![CDATA[En MySQL 5.1 se introdujo la posibilidad de particionar tablas, en algunos casos puede causar más problemas que soluciones. Vamos a ver a continuación un ejemplo de tabla que para las consultas que indicaremos no tiene sentido particionarla.
En la documentación de MySQL hay un listado de limitaciones del particionamiento de MySQL 5.1. A continuación veremos [...]]]></description>
			<content:encoded><![CDATA[<p>En <strong>MySQL 5.1</strong> se introdujo la posibilidad de <strong>particionar tablas</strong>, en algunos casos puede causar más problemas que soluciones. Vamos a ver a continuación un ejemplo de tabla que para las consultas que indicaremos <strong>no tiene sentido particionarla</strong>.</p>
<p>En la <strong>documentación de MySQL</strong> hay un listado de <a href="http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html">limitaciones del particionamiento de MySQL 5.1</a>. A continuación veremos aplicados algunas de las limitaciones:</p>
<p>Primero de todo supondremos la siguiente tabla:</p>
<pre>CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usuario` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `usuario` (`usuario`)
) ENGINE=MyISAM AUTO_INCREMENT=1645135 DEFAULT CHARSET=utf8;</pre>
<p>Con <strong>un total de 1.645.134 registros</strong> de ejemplo:</p>
<pre>mysql&gt; select count(*) from usuarios;
+----------+
| count(*) |
+----------+
|  1645134 |
+----------+
1 row in set (0.00 sec)
</pre>
<p>Nuestra fuente:<a href="http://systemadmin.es/2010/02/indices-en-tablas-particionadas" target="_blank">systemadmin.es</a><br />
<span id="more-363"></span><br />
El <strong>patrón de acceso</strong> que vamos a suponer es del siguiente tipo de queries:</p>
<pre>SELECT usuario, password FROM usuarios where usuario='ejemplo';</pre>
<p>La primera limitación que nos encontramos es que no podemos crear particiones usando <strong>tipos de datos no numéricos</strong>:</p>
<pre>mysql&gt; alter table usuarios_part partition by hash(usuario) partitions 8;
ERROR 1491 (HY000): The PARTITION function returns the wrong type</pre>
<p>Y tampoco podremos usar una función como <strong>LENGTH()</strong> para transformar un string en un valor numérico:</p>
<pre>mysql&gt; alter table usuarios_part partition by hash(LENGTH(usuario)) partitions 8;
ERROR 1564 (HY000): This partition function is not allowed</pre>
<p>Podemos intentar <strong>particionar por id</strong>, que ya es un valor numérico, pero nos encontraremos con otra <strong>limitación de MySQL</strong>, los índices no pueden ser globales, sino locales a la partición:</p>
<pre>mysql&gt; alter table usuarios_part partition by hash(id) partitions 8;
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function</pre>
<p>Podemos verlo mirando los ficheros que genera una tabla sin particionar:</p>
<pre>-rw-rw----  1 mysql mysql      8630 Feb 10 09:36 usuarios.frm
-rw-rw----  1 mysql mysql  34396808 Feb 10 09:37 usuarios.MYD
-rw-rw----  1 mysql mysql  53809152 Feb 10 09:37 usuarios.MYI</pre>
<p>Y compararlos con los ficheros en una <strong>tabla particionada</strong>:</p>
<pre>-rw-rw----  1 mysql mysql      8630 Feb 10 09:55 usuarios_part.frm
-rw-rw----  1 mysql mysql        48 Feb 10 09:55 usuarios_part.par
-rw-rw----  1 mysql mysql   4300132 Feb 10 09:56 usuarios_part#P#p0.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p0.MYI
-rw-rw----  1 mysql mysql   4299516 Feb 10 09:56 usuarios_part#P#p1.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p1.MYI
-rw-rw----  1 mysql mysql   4298944 Feb 10 09:56 usuarios_part#P#p2.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p2.MYI
-rw-rw----  1 mysql mysql   4299772 Feb 10 09:56 usuarios_part#P#p3.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p3.MYI
-rw-rw----  1 mysql mysql   4299488 Feb 10 09:56 usuarios_part#P#p4.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p4.MYI
-rw-rw----  1 mysql mysql   4299812 Feb 10 09:56 usuarios_part#P#p5.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p5.MYI
-rw-rw----  1 mysql mysql   4299280 Feb 10 09:56 usuarios_part#P#p6.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p6.MYI
-rw-rw----  1 mysql mysql   4299864 Feb 10 09:56 usuarios_part#P#p7.MYD
-rw-rw----  1 mysql mysql   2114560 Feb 10 09:56 usuarios_part#P#p7.MYI</pre>
<p>Podemos apreciar que cada partición tiene su porpio fichero de datos y de índices según este patrón: <strong>tabla#P#p&lt;Numero de partición&gt;.MYI</strong> (índices)y <strong>tabla#P#p&lt;Numero de partición&gt;.MYD </strong>(datos)</p>
<p>Procederemos entonces a eliminar dicho <strong>índice UNIQUE</strong>:</p>
<pre>mysql&gt; alter table usuarios_part drop key usuario;
Query OK, 1645134 rows affected (6.99 sec)
Records: 1645134  Duplicates: 0  Warnings: 0</pre>
<p>A continuación podremos crear las particiones:</p>
<pre>mysql&gt; alter table usuarios_part partition by hash(id) partitions 8;
Query OK, 1645134 rows affected (4.92 sec)
Records: 1645134  Duplicates: 0  Warnings: 0</pre>
<p>Podemos a continuación comparar con una tabla sin particionar:</p>
<pre>mysql&gt; select * from usuarios where usuario='therealme';
+---------+-----------+----------+
| id      | usuario   | password |
+---------+-----------+----------+
| 1318467 | therealme |          |
+---------+-----------+----------+
1 row in set (0.00 sec)</pre>
<p>Y su <strong>EXPLAIN</strong>:</p>
<pre>mysql&gt; explain select * from usuarios where usuario='therealme';
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | usuarios | const | usuario       | usuario | 194     | const |    1 |       |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)</pre>
<p>Con la <strong>tabla particionada</strong> en este punto:</p>
<pre>mysql&gt; select * from usuarios_part where usuario='therealme';
+---------+-----------+----------+
| id      | usuario   | password |
+---------+-----------+----------+
| 1318467 | therealme |          |
+---------+-----------+----------+
1 row in set (0.36 sec)</pre>
<p>Hasta este punto podemos ver como la diferencia de tiempo es considerable. Podemos ver como el <strong>EXPLAIN nos indica la falta del índice</strong>:</p>
<pre>mysql&gt; explain select * from usuarios_part where usuario='therealme';
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | usuarios_part | ALL  | NULL          | NULL | NULL    | NULL | 1645134 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)</pre>
<p>Como no se puede crear un índice global, podemos obtar por incluir el id en el índice:</p>
<pre>mysql&gt; alter table usuarios_part add unique (usuario,id);
Query OK, 1645134 rows affected (39.06 sec)
Records: 1645134  Duplicates: 0  Warnings: 0</pre>
<p><strong>MySQL</strong> permite la utilización de <strong>prefijos de los índices</strong> existentes, por lo que podemos crear el índice <strong>(usuario,id)</strong> y utilizarlo como si fuera solo de <strong>(usuario)</strong>. Esto tiene un inconveniente, realmente no estamos creando una <strong>restricción de UNIQUE</strong> en el campo “usuario”, ya que al agregar el id autoincremental el conjunto siempre será único:</p>
<pre>mysql&gt; insert into usuarios_part(usuario) values ('therealme');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql&gt; select * from usuarios_part where usuario='therealme';
+---------+-----------+----------+
| id      | usuario   | password |
+---------+-----------+----------+
| 1318467 | therealme |          |
| 1645135 | therealme |          |
+---------+-----------+----------+
2 rows in set (0.42 sec)</pre>
<p>Por la cantidad de registros, en la query en tiempo vamos a notar poca diferencia con la versión sin particionar:</p>
<pre>mysql&gt; select * from usuarios_part where usuario='therealme';
+---------+-----------+----------+
| id      | usuario   | password |
+---------+-----------+----------+
| 1318467 | therealme |          |
+---------+-----------+----------+
1 row in set (0.00 sec)</pre>
<p>Pero en el EXPLAIN podemos notar la diferencia:</p>
<pre>mysql&gt; explain select * from usuarios_part where usuario='therealme';
+----+-------------+---------------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table         | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+---------------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | usuarios_part | ref  | usuario       | usuario | 194     | const |    8 | Using where |
+----+-------------+---------------+------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)</pre>
<p>Debemos fijarnos en el <strong>type del EXPLAIN</strong> de las dos queries:</p>
<ul>
<li>En el caso de la tabla no particionada el <strong>type</strong> es <strong>const</strong>: Por lo que indica que seleccionamos un solo valor, por lo que es el mejor caso (exceptuando <strong>system</strong> que no aplicaría en este caso)</li>
<li>En el caso de la tabla particionada el <strong>type</strong> es <strong>ref</strong>: Esto indica que deberá recorrer todo el índice en búsqueda de todos los valores</li>
</ul>
<p>En el caso de una tabla sin particionar el índice se trata de un solo fichero, pero en el caso de una tabla particionada deberemos recorrer todos los índices de todas las particiones, por lo que no sólo va a ser peor por passar de un <strong>const</strong> a un <strong>ref</strong>, sino que <strong>no se trata de un índice sino tantos como particiones</strong>.</p>
<p>Evidentemente el <strong>particionamiento es bueno</strong> para algunos casos pero no cada caso debe ser analizado para ver si aplica. Por el contrario, muchas veces parece que la gente se lo toma como: “<em>Con el particonamiento se solucionaran todos los problemas de rendimiento</em>” o “<em>Si la tabla es grande se debe particionar</em>“. Cada cosa tiene su lugar, por lo que se debe planificar bien un cambio de estas características, nunca se debe hacer por hacer.<br />
<!-- Social Bookmarking Reloaded BEGIN --><em> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/indices-en-tablas-particionadas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inyección de código HTML y Javascript en el TITLE</title>
		<link>http://www.adobe-user-group-granada.es/inyeccion-de-codigo-html-y-javascript-en-el-title/</link>
		<comments>http://www.adobe-user-group-granada.es/inyeccion-de-codigo-html-y-javascript-en-el-title/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 21:47:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=291</guid>
		<description><![CDATA[Cada vez se van puliendo más las inyecciones de HTML o javascript en las webs, pero como no se suelen gestionar de una forma unificada acaban apareciendo de nuevo en lugares más escondidos, por ejemplo en el TITLE, pero siguen sin desaparecer.
NuestraFuente:  SystemAdmin.es
]]></description>
			<content:encoded><![CDATA[<p>Cada vez se van puliendo más las <strong>inyecciones de HTML o javascript</strong> en las webs, pero como no se suelen gestionar de una forma unificada acaban apareciendo de nuevo en lugares más escondidos, por ejemplo en el <strong>TITLE</strong>, pero siguen sin desaparecer.</p>
<p>NuestraFuente:  <a onclick="javascript:pageTracker._trackPageview('/outbound/article/systemadmin.es');" href="http://systemadmin.es/2010/02/ejecutar-scripts-en-php-con-un-phpini-diferente" target="_blank">SystemAdmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/inyeccion-de-codigo-html-y-javascript-en-el-title/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BigDump: facilita recuperar dumps de MySQL grandes</title>
		<link>http://www.adobe-user-group-granada.es/bigdump-facilita-recuperar-dumps-de-mysql-grandes-2/</link>
		<comments>http://www.adobe-user-group-granada.es/bigdump-facilita-recuperar-dumps-de-mysql-grandes-2/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:51:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[dump]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=260</guid>
		<description><![CDATA[A veces es un lío enorme recuperar BDs obtenidos de dumps cuando el fichero es enorme, sobre todo si usamos phpMyAdmin (y no tenemos acceso a él). Por ello este script nos puede venir muy bien para recuperar backups anteriores, ya que recupera de poco en poco y se auto-reinicia él mismo.
BigDump
Nuestra Fuente: SentidoWeb.com
]]></description>
			<content:encoded><![CDATA[<p>A veces es un lío enorme recuperar BDs obtenidos de dumps cuando el fichero es enorme, sobre todo si usamos phpMyAdmin (y no tenemos acceso a él). Por ello este script nos puede venir muy bien para recuperar backups anteriores, ya que recupera de poco en poco y se auto-reinicia él mismo.</p>
<p><a href="http://www.ozerov.de/bigdump.php">BigDump</a></p>
<p>Nuestra Fuente: <a href="http://sentidoweb.com/2010/02/05/bigdump-facilita-recuperar-dumps-de-mysql-grandes.php" target="_blank">SentidoWeb.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/bigdump-facilita-recuperar-dumps-de-mysql-grandes-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso de Maatkit para detectar índices duplicados en MySQL</title>
		<link>http://www.adobe-user-group-granada.es/uso-de-maatkit-para-detectar-indices-duplicados-en-mysql/</link>
		<comments>http://www.adobe-user-group-granada.es/uso-de-maatkit-para-detectar-indices-duplicados-en-mysql/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 19:24:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[indices]]></category>
		<category><![CDATA[maatkit]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=115</guid>
		<description><![CDATA[El Maatkit es un conjunto de utilidades para la administración de MySQL. Una de ellas permite buscar los indices duplicados para una base de datos en concreto.

Para obterner dicha utilidad lo podemos hacer mediante el siguiente wget:
# cd /usr/local/bin
#  wget http://www.maatkit.org/get/mk-duplicate-key-checker
# chmod +x mk-duplicate-key-checker

Si no los teneis ya instalados, necesitareis los siguientes modulos de [...]]]></description>
			<content:encoded><![CDATA[<p>El <a href="http://www.maatkit.org/">Maatkit</a> es un <a href="http://www.maatkit.org/doc/">conjunto de utilidades</a> para la <strong>administración de MySQL</strong>. Una de ellas permite buscar los <strong>indices duplicados</strong> para una base de datos en concreto.</p>
<p><!-- more --></p>
<p>Para obterner dicha utilidad lo podemos hacer mediante el siguiente <strong>wget</strong>:</p>
<pre># cd /usr/local/bin
#  wget http://www.maatkit.org/get/mk-duplicate-key-checker
# chmod +x mk-duplicate-key-checker
</pre>
<p>Si no los teneis ya instalados, necesitareis los siguientes modulos de <strong>perl</strong>:</p>
<ul>
<li><strong>DBD::mysql</strong></li>
<li><strong>Term::ReadKey</strong></li>
</ul>
<p>Se pueden instalar mediante <strong>cpan</strong> (recortanda la salida):</p>
<pre># cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan&gt; install Term::ReadKey
(...)
cpan&gt; install DBD::mysql
(...)
</pre>
<p>A continuación ya se puede ejecutar <strong>mk-duplicate-key-checker</strong> así:</p>
<pre>$ mk-duplicate-key-checker --user maite --askpass --host 172.12.1.130
</pre>
<p>Su salida sería similar a esta:</p>
<pre>DATABASE TABLE                  ENGINE OBJECT                   TYPE STRUCT   PARENT COLUMNS
site32   zzzta_9                MyISAM PRIMARY                  KEY  BTREE    NULL   `ta_id`
site32   zzzta_9                MyISAM ta_id                    KEY  BTREE    NULL   `ta_id`
site32   zzzta_9                MyISAM ta_id_2                  KEY  BTREE    NULL   `ta_id`
</pre>
<p>Para este caso veriamos no un índice duplicado, sinó <strong>triplicado</strong>. Podemos ver su <strong>create table</strong>:</p>
<pre>mysql&gt; show create table zzzta_9\G
*************************** 1. row ***************************
       Table: zzzta_9
Create Table: CREATE TABLE `zzzta_9` (
  `ta_id` int(11) unsigned NOT NULL auto_increment,
  `ta_section` varchar(100) default NULL,
  `ta_url` text,
  `ta_keywords` text,
  `ta_description` text,
  PRIMARY KEY  (`ta_id`),
  UNIQUE KEY `meta_id` (`ta_id`),
  KEY `meta_id_2` (`ta_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
</pre>
<p>Vemos como el desarrolador ha definido:</p>
<ul>
<li>Un índice para el campo ta_id mediante la keyword <strong>KEY</strong></li>
<li>A continuación una restricción <strong>UNIQUE</strong>, por lo que se crea un índice implicatamente restringuiendo la columna a valores únicos incluyendo NULL como possible valor.</li>
<li>Finalmente, define la columna como <strong>PRIMARY KEY</strong>, creando el tercer índice y restringiendo a valores únicos excluyendo NULL</li>
</ul>
<p>Este tipo de errores són más comunes de lo que parece. Además los desarrolladores acostumbran a ser reticentes a quitar estos índices, incluso si estan triplicados. Para este caso sólo con la <strong>PRIMARY KEY</strong> sería suficiente.</p>
<p>Otro caso común sería el siguiente:</p>
<pre>site53 areas                  MyISAM area_pt                  KEY  BTREE    NULL   `area_pt`
site53 areas                  MyISAM area_pt_name            KEY  BTREE    NULL   `area_pt`,`area_name`
</pre>
<p>En este caso vemos que el índice <strong>area_pt</strong> es prefijo del índice <strong>area_pt_name</strong>. <strong>MySQL</strong> puede usar cualquier prefijo possible de un índice multicolumna, por lo que el índice <strong>area_pt</strong> se puede eliminar, ya que <strong>MySQL</strong> podría usar el índice compuesto en su lugar.</p>
<p>fuente: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/systemadmin.es');" href="http://systemadmin.es/2008/12/uso-de-maatkit-para-detectar-indices-duplicados-en-mysql" target="_blank">SystemAdmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/uso-de-maatkit-para-detectar-indices-duplicados-en-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Substituir el usuario root de MySQL por otro (sysdba por ejemplo)</title>
		<link>http://www.adobe-user-group-granada.es/substituir-el-usuario-root-de-mysql-por-otro-sysdba-por-ejemplo/</link>
		<comments>http://www.adobe-user-group-granada.es/substituir-el-usuario-root-de-mysql-por-otro-sysdba-por-ejemplo/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 19:20:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[root]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=112</guid>
		<description><![CDATA[Para las bases de datos que por el tipo de acceso a estos es imprescindible tenerlos expuestos a Internet para cualquier usuario no resulta mala idea eliminar el usuario “root” para evitar ataques de diccionario.

Para ello primero de todo entramos como root y creamos el nuevo usuario, por ejemplo lo vamos a llamar sysdba:
$ mysql [...]]]></description>
			<content:encoded><![CDATA[<p>Para las bases de datos que por el tipo de acceso a estos es imprescindible tenerlos expuestos a Internet para cualquier usuario no resulta mala idea eliminar el usuario “<strong>root</strong>” para evitar <strong>ataques de diccionario</strong>.</p>
<p><!-- more --></p>
<p>Para ello primero de todo entramos como <strong>root</strong> y creamos el nuevo usuario, por ejemplo lo vamos a llamar <strong>sysdba</strong>:</p>
<pre>$ mysql -uroot -prootpass
mysql&gt; create user sysdba@localhost identified by 'passdba';
mysql&gt; grant all on *.* to sysdba@localhost with grant option;
</pre>
<p>A continuación podemos comprobar su funcionamiento con:</p>
<pre>$ mysql -usysdba -ppassdba
</pre>
<p>Finalmente podemos eliminar el usuario <strong>root</strong>:</p>
<pre>$ for i in 127.0.0.1 localhost $(hostname); do drop user root@$i | mysql -usysdba -ppassdba; done
</pre>
<p><!-- Social Bookmarking Reloaded BEGIN --></p>
<p>fuente: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/systemadmin.es');" href="http://systemadmin.es/2009/06/substituir-el-usuario-root-de-mysql-por-otro-sysdba-por-ejemplo" target="_blank">SystemAdmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/substituir-el-usuario-root-de-mysql-por-otro-sysdba-por-ejemplo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Injection no solo trata de comillas</title>
		<link>http://www.adobe-user-group-granada.es/sql-injection-no-solo-trata-de-comillas/</link>
		<comments>http://www.adobe-user-group-granada.es/sql-injection-no-solo-trata-de-comillas/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 17:42:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=104</guid>
		<description><![CDATA[En el día de hoy el colega Jordi Prats de Systemadmin.es ha publicado un post sobre este tema de tanto interes para quienes se dedican al desarrollo de aplicaciones web.
Aunque estrictamente no se trata de un tema de sistemas, no es de extrañar que alguien pregunte estos temas. Por ejemplo, ayer me encontré con un [...]]]></description>
			<content:encoded><![CDATA[<p>En el día de hoy el colega Jordi Prats de <a href="http://systemadmin.es/" target="_blank">Systemadmin.es</a> ha publicado un post sobre este tema de tanto interes para quienes se dedican al desarrollo de aplicaciones web.</p>
<p>Aunque estrictamente no se trata de un tema de sistemas, no es de extrañar que alguien pregunte estos temas. Por ejemplo, ayer me encontré con un programador que asociaba <strong>SQL Injection</strong> (un problema que tuvo en la base de datos) con las comillas: “<em>Ya escapo las comillas</em>”</p>
<p><!-- more --></p>
<p>Revisando el código (<strong>PHP</strong>) encontré que hacia una diferenciación según el tipo de datos. En el caso de añadir un <strong>string</strong> a la <strong>query</strong> el código era:</p>
<pre>$query.=" variable = '".mysql_real_escape_string($var)."'";
</pre>
<p>Mientras que si la variable era un <strong>identificador numérico</strong>:</p>
<pre>$query.=" variable = ".mysql_real_escape_string($var);
</pre>
<p>En el caso que la variable en lugar del valor numérico contenga lo siguiente:</p>
<pre>3; drop database ejemplo;
</pre>
<p>La <strong>query</strong> se construiría de la siguiente forma:</p>
<pre>select name from users where variable=3; drop database ejemplo;
</pre>
<p>En este caso sólo usando comillas también para datos numéricos tendríamos un problema menos porque la <strong>query</strong> se construiría de la siguiente forma (dando un error al ejecutarse):</p>
<pre>select name from users where variable='3; drop database ejemplo;'
</pre>
<p><strong>SQL Injection</strong> realmente es una técnica genérica referida a añadir <strong>código SQL</strong> y no “<em>usar comillas para hacer cosas malas</em>“</p>
<p>fuente: <a href="http://systemadmin.es/2010/01/sql-injection-no-solo-trata-de-comillas" target="_blank">SystemAdmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/sql-injection-no-solo-trata-de-comillas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

