我如何在MySQL中为数据库设置别名?

时间:2009-08-19 22:49:15

标签: mysql schema alias

我正在寻找一种在MySQL中对数据库进行别名的方法。原因是能够重命名实时的生产数据库而不会导致系统崩溃。我想我可以将数据库别名为新名称,在我闲暇时更改和部署连接到它的代码,并最终删除旧别名。

如果有更好的方法可以实现这一点,请告诉我。

4 个答案:

答案 0 :(得分:8)

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

  

MySQL不支持将一个目录链接到多个数据库。

您可以使用符号链接将数据库目录链接到其他位置,例如在datadir之外。

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

但是你不能使用符号链接使一个数据库目录成为另一个MySQL数据库的“别名”:

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

原因是InnoDB在其自己的数据字典中保留了数据库名称和其他元数据,存储在表空间文件中。如果你混淆它,你将得不到你想要的东西。

MySQL没有任何用于别名数据库的DDL语法。

答案 1 :(得分:2)

INNODB不适用于文件系统符号链接。

答案 2 :(得分:0)

在Unix上,符号链接数据库的方法是首先在某个磁盘上创建一个目录,在该磁盘上有可用空间,然后从MySQL数据目录创建一个到它的软链接。

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

MySQL不支持将一个目录链接到多个数据库。只要不在数据库之间建立符号链接,就可以使用符号链接替换数据库目录。假设您在MySQL数据目录下有一个数据库db1,然后创建一个指向db1的符号链接db2:

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

结果是,或者db1中的任何表tbl_a,db2中似乎还有一个表tbl_a。如果一个客户端更新db1.tbl_a而另一个客户端更新db2.tbl_a,则可能会出现问题。

要确定数据目录的位置,请使用以下语句:

SHOW VARIABLES LIKE 'datadir';

来源:http://dev.mysql.com/doc/refman/5.1/en/symbolic-links.html

Ubuntu / Debian示例

警告:不使用MyISAM表格

1)确定数据目录的位置:

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

2)转到数据目录的位置并停止mysql服务:

sudo su
service mysql stop
cd path/to/datadir

3)创建一个软链接:

ln -s current_db db_alias

4)修复permisions:

chown -R mysql:mysql db_alias

5)开始mysql

service mysql start

答案 3 :(得分:0)

使用下面引用的代码创建同义词。

在存储引擎(例如:InnoDB,MyISAM等)上运行的最简单方法是对所有数据库访问使用“同义词”。

这些链接将向您显示完成此操作所需的存储过程。

注意:您应删除“ sys”。从“ create_synonym_db.sql”中的“ sys.quote_identifier”(应为“ quote_identifier”)中获取。

代码:

要使用:

这将为“ CURRENT_DB”创建匹配的访问模式,该模式将通过引用“ FAKE-DB_NAME”允许所有标准SQL功能。

CALL create_synonym_db('CURRENT_DB', 'FAKE_DB_NAME');

要删除同义词:

这将删除同义词,但不会删除原始数据库(在Maria 10.10.0系列上进行了测试)。

DROP DATABASE FAKE_DB_NAME;

要满足您的需求,您将使所有应用程序层都与“ FAKE_DB_NAME”进行通信,并且在需要执行您要讨论的维护形式时,您将删除当前的同义词,并用一个指向另一个数据库。

因此,一旦为正确的维护帐户(无论用于这种维护的MySQL帐户)加载了那些存储的程序,便会执行以下操作:

(1)创建同义词:

CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');

(2)通过同义词正常使用数据库:

  • “ FAKE_DB_NAME”引用数据库的所有SQL代码

(3)使用您选择的任何方法制作临时/备份/替换数据库。

(4)将所有应用层的SQL代码切换到Temp DB

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('TempDB', 'FAKE_DB_NAME');

(5)执行您在“ NormalDB”上计划的所有维护工作

(6)将所有应用层的SQL代码切换到Temp DB

这两个事务应该几乎是瞬时的。

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');

这将允许您无缝交换任何数据库,而无需更改应用程序层上的代码。

重要提示:请记住,当您“切换”到“ TempDB”时,对其所做的任何更改都不会出现在您实际上已“脱机”(通过应用程序)的“ NormalDB”中层)进行维护。