19

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

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

4

4 回答 4

9

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 语法。

于 2009-08-19T22:51:42.687 回答
9

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

跨存储引擎(例如: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) 将所有app层SQL代码切换到Temp DB

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

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

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

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

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

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

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

于 2019-03-27T16:29:22.130 回答
2

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

于 2009-09-18T19:30:13.203 回答
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)修复权限:

chown -R mysql:mysql db_alias

5)开始mysql

service mysql start
于 2015-08-24T14:31:49.357 回答