BDB

BDB (Berkeley DB)
Información sobre la plantilla
BekerleyDB.jpeg
Motor de almacenamiento de MySQL.
Sistemas Operativos compatiblesLinux, Sun Solaris, Windows, SCO UnixWare, SCO OpenServer, IBM AIX, FreeBSD
LicenciaGNU
Sitio web
Berkely DB

BDB (Berkeley DB). Motor de almacenamiento que fue desarrollado originalmente en la UC Berkeley. Ahora es mantenido por Sleepycat Software Inc., que es una empresa de Oracle actualmente. BDB es transacción segura, y se ha utilizado en los productos de muchas compañías, como Cisco Systems.

Características

BDB no es el motor de almacenamiento por defecto. Debe especificarse "ENGINE = BDB" al final de la "CREATE TABLE”, declaración para crear nuevas tablas con el motor de almacenamiento BDB.

Las tablas BDB pueden tener una gran probabilidad de sobrevivir a fallos del sistema y ser capaces de realizar COMMIT y ROLLBACK en transacciones. La distibución fuente MySQL incluye una distribución BDB preparada para funcionar con MySQL, no puede usar una versión de BDB no preparada para funcionar con el mismo.

Sistemas operativos soportados

  • Sun Solaris (SPARC y x86)
  • IBM AIX 4.3.x
  • SCO OpenServer
  • SCO UnixWare 7.1.x

Sistemas operativos no soportados

  • Linux 2.x Alpha
  • Linux 2.x AMD64
  • Linux 2.x IA-64
  • Linux 2.x s390

Opciones de arranque

Las siguientes opciones de MYSQLD pueden usarse para cambiar el comportamiento del motor de almacenamiento BDB:

  • --bdb-home=path: Directorio base para tablas BDB . Debe ser el mismo directorio para usar --datadir.
  • bdb-lock-detect=method: El método de bloqueo BDB . El valor debe ser DEFAULT, OLDEST, RANDOM, o YOUNGEST.
  • --bdb-logdir=path: El directorio del fichero de log BDB.
  • --bdb-no-recover: No arranca Berkeley DB en modo recuperación.
  • --bdb-no-sync : No vuelca síncronamente los logs BDB . Esta opción está obsoleta; puede usarse --skip-sync-bdb-logs en su lugar.
  • --bdb-shared-data : Arranca Berkeley DB en modo multi proceso. (No usar DB_PRIVATE al inicializar Berkeley DB)
  • --bdb-tmpdir=path : El directorio de ficheros temporales de BDB.
  • --skip-bdb : Desactiva el motor de almacenamiento BDB.
  • --sync-bdb-logs: Vuelca síncronamente los logs BDB. Esta opción está activada por defecto ; usar --skip-sync-bdb-logs para desactivarla.

Características de las tablas

Cada tabla BDB se almacena en disco en dos ficheros. Los ficheros tienen nombres que comienzan con el nombre de la tabla y tienen una extensión para indicar el tipo de fichero. Un fichero .frm almacena la definición de tabla, y un fichero .db contiene los datos de tabla e índices.

Para especificar explícitamente que quiere una tabla BDB, se debe indicar con la opición de tabla ENGINE o TYPE:

  • CREATE TABLE t (i INT) ENGINE = BDB;
  • CREATE TABLE t (i INT) TYPE = BDB;

BerkeleyDB es sinónimo de BDB en la opción ENGINE o TYPE .

El motor de almacenamiento BDB proporciona tablas transaccionales. La forma para usar estas tablas depende del modo autocommit:

  • Si está el autocommit activado (por defecto), los cambios en las tablas BDB se efectúan inmediatamente y no pueden deshacerse.
  • Si está el autocommit desactivado, los cambios no son permanentes hasta que se ejecute un comando COMMIT . En lugar de hacer un commit se puede ejecutar ROLLBACK para olvidar los cambios.
  • Se puede comenzar una transacción con el comando BEGIN WORK para suspender autocommit, o con SET AUTOCOMMIT=0 para desactivar autocommit explícitamente.

Características de BDB

