viernes, 24 de julio de 2015

Migrar MySQL 5.1 a 5.5

Cuando vamos a migrar MySQL a otra versión tenemos que tomar en cuenta los cambios de sintaxis, variables que son descontinuadas y configuraciones que cambian.

Algunos puntos importantes al migrar de MySQL 5.1 a 5.5 son los siguientes:

= [v5.5.32] En las tablas de sistema, los campos "url" se crean tipo Text, pero en la migración no se cambian, se tiene que hacer a pie:

ALTER TABLE mysql.help_category MODIFY url TEXT NOT NULL;
ALTER TABLE mysql.help_topic MODIFY url TEXT NOT NULL;


= [v5.5.3] No se permite "FLUSH TABLES", cuando existe un bloqueo de tabla activo. Para esto se tiene que ejecutar:

FLUSH TABLES tbl_list WITH READ LOCK

Esto permite que se pueda hacer flush a la tabla y bloquearse al mismo tiempo. Por lo tanto aplicaciones que usen esto:

LOCK TABLES tbl_list READ;
FLUSH TABLES tbl_list;

fallaran.

= [v5.5.7] Nueva tabla proxies_priv, marcara error de que no existe,

"Table 'mysql.proxies_priv' doesn't exist"

cuando se inicie mysql se le tendrá que usar "--skip-grant-tables" y después se correrá mysql_upgrade. ejemplo:

shell> mysqld --skip-grant-tables &
shell> mysql_upgrade

Tendremos que detener y reiniciar el servicio mysql.

Si requerieramos de opciones adicionales, como seleccionar el archivo de configuración personalizado o por default:

shell> mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
         --skip-grant-tables &
shell> mysql_upgrade

Tener cuidado por que con el parámetro "--skip-grant-tables" cualquiera podrá entrar al servidor, para seguridad adicional
agregar "--skip-networking" para que usuarios remotos se conecten.

= [v5.5.7] No se permite mas "TRUNCATE TABLE", devolverá error, se tiene que cambiar a DELETE FROM, la técnica de borrado
es un DROP Y CREATE.

= [v5.5.6] Por problemas en la replicación, cuando se guarda en el binario para ser replicado, cuando se hace uso de la sentencia
CREATE TABLE IF NOT EXISTS ... SELECT, cuando la tabla que se va a crear si existe manda un mensaje de error y en el servidor
"master" si se insertan los registros pero en el servidor "slave" no. Es decir:
- Si la tabla no existe, se guarda en el  log tal cual.
- Si la tabla existe,

= [v5.5.6] Si truena cuando inicia el full-text stopword, se debe reparar la tabla:
REPAIR TABLE tbl_name QUICK;

= [v5.5.5] Existe la manera de activar que nos envie un error (ER_DATA_OUT_OF_RANGE), cuando se quiera insertar un valor fuera de rango,
o que en su defecto le ponga el valor máximo de dicho numero. Variable global @@sql_mode , valores numéricos.

= Revisar los campos timestamp ya no permiten el campo "n" timestamp(n).
- Para corregirlo, en el archivo dump, se debe quitar el parametro (n)
- Antes de respaldar la base de datos, alterar dichas columnas.

= El parámetro "--languages" se remplazo por las variables del sistema: "lc_messages_dir" y "lc_messages".

= Las tablas particionadas se deben de alterar

Actualizar primero los espejos:

Detenemos la replicación en todos los espejos y los actualizamos. Los reiniciamos con la opción "--skip-slave-start", para que no se conecten al servidor maestro.

De esta manera se podra reparar cualquier tabla con los comandos:
REPAIR TABLE or ALTER TABLE
Desahabilitar el log binario en el maestro.

 SET sql_log_bin = 0
 También se puede hacer reiniciado el master, y configurando la opción de "--log-bin", en el my.cnf, aprovechando esto, pudieras desahabilitar la conexión de los clientes TCP/IP,  con la opción "--skip-networking".

De esta manera no se replicaran las optimizaciones o reparaciones que se hagan en los objetos de la base de datos y no se replicarían.

Finalmente regresaremos las configuraciones a su estado original, para comenzar a ponerlo nuevamente a replicarse.

Si usamos anteriormente  set sql_log_bin a 0, se ejecuta SET sql_log_bin = 1.

Si usamos el otro método solo reiniciamos el esclavo, sin la opción "--skip-slave-start".


service mysqld stop
wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
rpm --force -Uvh mysql-community-release-el6-5.noarch.rpm
rm mysql-community-release-el6-5.noarch.rpm

yum install --disablerepo=* --enablerepo=mysql55-community mysql-community-server
chkconfig mysqld on
service mysqld start
mysql_upgrade




lunes, 20 de julio de 2015

Actualizar versión MySQL

Para actualizar la versión de MySQL


1. Habilitar el repositorio donde se encuentra la versión de MySQL
yum --enablerepo=remi,remi-test install mysql mysql-server
2. Si tenemos un monitoreo, hay que deshabilitarlo (como lo es Nagios).

3. Desinstalar los paquetes de MySQL ya instalados:
yum remove MySQL-client-community.x86_64
yum remove MySQL-community-debuginfo.x86_64
yum remove MySQL-devel-community.x86_64
yum remove MySQL-embedded-community.x86_64
yum remove MySQL-server-community.x86_64
yum remove MySQL-shared-community.x86_64
yum remove MySQL-shared-compat.x86_64
yum remove MySQL-test-community.x86_64

4. Instalar los paquetes con la nueva versión.
rpm -UK MySQL-client-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-devel-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-embedded-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-server-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-shared-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-shared-compat-5.5.41-1.linux2.6.x86_64.rpm
rpm -UK MySQL-test-5.5.41-1.linux2.6.x86_64.rpm
5. Reiniciar el servicio mysql.

6. Ejecutar el comando mysql_upgrade, para actualizar las tablas que son de sesión.

mysql_upgrade -u root -p
Las base de datos que ya estaban instaladas se pondrán en linea nuevamente, ya que no se elimina las base de datos de usuario.


Nota. Revisar que librerías que tenían dependencias se eliminaron como lo es el maatkit, o cualquier otra utilería.