Gentoo Logo

Guía de actualización a MySQL 4.* o 5.0.*

Contenido:

1.  Actualización convencional, indicada para migrar desde la 4.1 a la 5.0

En la versión 4.1 el motor de almacenamiento MyISAM era ya suficientemente maduro para permitir una actualización total a la principal versión de MySQL.

Nota: Esto no es cierto para tablas MERGE. Probablemente se tope con problemas si intenta una actualización directa para este (raramente utilizado) tipo de tabla. Debería volcar y recrear estas tablas y restaurar sus contenidos en el proceso de actualización. Si no está seguro, debería empezar por la sección Actualizar desde versiones antiguas de MySQL.

Para llevar a cabo este paso, se requiere de dos líneas de comando ya que los bloqueos pertenecen a la sesión de mysql.

Listado de Código 1.1: Actualización convencional desde la 4.1 a la 5.0.*

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password='su_contraseña'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
     --execute='SHOW variables LIKE "datadir";' \
     | sed -e 's|datadir[ \t]||')

(El próximo paso debería llevarse a cabo en la segunda línea de comandos)
# mysql --user=root --password='su_contraseña'
mysql> FLUSH TABLES WITH READ LOCK;

(Regrese a la primera línea de comandos para ejecutar el siguiente comando)
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
     /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"

(Los siguientes comandos deberían realizarse en la segunda línea de comandos)
mysql> UNLOCK TABLES;
mysql> quit

(Regrese a la primera línea de comandos para el resto de la actualización)
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password='su_contraseña' \
     --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL

2.  Actualizar desde versiones antiguas de MySQL

Los usuarios que actualicen desde una versión anterior (<4.0.24) de MySQL tendrán, primero, que instalar MySQL 4.0.25. Si ya está utilizando una versión más reciente, puede saltarse esta sección y continuar con la siguiente.

Listado de Código 2.1: Actualización simple

# emerge -av --buildpkg "<mysql-4.1"

3.  Hacer una copia de seguridad de sus datos actuales

Importante: Los valores contenidos en las claves primarias son manejados de distinta forma en varias versiones de MySQL; eche un vistazo al bug #108502 para obtener más información. Es muy recomendable que examine sus tablas en busca de valores "0" (cero) o menores y actualizarlos con un valor mayor o igual a "1".

Una de las tareas más importantes que todo administrador de bases de datos tiene que llevar a cabo es la de respaldar los datos. Allá vamos:

Listado de Código 3.1: Volcado de todas las bases de datos

# mysqldump \
  -uroot \
  --password=su_contraseña \
  -hlocalhost \
  --all-databases \
  --opt \
  --allow-keywords \
  --flush-logs \
  --hex-blob \
  --master-data \
  --max_allowed_packet=16M \
  --quote-names \
  --result-file=BACKUP_MYSQL_4.0.SQL

Ahora debería tener un fichero llamado BACKUP_MYSQL_4.0.SQL con el que, más tarde, poder usar para regenerar sus datos. Los datos estarán descritos en el dialecto MySQL del lenguaje SQL (Structured Query Language).

También es ahora un buen momento para comprobar si la copia de seguridad que ha creado funciona.

4.  Actualizar desde versiones recientes de MySQL

Si se ha saltado el primer paso, ahora tiene que crear un paquete de respaldo (del servidor de bases de datos, no de los datos) de la actual versión instalada.

Listado de Código 4.1: Paquete de respaldo binario

# quickpkg dev-db/mysql

Ahora es el momento de eliminar la actual versión y todos sus datos:

Listado de Código 4.2: Desinstalar MySQL

# /etc/init.d/mysql stop
# emerge -C mysql
# tar cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 /etc/mysql/my.cnf /var/lib/mysql/
# ls -l ~/mysql.*
# rm -rf /var/lib/mysql/ /var/log/mysql

Nota: Deberían haber ahora dos copias de seguridad: un fichero SQL, portable entre varias versiones de MySQL, y otro que le permitirá restaurar rápidamente su servidor de base de datos. Esto posteriormente se cubrirá con mayor detalle en este documento.

Una vez se haya librado de su antigua instalación de MySQL, puede instalar la nueva versión. Tenga en cuenta que se necesita revdep-rebuild para reconstruir las dependencias de MySQL.

Listado de Código 4.3: Actualizar los binarios

# emerge -av ">mysql-4.1"
(Actualice sus ficheros de configuración, también puede usar
dispatch-conf)
# etc-update
# revdep-rebuild

Ahora configure la reciente versión instalada de MySQL y reinicie el demonio:

Listado de Código 4.4: Configurar MySQL 4.1

# emerge --config =mysql-4.1.<micro_version>
# /etc/init.d/mysql start

Por último, puede importar la copia de seguridad que creó en el paso #2.

Importante: El fichero /etc/mysql/my.cnf original activa el log binario (log-bin) por defecto. Esto registrará cada una de las transacciones que modifiquen datos. Si se ejecuta en una gran base de datos (1GB o más) podría generar ficheros extremadamente grandes consumiendo muy rápidamente el espacio libre del disco. Si tiene poco espacio, puede ser buena idea deshabilitar el log binario.