El motor de almacenamiento BDB tiene las siguientes características:

  • En MySQL 5.0, las tablas BDB pueden tener hasta 31 índices por tabla, 16 columnas por índice, y un máximo de tamaño de clave de 1024 bytes.
  • MySQL necesita una PRIMARY KEY en cada tabla BDB para que cada registro pueda identificarse unívocamente. Si no se crea una explícitamente, MySQL la crea y mantiene una PRIMARY KEY oculta. La clave oculta tiene una longitud de 5 bytes y se incrementa para cada intento de inserción. Esta clave no aparece en la salida de SHOW CREATE TABLE o DESCRIBE.
  • La PRIMARY KEY es más rápida que cualquier otro índice, ya que la PRIMARY KEY se almacena junto con los datos. Los otros índices se almacenan como los datos claves + la PRIMARY KEY, por lo que es importante que se mantenga la PRIMARY KEY tan pequeña como sea posible para ahorrar espacio en disco y tener más velocidad.
  • Este comportamiento es similar al de InnoDB, donde las claves primarias pequeñas ahorran espacio no sólo en el índice primario sino también en índices secundarios.
  • Si todas las columnas a las que accede en una tabla BDB son parte del mismo índice o parte de la clave primaria, MySQL puede ejcutar la consulta sin tener que acceder al registro. En una tabla MyISAM , esto sólo puede hacerse si las columnas son parte del mismo índice.
  • El escaneo secuencial es más lento que para tablas MyISAM ya que los datos en tablas BDB se almacena en B-trees y no en un fichero de datos separado.
  • Los valores clave no tienen compresión de prefijo ni sufijo como los valores clave en tablas MyISAM por lo que la información clave ocupa más espacio en tablas BDB en comparación con MyISAM .
  • A menudo hay huecos en la tabla BDB que le permiten insertar nuevos registros en medio del árbol índice. Esto hace que las tablas BDB sean algo más grandes que las MyISAM.
  • SELECT COUNT(*) FROM tbl_name es lento para tablas BDB , ya que no se mantiene conteo de registros en la tabla.
  • El optimizador necesita saber el número aproximado de registros en la tabla. MySQL resuelve esto contando inserciones y manteniendo esto en un segmento separado en cada tabla BDB . Si no realiza muchos comandos DELETE o ROLLBACK , este número debe ser lo bastante adecuado para el optimizador MySQL . Sin embargo, MySQL almacena el número sólo al cerrar, así que puede ser incorrecto si el servidor termina inesperadamente. Puede que no sea fatal incluso si este número no es 100% correcto.
  • Bloqueo interno en tablas BDB se realiza a nivel de páginas.
  • LOCK TABLES funciona en tablas BDB como con otras tablas. Si no se usa LOCK TABLES, MySQL realiza un bloqueo interno de múltiple escritura en la tabla (un bloqueo que no bloquea otros escritores) para asegurar que la tabla está bloqueada apropiadamente si otro flujo realiza un bloqueo de tabla.
  • Para poder deshacer transacciones, el motor de almacenamiento BDB mantiene ficheros de log. Para máximo rendimiento se puede usar la opción --bdb-logdir para guardar los logs BDB en un disco distinto al que tiene las bases de datos.
  • MySQL realiza un checkpoint cada vez que se comienza un nuevo fichero log BDB , y borra cualquier fichero de log BDB no necesario para transacciones actuales. Se puede usar FLUSH LOGS en cualquier momento para hacer un checkpoint de tablas Berkeley DB.
  • Para recuperación de desastres, debe usar copias de seguridad de tablas más el log binario de MySQL.

Limitaciones en las tablas BDB

La siguiente lista muestra restricciones a tener en cuenta al usar tablas BDB:

  • Cada tabla BDB almacena en el fichero .db la ruta al fichero como si se hubiera creado. Esto se hizo para ser capaz de detectar bloqueos en un entorno multi usuario que soporte enlaces simbólicos. Como consecuencia, no es posible mover ficheros de tablas BDB de un directorio de base de datos a otro.
  • Al hacer copias de seguridad de tablas BDB, se debe usar mysqldump o hacer una copia de seguridad que incluya los ficheros para cada tabla BDB (los ficheros .frm y .db ) así como los ficheros de log BDB . El motor de almacenamiento BDB almacena transacciones no acabadas en su log y las necesita cuando arranca mysqld . Los logs BDB son los ficheros en el directorio de datos con nombres de la forma log.XXXXXXXXXX (10 dígitos).
  • Si una columna que permite valores NULL tiene un índice único, sólo se permite un valor NULL. Esto difiere de otros motores de almacenamiento.

Fuente