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

Sch*_*ern 17 mysql schema alias

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

如果有更好的方法来实现这一点,请告诉我.

Bil*_*win 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 .
Run Code Online (Sandbox Code Playgroud)

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

$ cd /var/lib/mysql
$ ln -s `pwd`/mydatabase1 mydatabase2  # WRONG
Run Code Online (Sandbox Code Playgroud)

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

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


Rob*_*uro 8

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

跨存储引擎(例如: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');
Run Code Online (Sandbox Code Playgroud)

删除同义词:

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

DROP DATABASE FAKE_DB_NAME;
Run Code Online (Sandbox Code Playgroud)

为了满足您的需求,您可以让所有应用程序层与“FAKE_DB_NAME”进行通信,并且在需要执行您正在讨论的维护形式时,您将删除当前同义词并将其替换为指向另一个数据库的同义词.

因此,一旦为正确的维护帐户(无论您使用什么 MySQL 帐户进行此类维护)加载这些存储的 prodecure,您将执行以下操作:

(1) 创建同义词:

CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('TempDB', 'FAKE_DB_NAME');
Run Code Online (Sandbox Code Playgroud)

(5) 执行您在“NormalDB”上计划的任何维护

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

这两个交易应该是近乎瞬时的。

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
Run Code Online (Sandbox Code Playgroud)

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

重要提示:请记住,当您“切换”到“TempDB”时,对其所做的任何更改都不会在您有效地“离线”(从应用程序层)进行维护的“NormalDB”中。