Unknown table engine InnoDB

El error “Unknown table engine InnoDB” puede ser que tengamos el engine deshabilitado en el my.cnf con skip-innodb pero también puede ser que nos enfrentemos a problemas de memoria:

En el caso que en el my.cnf no tengamos el skip-innodb, deberemos comprobar el log del MySQL ya que nos podemos encontrar con:

120413 19:40:18  InnoDB: Error: cannot allocate 157302784 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 7994352 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds...
InnoDB: …
[Lea más]
Migrando un MySQL de cabina usando un master-slave

Toda migración acaba obteniendo una cierta complejidad si queremos minimizar el tiempo de corte y poder garantizar haya una “vuelta atrás” en caso de problemas. Vamos a ver una forma de migrar un MySQL master de un disco de una cabina a otro disco de otra cabina minimizando el tiempo de corte gracias a un slave que transformamos en master y volvemos a transformar en slave.

Suponiendo que tenemos un MySQL con un slave y queremos migrar de un disco en una cabina antigua a otro disco de una cabina nueva: Mientras se traspasan los datos podemos usar el slave como master y cuando acabe podemos sincronizar los dos MySQL y volver a dejar el MySQL con su rol habitual.

La hora de ruta sería la siguiente:

Previo a la intervención:

  • Apagar procesos batch …
[Lea más]
Posts publicados en MySQL High Performance

Como ya comenté anteriormente ahora mis esfuerzos de blogging se centran más en generar contenido para MySQL High Performance ? Para los que quieran un rápido listado de mis últimos posts, aquí lo tenéis:

[Lea más]
Posts publicados en MySQL High Performance

Como ya comenté anteriormente ahora mis esfuerzos de blogging se centran más en generar contenido para MySQL High Performance 😀 Para los que quieran un rápido listado de mis últimos posts, aquí lo tenéis:

[Lea más]
Ver los storage engines disponibles en MySQL

Un MySQL puede estar compilado para soportar varios STORAGE ENGINES, vamos a ver de los que disponemos y sus características:

El comando para ver el tipo de tablas que podemos usar en el MySQL es con SHOW STORAGE ENGINES o SHOW ENGINES:

mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | YES     | Clustered, fault-tolerant tables                               | YES          | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO …
[Lea más]
Migrar de MS Access a MySQL con relaciones

He usado herramientas como MySQL Migration Toolkit (*) y Bullzip’s Access To MySQL, ambos hacen un excelente trabajo pero no exporta las relaciones entre tablas. Hacer esta tarea nos puede tomar varias horas (hasta ahora):

Escribí un código VBA para identificar las relaciones generando código MySQL con las sentencias de creación, esto puede ser muy útil después de la migración usando cualquier herramienta libre.

Option Explicit
'Copiar y pegar esta función en un módulo nuevo/existente de MS Access.

Public Sub printRelations()
    Dim sql, fk As String
    Dim i, j As Integer
    For i = 0 To CurrentDb.Relations.Count - 1
        sql = "ALTER TABLE `" & CurrentDb.Relations(i).ForeignTable & _
            "` ADD CONSTRAINT `" & CurrentDb.Relations(i).Name & "` FOREIGN KEY ("
        fk = "("
        For j = 0 To CurrentDb.Relations(i).Fields.Count - 1
            sql = sql & "`" & CurrentDb.Relations(i).Fields(j).ForeignName & "` ," …
[Lea más]
Mantener varios snapshots de MySQL online

En ciertas bases de datos dónde el tiempo de recuperación de una tabla es crítico podemos mantener un conjunto de snapshots online (penalizando el rendimiento del disco) con el fin de disponer de puntos de recuperación muy cercanos al estado actual. Vamos a ver como configurarlo usando mylvmbackup

Primero lo descargamos:

cd /usr/local/src
wget http://www.lenzg.net/mylvmbackup/mylvmbackup-0.13.tar.gz
tar xzf mylvmbackup-0.13.tar.gz 

E instalamos normalmente:

cd mylvmbackup-0.13
make prefix=/usr/local/ install

A continuación deberemos indicar en el fichero de configuración (/etc/mylvmbackup.conf) los datos para acceder al MySQL:

[mysql]
user=root
password=passwdroot
host=localhost
port=3306
socket=/tmp/mysql.sock
mycnf=/etc/my.cnf

En la secciones siguientes definimos el LVM que contiene el datadir del …

[Lea más]
MySQL necesita mejorar sus mensajes de error

Acabo de modificar una base de datos, no debió demorar las dos horas que demoré en realizar la tarea si no fuera por que MySQL no ha mejorado aun sus mensajes de error.

La tarea fue agregar una nueva clave foránea a una tabla existente, veamos como reproducir lo que me ha pasado:

-- Crear las tablas foo y bar
create table foo (
        id integer not null primary key,
        bar_id int not null
);
create table bar (
        id integer not null primary key
);
-- Intentar crear una clave foránea
alter table foo
        add foreign key(bar_id) references bar(ANY_FIELD) ;

Al ejecutar la ultima sentencia MySQL devuelve un error genérico que puede significar muchas cosas:

Error Code: 1005. Can't create table 'temp.#sql-4bd7_11' (errno: 150)

Todo hubiera sido mas fácil si me hubiera dado cuenta que escribí mal el campo de la tabla de deferencia bar(ANY_FIELD) (algunas veces pasa), si …

[Lea más]
Que hay en MySQL Enterprise?

Muchos nos hemos hecho esa pregunta, Pedro Andrade y Manuel Contreras de Oracle nos aclaran el asunto, aqui los livestreams grabados del ultimo evento Joomla en Guatemala.

Watch live streaming video from desdeguate at livestream.com

Watch live streaming video from desdeguate at livestream.com

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]