Mostrando entradas con la etiqueta MySql. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySql. Mostrar todas las entradas

jueves, 30 de abril de 2009

Renombrar Bases de Datos MySQL en Linux

Por varias razones sucede , que en ocasiones debemos renombrar una base de datos completa, en mi caso el motivo fue que un aplicativo tenía el nombre de la base de datos que debía usarse en su código interno (hard-code) y la base de datos que se creo con mysql se hizo con otro nombre, es obvio que al final la aplicación y la base de datos nunca se iban a ver, entonces que hay que hacer? renombrar.

Aunque parezca muy raro, el administrador de mysql no trae ninguna funcionalidad que permita simplemente renombrar una base de datos, existe un comando para renombrar tablas, pero no bases de datos.
Entonces que opción nos queda?, bueno hay que recordar que los esquemas literalmente el sistema los ve como un directorio, de ser así entonces sería cuestión de renombrar el directorio y ya, pues bien esto es lo que hay que hacer. El asunto es que hay que buscar donde linux guarda los esquemas de mysql.
Dependiendo de la distribución , la colocación de los esquemas va a variar, sin embargo existe un archivo que nos va a indicar donde son almacenados, este archivo es:

my.cnf


La ubicación de este archivo en distribuciones como Debian y sus variaciones, esta generalmente en:

/etc/mysql


De todas formas sino sabemos donde esta lo buscamos con usando find

find / -name my.cnf


Una vez ubicado el archivo accedemos al mismo , y ubicamos la linea que diga

datadir = /var/lib/mysql


Datadir nos indica el lugar donde MySQL almacena todas las bases de datos, en mi distribución Ubuntu observamos que esta en /var/lib/mysql, nos cambiamos a ese directorio y dentro de él veremos que contiene todas las bases de datos que tenga nuestro MySQL, y ya aquí se hace lo más sencillo de todo el cuento, simplemente renombre el directorio al nombre que desee y listo.
No es necesario bajar el servicio de mysql ni reiniciarlo.
Continua...

miércoles, 5 de noviembre de 2008

Crear replica de Bases de Datos MySQL

Desde la versión de MySQL 3 es posible tener una base de datos en un servidor que se alimente automáticamente de un servidor de bases de datos maestro, esto es muy útil donde se manejan muchos datos y se realizan muchas transacciones entonces se desea tener un ambiente de ata disponibilidad en caso de que uno de los servidores se caiga , se activa el otro que esta respaldado hasta las ultimas operaciones realizadas.

Esta guía la probé usando un ambiente con linux debian etch y MySQL 5.0 .
Las características de MySQL 5 soportan replicación asíncrona unidireccional: un servidor actúa como maestro y uno o más actúan como esclavos. El servidor maestro escribe actualizaciones en el fichero de log binario, y mantiene un índice de los ficheros para rastrear las rotaciones de logs. Estos logs sirven como registros de actualizaciones para enviar a los servidores esclavos. Cuando un esclavo se conecta al maestro, informa al maestro de la posición hasta la que el esclavo ha leído los logs en la última actualización satisfactoria. El esclavo recibe cualquier actualización que han tenido lugar desde entonces, y se bloquea y espera para que el master le envíe nuevas actualizaciones.

Un esclavo servidor puede servir como maestro si quiere preparar una cadena de replicaciones de replicación.

Tenga en cuenta que cuando usa replicación, todas las actualizaciones de las tablas que se replican deben realizarse en el servidor maestro. De otro modo, debe ser cuidadoso para evitar conflictos entre actualizaciones que hacen los usuarios a las tablas en el maestro y las actualizaciones que hacen en las tablas de los esclavos.

Configuración del Servidor Maestro

En el fichero /etc/mysql/my.cnf comentamos las siguientes lineas , sin importar el valor que tengan asignado, para que el demonio del mysql pueda escuchar en las interfaces de red :


# skip-networking
# bind-address = 127.0.0.1


Ubicamos en el mismo archivo la clasula [mysqld] , debajo de ella buscamos las lineas siguientes:

# server-id = 1
# log_bin = /var/log/mysql/mysql-bin.log
# binlog_do_db = include_database_name
# binlog_ignore_db = include_database_name


Estas lineas debemos descomentarlas y modificarlas dependiendo de lo que vamos a hacer, la primera es para identificar el servidor, en este caso el servidor maestro es el Nº 1, la segunda linea es la que indica la ruta donde almacenarán los logs, la tercera linea es para indicar el nombre de la base de datos que se va a replicar y a la que el servidor irá registrando en el archivo que pusimos en la ruta de la linea anterior y por ultimo en la siguiente linea colocamos el nombre de la base de datos que no registraremos. Además de modificar estos valores debemos agregar dos lineas más quedando todo este código de la siguiente forma:

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = NombreBaseDatosReplicar
binlog_ignore_db = mysql
low-priority-updates
innodb_flush_log_at_trx_commit=1


