Displaying posts with tag: MySQL (reset)
Valores auto_increment personalizados

En el Perú los formatos numéricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo:

001-000034
001-000035
001-000036
...

Para manejar esto en MySQL he preparado una solución basada en otro articulo mio:

  1. Crear la tabla para guardar los números actuales:
    create table _sequence
    (
        seq_name varchar(50) not null primary key,
        seq_group varchar(10) not null,
        seq_val int unsigned not null
    );
  2. Crear una función para obtener el valor siguiente e incrementarlo:
    delimiter //
    drop function if exists getNextCustomSeq//
    create function getNextCustomSeq
    (
        sSeqName varchar(50),
        sSeqGroup varchar(10)
    ) returns varchar(20)
    begin
        declare nLast_val int; 
    
        set nLast_val =  (select seq_val …
[Lea más]
Snapshots y procesos en MySQL

Al ver que un site se queda frito durante un minuto pero cuando entramos ya no queda ningún thread en el MySQL debemos investigar los logs.

Si no existen errores en el log del daemon, para investigar el site bloqueado podemos ver que hay en el log de slow queries. Suponiendo el siguiente:

(...)
# Time: 120228 21:00:04
# User@Host: systemadmin[systemadmin] @ localhost []
# Query_time: 1.459100  Lock_time: 0.000034 Rows_sent: 0  Rows_examined: 0
SET timestamp=1330441204;
REPLACE INTO `sesiones` VALUES('ffff21568da68d024dead5b49b680000', '1234', '');
# User@Host: systemadmin[systemadmin] @ localhost []
# Query_time: 1.385580  Lock_time: 0.000032 Rows_sent: 0  Rows_examined: 0
SET timestamp=1330441204;
REPLACE INTO `sesiones` VALUES('fffffb70a60660f3d7deade5ca8d0000', '4321', '');
# Time: 120228 21:00:59
# User@Host: systemadmin[systemadmin] @ localhost []
# Query_time: …
[Lea más]
Replicación MySQL y la clausula LIMIT

Tal y como podemos encontrar en el manual del MySQL, el uso de LIMIT en queries que modifican tablas es inseguro en modo STATEMENT (por defecto). Si lo hacemos nos encontraremos en el log mensajes similares a:

120123 19:06:01 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: DELETE FROM casas
                WHERE DATEDIFF(NOW(), casa_date) > 31 limit 1000

Esto se debe a que aunque existan los mismos registros:

master> select * from fib;
+------+-------+
| id   | valor |
+------+-------+
|    6 |     8 |
|    7 |    13 |
|    8 |    21 |
|    9 |    34 |
+------+-------+
4 rows in set …
[Lea más]
Certificación PHP en Zaragoza

Warp se encargará de impartir los cursos de PHP y MySQL que dan acceso a la certificación Zend PHP 5.3 a partir del 31 de enero de 2012, en el Centro de Tecnologías Avanzadas de Zaragoza. El curso está dirigido a aquellas personas que quieran aprender a programar portales web con dos de las herramientas más [...]

SHOW OPEN TABLES de MySQL

Mediante SHOW OPEN TABLES podemos ver las tablas que están actualmente abiertas en la table cache y si esta en uso o si tiene threads a la espera a que otro libere el bloqueo.

Si ejecutamos simplemente SHOW OPEN TABLES veremos por todas las bases de datos las tablas que están abiertas y si están en uso mediante la columna In_use:

mysql> show open tables;
+-------------+--------------------------------------------------------+--------+-------------+
| Database    | Table                                                  | In_use | Name_locked |
+-------------+--------------------------------------------------------+--------+-------------+
| xxxxxx_utf8 | tmp_systemadmin.es                                     |      0 |           0 |
(...)

La columna Name_locked se usa para ciertas operaciones como los DROPs. Para ver las …

[Lea más]
Instalación de MySQL Cluster (ndb)

Vamos a ver como instalar MySQL Cluster y sus características. No se trata de una solución de alta disponibilidad para el típico MySQL (con tablas MyISAM o InnoDB) sino que se trata de un storage engine transaccional con sus propias características: ndb

El MySQL Cluster ndb ofrece una base de datos sin nada compartido con tres tipos de nodos diferenciados:

  • Nodo de gestión (ndb_mgmd): Permite la gestión del resto de nodos del cluster, arrancar y apagar nodos o hacer backups. Aunque se deba arrancar el primero puede fallar sin afectar al funcionamiento del cluster.
  • Nodo de datos (ndbd o ndbmtd): Almacena los datos los trata
  • Nodo SQL: Nodo a través del cual …
[Lea más]
Cuidado con los snapshots en MySQL

He visto algunas formas de hacer snapshots de MySQL que no deben hacerse así. Vamos a ver un ejemplo.

Me han pasado scripts como el siguiente:

/usr/sbin/xfs_freeze -f /var/mysql
/usr/bin/ec2-create-snapshot -K $KEY -C $CERT vol-1111ff11 --description "SnapMysql"
/usr/sbin/xfs_freeze -u /var/mysql

En este caso se hace un snapshot de un EBS habiendo congelado previamente el sistema de ficheros, en este caso xfs. Si bien el snapshot tendrá los datos consistentes del sistema de ficheros, los datos que tenga el MySQL en memoria se perderán. Para hacer backups mediante snapshots de MySQL con XFS lo podemos hacer mediante mylvmbackup.

En el caso que sea xfs deberemos indicar que es dicho sistema de ficheros mediante xfs=1: …

[Lea más]
Fichero con el estado de InnoDB

Mediante SHOW INNODB STATUS podemos obtener ver los contadores de InnoDB, valores varios, estadísticas y las transacciones. Algunos de dichos valores nos puede interesar guardar un histórico para hacer un gráfico o ver su evolución. Mediante la opción innodb-status-file podemos simplificar el script de optención de datos.

Mediante la opción –innodb-status-file indicamos al MySQL que escriba en el datadir el estado de InnoDB. El fichero en cuestión se llamará innodb_status.<PID%gt; por lo que el script deberá buscar primero el PID del mysqld para poder encontrar el fichero.

De esta forma nos ahorramos tener que acceder al MySQL para hacer un SHOW INNODB STATUS y varios …

[Lea más]
Último certificado del año, MySQL 5.0 Developer

Justo cuando llegaba el final del año conseguí mi objetivo, el certificado MySQL 5.0 Developer. Ya tengo el pack completo ? La verdad es que este me ha parecido ligeramente más complicado que los anteriores, más que nada por mi poca experiencia con el lenguaje SQL. Pero para eso es están las certificaciones, para aprender.

Ahora toca centrarse en aplicar lo aprendido y seguir mejorando poco a poco. Tengo muchos libros para leer en mi Kindle pero poco tiempo. He empezado por "MySQL High Availability" que a pesar de ser un poco pesado de leer en algunas partes y que son muy pesados con su librería de Python, es un buen libro para ampliar los conocimientos en replicación y alta disponibilidad.

Fuera de la lectura técnica, ¿tenéis alguna recomendación para leer en este 2012? A mi me ha picado la curiosidad Metro 2033.

Lock wait timeout exceeded; Try restarting transaction

Al ejecutar una query en un MySQL contra una tabla con el engine InnoDB nos podemos encontrar con el error:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

La variable innodb_lock_wait_timeout permite definir el tiempo va a esperar una query a obterner un lock, por lo que podemos minimizar este error aumentando este timeout a costa de asumir que las queries pueden tener esta tiempo el thread bloqueado a la espera. Dependiendo del entorno quizá nos interesa incluso bajarlo para evitar que las queries se queden esperando (por ejemplo en entorno web). Vamos a ver como investigar este problema viendo las transacciones implicadas en un problema de este tipo.

Primero vamos a ver como ver las transacciones de InnoDB. Para ello primero vamos a desactivar el …

[Lea más]