Jul 30

En un servidor con suficiente tráfico y muchas consultas de base de datos, en ocasiones hay que incrementar el valor por defecto del my.cnf del parametreo max_connections a un valor más adecuado, por ejemplo 1024

max_connections = 100
a
max_connections = 1024

Ya que sinó, la base de datos puede ser insuficiente. Justamente hoy me he dado cuenta de que el servidor se ha vuelto a saturar y mirando los logs, me he dado cuenta de que cada vez que reiniciaba MySQL, él “ajustaba” automáticamete esos valores de max_connections a otro inferior, en este caso a 886, así que existia una limitación del sistema operativo que forzaba el reajuste.


090616 13:49:22 mysqld started
090616 13:49:22 [Warning] Changed limits: max_open_files: 1024 max_connections: 886 table_cache: 64

La solución es bien sencilla, simplemente hay que añadir una linea similar arriba de todo del script o ponerlo en el bash_profile/bashrc, o si quieres hacerlo más elegante, deberiamos de mirar de configurar correctamente el fichero limits.conf (yo he optado por ponerlo encima del script)

ulimit -n valor (por defecto es 1024)
ulimit -n 2048

Realizamos un ulimit -n para ver que realmente se ha cambiado el valor, y volvemos a reiniciar MySQL con nuestro problema resuelto!

Jul 8

A veces ocurre… que el servidor maestro se nos ha corrompido o por X motivos, ya no se puede utilizar, y la única opción que nos queda es enviar el curriculum a otra empresa, o bien si hicimos los deberes correctamente, deberíamos de tener un slave dónde hay una réplica más o menos reciente de los datos del antiguo maestro, apartir de ahí, estamos de suerte, ya que en algún caso en concreto, nos interesará poder convertir esa base de datos esclava en maestra para que nuestras aplicaciones la puedan utilizar y volver a crear slaves apartir de esta.

Para convertir un slave a master en MySQL, solo tendremos que realizar estos sencillos pasos.

(Todos los pasos los realizamos en nuestro slave)

  • mysql> STOP slave;
  • mysql> RESET slave;
  • Borramos en el fichero my.cf toda la configuración que teniamos de nuestro slave y añadimos log-bin para que actue como maestro
  • Reiniciamos MySQL
  • Indicamos a nuestras aplicaciones la nueva ubicación del nuevo maestro, y apartir de ahora, ya se podrían crear esclavos apartir de este nuevo maestro
  • Birra en el bar más cercano ;)

¿No es curioso que un esclavo pueda convirtirse en maestro también?, SPARTACO!!

Jun 17

Interesante vídeo sobre 10 cosas o trucos sobre MySQL que, en caso de que no seas un gurú, puede que te resulten útiles.

Vía | http://yvoictra.wordpress.com

Ene 7

PDO es una librería de acceso a bases de datos para PHP.
La necesidad de una librería como PDO nace de la gran cantidad de bases de datos soportadas por PHP. Cada una de estas bases de datos necesita de su propia API para hacer tareas generalmente comunes al resto. Esto provoca que nuestro código no sea fácil portar de una base de datos a otra y ayuda (con la colaboración de muchas otras cosas) a complicarnos la vida.

Para solucionar este problema en PHP existen múltiples librerías ofrecidas por terceros. ADODB, PEAR DB y MDB2 son algunas de las más populares.

Aunque la mayoría de estas librerías son mucho mas maduras que PDO y en algunos aspectos ofrecen muchas más funcionalidades, PDO tiene ciertas ventajas que no podemos obviar.

Para empezar: la velocidad. PDO esta compilado en C/C++, por los que ofrece mayor rapidez de ejecución que sus competidoras (de código interpretado). Por otra parte: viene incorporado en PHP5 (es la solución “oficial” y en continua evolución) y desde PHP 5.1 viene “enabled” por defecto. De esta manera no tienes que importar ni cargar código de terceros cuando quieres usarlo.

No hay que olvidar que PDO está completamente orientado a objetos, lo que facilita su uso frente al engorro de las decenas de diferentes funciones de las API de cada sistema de bases de datos.

PDO actualmente soporta: Microsoft SQL Server, Firebird, IBM Informix, MySQL, Oracle, ODBC, PostgreSQL, SQLite.

Conexión a la base de datos

Una buena manera de ver la idea que hay detrás de una librería como PDO es mostrar por un lado como se realiza una conexión con la API de MySQL y PostgreSQL y por otro lado la versión con PDO.

MySQL:

$conexion = mysql_connect($host, $usuario, $password);
mysql_select_db($db, $conexion); 

PostgreSQL:

$conexion =pg_connect(“host=$host dbname=$db user=$usuario password=$password”);

Como podemos ver, a pesar de usar dos funciones diferentes para realizar la conexión, la forma de hacerlo es prácticamente la misma.

Ahora, con PDO.

Para MySQL:

$conexion = new PDO(“mysql:host=$host; dbname=$db”, $usuario, $password);

Para PostgreSQL:

$conexion = new PDO(“pgsql:host=$host; dbname=$db”, $usuario, $password);

Solo el nombre del driver de la base de datos que usemos cambia.

Ahora, a modo de ejemplo, veamos como se haría una simple consulta SELECT con PDO.

$conexion = new PDO(“mysql:host=$host; dbname=$db”, $usuario, $password);
//queda claro que las variables necesarias para el DSN están convenientemente informadas.
//$host=localhost, $db = basedatos, …


$sql = “SELECT * FROM tabla ORDER by id”;
$query = $conexion->query($sql);
while( $row = $query->fetch(PDO::FETCH_ASSOC) )
{
print_r($row);
}

Espero profundizar mas en diferentes aspectos de PDO como excepciones, sentencias preparadas y manipulación de rowsets entre otros en los próximos post.

¡Hasta pronto!