La ultima linea agregada innodb_flush_log_at_trx_commit, cuando este valor es 1 (predeterminado), cada vez que se confirma una transacción el buffer de registros (log buffer) se graba en el fichero de registro y se vuelca a disco.
Ya con esto terminamos la edición del archivo my.cnf en el maestro, nos salimos del editor y procedemos a reiniciar el servicio de mysql

/etc/init.d/mysql restart


Bloquear y Extraer Base de Datos
Crear Usuario
Procedemos ahora a crear un usuario que tendrá permisos para que el servidor esclavo pueda conectarse a la base de datos del servidor maestro ( si ya tiene un usuario creado con tal permisología en la base de datos también puede re-asignarle permisos para la replica en el servidor esclavo). Para ello procedemos a entrar al shell del mysql como root y dentro ejecutamos la sentencia de creación del usuario:

GRANT REPLICATION SLAVE ON *.* TO 'usuario'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;


Bloquear Base de Datos
Para generar la replica de la base de datos estas deben quedar con la misma data , para ello debemos bloquear cualquier registro nuevo que se vaya a generar mientras realizamos el proceso, siendo así usamos la base de datos especifica y posteriormente la bloquearemos, esto se realizará ejecutando lo siguiente:

use nombreBaseDatos;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;


La ultima linea nos generará una respuesta la cual debemos prestar atención, ya que los datos deben ser anotados para posteriormente utilizarlos, de este resultado debemos anotar las dos primera columnas que son el nombre del fichero y la posición, los datos generados son similares a estos :

mysql-bin.0008678 98 nombreBaseDatos


Una vez anotado estos datos, nos salimos del shell de mysql.

Extraer Datos
Es necesario exportar la base de datos para posteriormente importarla en el servidor Esclavo, para ello usaremos el comando mysqldump con el cual generaremos un archivo .sql , ejecutamos entonces en el terminal lo siguiente:

mysqldump -u root -p --opt nombreBaseDatosReplicar > nombreBaseDatos.sql


Generado el archivo .sql lo copiamos en el servidor esclavo. Ahora solo queda desbloquear la base de datos en el servidor maestro para que siga su normal funcionamiento, entramos de nuevo en el shell de mysql como root y ejecutamos el comando:

unlock tables;


Hasta aquí hemos terminado la configuración con el servidor maestro, ahora procederemos a entrar al servidor esclavo para realizar la configuración.

Configuración del Servidor Esclavo
Crear e importar base de datos
En el servidor Esclavo procedemos a crear la base de datos, para ello ingresamos a mysql y desde el shell ejecutamos lo siguiente:

create database nombreBaseDatos;


Nos salimos del shell y procedemos a ejecutar en el terminal el comando para importar la base de datos que previamente habiamos guardado en un archivo .sql , esto lo haremos de la siguiente forma:

mysql -u root -p nombreBaseDatos < /rutaarchivo/nombreBaseDatos.sql

Configuración de MySQL como esclavo
Ahora editaremos el archivo my.cnf del servidor esclavo con el fin de definir que este servidor funcionará como esclavo y se le indicará quien es el servidor maestro, para ello abrimos el archivo y buscamos la clausula [mysqld]y colocamos lo siguiente:

server-id = 2
master-host = ipServidorMaestro
master-user = usuarioCreado
master-password = usuarioPassword
master-connect-retry = 60
replicate-do-db = nombreBaseDatos


Guardamos los cambios realizados y reiniciamos el servicio de mysql , posteriormente entramos como root al mysql y apagamos el servicio de esclavo ejecutando el siguiente comando:

SLAVE STOP;


Inmediatamente procedemos a ingresar los datos del ip del servidor mysql maestro, los datos del usuario y además usaremos los datos que anotamos cuando se procedió a bloquear la base de datos, es decir , el nombre del archivo y la posición, esto lo hacemos con la siguiente sentencia:

CHANGE MASTER TO MASTER_HOST='ipServidorMaestro', MASTER_USER='usuarioCreado', MASTER_PASSWORD='usuarioPassword', MASTER_LOG_FILE='archivo mysql-bin.xxxxx', MASTER_LOG_POS='Nº XX';


Para finalizar iniciamos nuevamente el esclavo y salimos del mysql:

START SLAVE;


Ahora ya se puede realizar cualquier cambio en el servidor maestro y se verán replicados en el servidor esclavo.

Continua...

martes, 14 de octubre de 2008

Habilitar Acceso Remoto a Bases de Datos MySql