Importante: En MySQL 4.1 y posteriores, el conjunto de caracteres predeterminado es utf8. Si los datos contienen caracteres no-ASCII, puede que quiera preservar el conjunto de caracteres por defecto de la base de datos, reemplazando todas las ocurrencias de utf8 por latin1 en el fichero de configuración /etc/mysql/my.cnf. Puede encontrar más información en el capítulo de Cambio del conjunto de caracteres.

Importante: La base de datos mysql administrativa que contiene nombres de usuario, contraseñas, entre otras cosas, está y debe estar codificada en utf8.

Las versiones más antiguas de mysqldump puede que exporten tablas en el orden equivocado cuando hayan claves foráneas de por medio. Para solucionar este problema, rodee el SQL con las siguientes declaraciones:

Listado de Código 4.5: Corregir la comprobación de claves foráneas

SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=1

A continuación, importe la copia de seguridad.

Listado de Código 4.6: Importar la copia de seguridad de los datos SQL

# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password=su_contraseña \
     -hlocalhost \
     --max_allowed_packet=16M

# mysql_fix_privilege_tables \
     --defaults-file=/etc/mysql/my.cnf \
     --user=root \
     --password=su_contraseña

Si ahora reinicia su demonio de MySQL y todo va como se espera, ya tiene pues una completa instalación funcional de la versión 4.1.x.

Listado de Código 4.7: Reiniciar el demonio de MySQL

# /etc/init.d/mysql restart

Si se topa con algún problema durante el proceso de instalación, por favor, informe del mismo en Bugzilla.

5.  Recuperar la antigua instalación de MySQL 4.0

Si no está a gusto con MySQL 4.1, es posible volver a la versión 4.0.

Listado de Código 5.1: Volver a la anterior versión

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(Cambie <timestamp> por la utilizada cuando creó la copia de
seguridad.)
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start

Importante: Si los paquetes, a excepción de dev-db/mysql, se han instalado siguiendo esta guía, necesitará ejecutar revdep-rebuild para asegurarse de que cada cliente está utilizando el objeto compartido mysqlclient adecuado.

6.  Conversión del conjunto de caracteres:

Introducción

Este capítulo no pretende ser una guía exhaustiva de cómo realizar este tipo de conversiones, es más bien una pequeña lista de algunas que el lector puede llevar a cabo.

Cambiar el juego de caracteres a una base de datos puede ser una tarea complicada, siendo la dificultad mayor en función de la variedad de los datos. Cosas como los objetos serializados y binarios (blobs) son un ejemplo en donde es difícil mantener las piezas unidas.

Índices

Cada carácter UTF-8 supone 3 bytes de tamaño en un índice. Los índices en MySQL pueden ser de hasta 1000 bytes (767 bytes para tablas InnoDB). Tenga en cuenta que los límites están medidos en bytes mientras que la longitud de una columna es interpretada como número de caracteres.

MySQL también puede crear índices de partes de una columna, esto puede ser de cierta ayuda. A continuación tiene algunos ejemplos:

Listado de Código 6.1: Indexar utilizando prefijos

$ mysql -uroot -p'your_password' test

mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
    Value: 5.0.24-log
1 row in set (0.00 sec)

mysql> CREATE TABLE t1 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1 , c2 );
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1(165) , c2(165) );
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t2 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2
  ->   ADD INDEX idx1 ( c1(250) , c2(250) );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t3
  ->   ADD INDEX idx1 ( c1 , c2 );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

Entorno

El sistema debe estar configurado para soportar las locales UTF-8. Encontrará más información en nuestros siguientes documentos: Usando UTF-8 con Gentoo y Configurando localización en Gentoo Linux

En el siguiente ejemplo, fijaremos algunas variables de entorno en /etc/env.d/02locale para poder hacer uso de las locales UTF-8 en castellano:

Listado de Código 6.2: /etc/env.d/02locale

LC_ALL=es_ES.UTF-8
LANG=es_ES.UTF-8

Ejecute justo después env-update && source /etc/profile

iconv

iconv, proporcionado por sys-libs/glibc, se utiliza para convertir ficheros de texto desde un conjunto de caracteres a otro. También se puede utilizar el paquete app-text/recode.

Listado de Código 6.3: Usando iconv

(De latin1 a utf8)
$ iconv -f ISO-8859-15 -t UTF-8 fichero1.sql > fichero2.sql

(De japonés a utf8)
$ iconv -f ISO2022JP -t UTF-8 fichero1.sql > fichero2.sql

iconv se puede utilizar para recodificar un volcado sql incluso si el entorno no está configurado en UTF-8.

SQL Mangling

Es posible emplear las funciones de MySQL CONVERT() y CAST() para convertir datos en sus guiones SQL.

Apache (webserver)

Para emplear UTF-8 con Apache, necesita ajustar las siguientes variables en el httpd.conf: AddDefaultCharset, CharsetDefault, CharsetSourceEnc. Si sus ficheros HTML no están codificados en UTF-8, deben ser convertidos con iconv o recode.



Imprimir

Página actualizada 4 de junio, 2007

Sumario: El equipo de MySQL se enorgullece en anunciar que MySQL 5.0 estará pronto en el árbol estable de Gentoo. Este documento describe cómo actualizar a MySQL 4.* y a 5.0.*.

Michael Kohl
Autor

Francesco Riosa
Autor

Enrique Barbeito García
Traductor

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.