2009-08-19 20 views
15

Estoy buscando una forma de alias de una base de datos en MySQL. La razón es poder cambiar el nombre de una base de datos de producción en vivo sin bajar el sistema. Me imagino que puedo alias la base de datos con el nuevo nombre, cambiar e implementar el código que se conecta a él en mi tiempo libre, y finalmente eliminar el alias anterior.¿Cómo alijo una base de datos en MySQL?

Si hay una mejor manera de lograr esto, por favor hágamelo saber.

+0

función proxy de DBI puede ser de utilidad, si MySQL no tiene algo construido en – jrockway

+0

@jrockway Usted se horroriza al saber que estoy apoyando una aplicación PHP.. – Schwern

Respuesta

7

https://dev.mysql.com/doc/refman/5.7/en/symbolic-links-to-databases.html dice

MySQL no soporta la vinculación de un directorio a múltiples bases de datos.

Puede utilizar enlaces simbólicos para enlazar un directorio de base de datos a otro lugar, por ejemplo, fuera de la datadir.

$ cd /var/lib/mysql 
$ ln -s /other/dir/mydatabase . 

Pero no se puede utilizar enlaces simbólicos para hacer una base de datos de directorio de un "alias" de otra base de datos MySQL:

$ cd /var/lib/mysql 
$ ln -s `pwd`/mydatabase1 mydatabase2 # WRONG 

La razón es que InnoDB conserva los nombres de bases de datos y otros metadatos dentro de su propio diccionario de datos, almacenado en el archivo de tablespace. Si lo confundes, no obtendrás lo que quieres.

MySQL no tiene ninguna sintaxis DDL para aliasar una base de datos.

+0

¡Nunca pensé en eso! Usted (bueno, no * usted *, Bill), olvide que las bases de datos son solo archivos. – nickf

+0

¡Gracias! Lo había considerado pero no sabía si era seguro. – Schwern

+0

No tengo acceso al sistema de archivos del servidor de bases de datos de Amazon –

2

INNODB no funcionará con los enlaces simbólicos del sistema de archivos.

+0

No he intentado confirmarlo, pero podría funcionar si utiliza InnoDB con la opción de archivo por tabla, en lugar de un espacio de tabla compartido. –

+0

Lo he probado con InnoDB y funciona bien. – TimP

+0

Funciona bien si el enlace está en ** datadir ** es decir '/ var/lib/mysql'. Desgraciadamente, también obtienes una versión defectuosa de la larga denominación db. – TimP

0

En Unix, la manera de enlazar simbólicamente una base de datos es primero crear un directorio en algún disco donde tenga espacio libre y luego crear un enlace suave desde el directorio de datos MySQL.

shell> mkdir /dr1/databases/test 
shell> ln -s /dr1/databases/test /path/to/datadir 

MySQL no admite la vinculación de un directorio a múltiples bases de datos. Reemplazar un directorio de base de datos con un enlace simbólico funciona siempre que no establezca un enlace simbólico entre las bases de datos. Supongamos que usted tiene una base de datos DB1 en el directorio de datos de MySQL, y luego hacer un DB2 enlace simbólico que apunta a DB1:

shell> cd /path/to/datadir 
shell> ln -s db1 db2 

El resultado es que, o cualquier tbl_a mesa en DB1, también parece ser una tabla tbl_a en db2. Si un cliente actualiza db1.tbl_a y otro cliente actualiza db2.tbl_a, es probable que surjan problemas.

Para determinar la ubicación del directorio de datos, utilice esta declaración:

SHOW VARIABLES LIKE 'datadir'; 

Fuente: ejemplo http://dev.mysql.com/doc/refman/5.1/en/symbolic-links.html

Ubuntu/Debian

Advertencia: No se trabaja con MyISAM tablas

1) Determine la ubicación de su directorio de datos :

echo "SHOW VARIABLES LIKE 'datadir';" | mysql -u root -p 

2) Ir a la ubicación del directorio de datos y detener mysql servicio:

sudo su 
service mysql stop 
cd path/to/datadir 

3) Crear un enlace blando:

ln -s current_db db_alias 

4) Fijar permisions:

chown -R mysql:mysql db_alias 

5) Estrella t mysql:

service mysql start 
Cuestiones relacionadas