Guía de actualización a MySQL 4.* o 5.0.*
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="
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
--execute='SHOW variables LIKE "datadir";' \
| sed -e 's|datadir[ \t]||')
# mysql --user=root --password=
mysql> FLUSH TABLES WITH READ LOCK;
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
/etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"
mysql> UNLOCK TABLES;
mysql> quit
# 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= \
--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= \
-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"
# 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.
# /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= \
-hlocalhost \
--max_allowed_packet=16M
# mysql_fix_privilege_tables \
--defaults-file=/etc/mysql/my.cnf \
--user=root \
--password=
|
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"
# 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'' test
mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
Value:
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 );
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 |
$ iconv -f ISO-8859-15 -t UTF-8 fichero1.sql > fichero2.sql
$ 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.
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|