Muchas veces el acceso a nuestras bases de datos lo realizamos directamente en el mismo servidor, quizás por razones de sencillez , vía ssh nos conectamos y revisamos lo que se necesita. Sin embargo, para acceder a estos servidores requerimos tener un usuario y su correspondiente clave, aparte del usuario y la clave de la base de datos. Es por ello que muchas veces necesitaremos administrar remotamente las BD de mysql y para ello solo necesitamos hacer una pequeña configuración en el servidor para permitir los accesos.

Lo primero que debemos hacer es irnos al servidor donde esta instalada la base de datos mysql y realizar un cambio en el archivo my.cnf de mysql , si esta instalado en un servidor con debian lo encontremos en la ruta:


/etc/mysql


En este archivo por defecto la instalación de MySql queda apuntando a nuestra dirección local, para ello debemos modificarla, así que ubicamos la linea que dice:

bind-address = 127.0.0.1


y le cambiamos la dirección para que quede:

bind-address = 0.0.0.0


Una vez realizado esto ejecutamos mysql como root , y una vez dentro le daremos permiso al usuario que queremos que acceda de manera remota, esto es ejecutando la siguiente sentencia:

grant all privileges on *.* to 'usuario'@'%' identified by 'password' with grant option;


Y listo, ejecutado estas dos operaciones procedemos a reiniciar el servicio de mysql:

/etc/init.d/mysql restart


Ejecutado el procedimiento , podemos probar desde otra maquina ingresar a la base de datos colocando la dirección ip , el usuario y clave de la base de datos el cual previamente configuramos.

Continua...

sábado, 17 de mayo de 2008

Que hacer si no tenemos la clave de Root, en MySql?

Bueno, esta vez creo que es hora de ir al médico de tantos olvidos que uno tiene jejeje. La intención de este post, no es entrar en la base de datos de la empresa y robar información o peor aún corromperla o cambiarla!.
Obviamente asumo, que la intención de leer esto es porque probablemente les paso el mismo descuido que tuve... instalar los paquetes de mysql, y ... no acordarse cual fue la clave que le asignamos a Root!.

Esto es muy común , muchas veces generamos ambientes donde instalamos muchas aplicaciones y no anotamos cual clave fue asignada , a menos que estemos usando la misma para todo, que es igual de fatal jaja.
Bueno el caso es, que hacer si se nos olvido la clave de root en mysql?, en mi situación esto que hice me funciono teniendo Ubuntu Hardy Linux y MySql 5.0, pero igual sirve si tenemos otras distro, el hecho es que tendremos que ejecutar los siguientes pasos:
Abrimos una terminal y como root detendremos el servicio de mysql:
sudo /etc/init.d/mysql stop

Si todo sale bien, la consola nos indicará que efectivamente ha parado el servicio, posteriormente nos cambiaremos al directorio /bin y desde ahí ejecutaremos, de nuevo como root, lo siguiente:
sudo mysqld --skip-grant-tables --user=root

Esta consola quedara en un estado de stand by, después de mostrarnos varias lineas de mensajes, no hay que preocuparse y dejamos esta consola abierta sin tocar más nada, ahora lo que hacemos es abrir otra consola con la que seguiremos trabajando, en ella nos iremos de nuevo al directorio /bin y ejecutamos mysql como root:
mysql -u root

Ahora que ha pasado?, bueno si nos fijamos bien, pudimos entrar a mysql como root SIN que nos pidiera la clave de root!!, y porque pasa esto? bueno porque en el otro terminal estamos manteniendo el socket abierto para que esto suceda, hemos dejado una puerta abierta.
Y bueno ya una vez adentro nos quedará el prompt "mysql>", aquí realizaremos los cambios para poner nuestra nueva clave de root, asi que ejecutamos:
UPDATE mysql.user SET Password=PASSWORD('nueva_clave') WHERE User='root';

No olvidar poner el ; al final , recordemos que como estamos modificando una tabla de mysql esto es una sentencia igual como si modificaramos cualquier tabla ordinaria. Ejecutada la sentencia, nos indicará las filas afectadas.
Bueno, ya para ir terminando ejecutamos:
FLUSH PRIVILEGES;

Finalmente, nos salimos de mysql, escribiendo exit; .
Ahora en la terminal , lo que hacemos es volver a para el servicio, pero y hey?? ya no lo habiamos detenido anteriormente?, claro, pero dejamos un socket abierto y debe cerrarse, asi que volvemos a ejecutar en la linea de comando y como root:
sudo /etc/init.d/mysql stop

Una vez hecho esto, el otro terminal que manteniamos abierto, se va a terminar el proceso que venia corriendo y podremos cerrarlo, y en el terminal que nos queda abierto iniciamos el servicio de mysql:
sudo /etc/init.d/mysql start

Cuando haya iniciado, podremos entrar a mysql como root con nuestra nueva clave :-) , escribimos:
mysql -u root -p

Continua...