Wednesday, October 17, 2012

Como mover la instalación de MySQL a otro path que no sea el default en Linux.


Por X o Y razón quieren mover las bases de datos de MySQL del lugar default donde se instala, usualmente /var/lib/mysql. En mi caso fue para distribuir la carga de procesamiento del OS y la base de datos en discos diferentes. Lleve a cabo este proceso en RedHat 6.0 (RHEL6).

Recomendación: a menos que sea un prerequisito específico para un software trata de instalar la versión de MySQL que provee 'yum'. Te vas a evitar un montón de problemas de dependencies. 

A este momento ya debes haber instalado MySQL.

1. En el terminal escribe mysqlshow -u root -p aprieta enter y pon el password de root de mysql. Eso desplegara las bases de datos que MySQL instala por default y confirmarás que la instalación fue exitosa y que el servicio esta arriba.

# mysqlshow -u root -p
Enter password: *******
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
| wikidb             |
+--------------------+

2.  Ahora necesitamos parar el servicio de MySQL para poderlo mover. Utiliza el comando service mysqld stop . 
# service mysqld stop
Stopping MySQL:                                            [  OK  ]

 3. Vamos a crear el directorio donde queremos mover la instalación. (El argumento -p crea los directorios "padres" si no existen")
# mkdir -p /opt/mysql

 4. Ahora copiamos el contenido del folder actual de MySQL al directorio nuevo.
# cp -R /var/lib/mysql/* /opt/mysql/

 5. Le cambiamos el dueño al archivo nuevo y a todo su contenido
# chown -R mysql:mysql /opt/mysql

6. Ya tenemos la instalación en otro lugar. Pero ahora necesitamos decirle MySQL que su ubicación ha cambiado. Hay que modificar nuestro archivo my.cnf. Este archivo le hace overwrite a los valores por default de MySQL y se encuentra en /etc/my.cnf. Si lo buscas y no esta puedes crearlo con tu editor favorito (vi, vim ect...). El contenido de este archivo (minimo) debe ser el siguiente:

[client]
port=3306
socket=/opt/mysql/mysql.sock

[mysqld]
datadir=/opt/mysql
socket=/opt/mysql/mysql.sock
port=3306

#Esto de innodb es opcional y lo voy a explicar mas abajo
innodb_file_per_table

Aqui estamos diciendole al MySQL que le puerto por el cual el cliente se va a estar conectando sera 3306, el path donde esta el socket para la comunicación y donde se encuentra el directorio nuevo. Graba el archivo.

*innodb_file_per_table: Mientras vas creando y borrando bases de datos y tablas MySQL va llenando un archivo que se llama ibdata1 (dentro del archivo de mysql). Este archivo puede llegar a tener GBs de data guardada y no hay manera de limpiarlo (ni aunque dropees la base de datos).  Esta opción lo que hace es que en vez almacenar toda la data de las tablas/DBs creadas en un solo archivo, hace un archivo por cada una de las tablas que creas y a la hora de que borres la tabla el archivo tambien se va. Esto es opcional pero vale la pena mencionarselos porque si ese archivo crece demasiado para limpiarlo vas a tener q hacer un dump de todas las bases de datos, borrar ese archivo y restaurar del dump que hicistes. 

7. Ahora tenemos que correr un comando para cambiar los permisos del archivo nuevo de MySQL y que SELinux nos permita correrlo.
semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?"
*Si no tienes semanage instalado 'yum whatprovides /usr/sbin/semanage' te dira que paquete debes instalar.

8. Ahora hay que reestablecer el mapping de SELinux con este comando.
restorecon -R -v /opt/mysql
9. Ya con esto estamos ready, asi que subimos el servicio de MySQL con el comando service mysqld start
# service mysqld start
Starting MySQL:                                            [  OK  ]


Si no sube verifica que en /opt/mysql/ exista el mysql.sock. Si no existe corre los siguientes comandos estando en el directorio de mysql e intenta subir el servicio denuevo.
# touch mysql.sock
# chown mysql:mysql mysql.sock
    


Si tienen problemas pueden preguntarme, puede que no sepa la respuesta pero si estoy disponible le ayudaré a buscar la contestación