如何在mysql中为数据库添加别名?

1rhkuytd  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(412)

我正在寻找一种在mysql中为数据库添加别名的方法。原因是能够在不关闭系统的情况下重命名活动的生产数据库。我想我可以将数据库别名为新名称,随意更改和部署连接到它的代码,并最终删除旧别名。
如果有更好的方法,请告诉我。

zaqlnxep

zaqlnxep1#

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语法来给数据库取别名。

ssgvzors

ssgvzors2#

在unix上,对数据库进行符号链接的方法是首先在有空闲空间的磁盘上创建一个目录,然后从mysql数据目录创建一个到该目录的软链接。

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

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

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

结果是,或者db1中的任何表tbl\u a,在db2中似乎也有一个表tbl\u a。如果一个客户机更新db1.tbl\u a,而另一个客户机更新db2.tbl\u a,则很可能会出现问题。
要确定数据目录的位置,请使用以下语句:

SHOW VARIABLES LIKE 'datadir';

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

ubuntu/debian示例

警告:不使用 MyISAM table
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
mcdcgff0

mcdcgff03#

innodb不能使用文件系统符号链接。

mpbci0fu

mpbci0fu4#

使用下面引用的代码创建同义词。
最简单的方法是对数据库的所有访问使用“同义词”,这种方法可以跨存储引擎(例如:innodb、myisam等)工作。
这些链接将向您展示完成此任务所需的存储过程。
注意:您应该从“create\u synonym\u db.sql”中的“sys.quote\u identifier”(应该是“quote\u identifier”)中删除“sys.”。
代码:
https://github.com/mysql/mysql-sys/blob/master/procedures/create_synonym_db.sql
https://github.com/mysql/mysql-sys/blob/master/functions/quote_identifier.sql
使用方法:
这将为“current\u db”创建一个匹配的访问模式,该模式将允许通过引用“fake-db\u name”实现所有标准sql功能。

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

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

DROP DATABASE FAKE_DB_NAME;

为了满足您的需求,您将让所有应用程序层都使用“假数据库名称”进行通信,并且,根据您正在讨论的维护形式的需要,您将删除当前同义词,并用一个指向另一个数据库的同义词替换它。
因此,一旦为正确的维护帐户(无论您使用哪个mysql帐户进行此类维护)加载这些存储的prodecures,您将执行以下操作:
(1) 创建同义词:

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

(2) 按同义词正常使用数据库:
所有引用数据库的sql代码都是“fake\u db\u name”
(3) 使用您选择的任何方法创建temp/backup/replacment数据库。
(4) 将所有应用层sql代码切换到临时数据库

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

(5) 对“normaldb”执行您计划的任何维护
(6) 将所有应用层sql代码切换到临时数据库
这两个事务应该几乎是瞬时的。

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

这将允许您无缝地交换任何数据库,而无需更改应用层上的代码。
重要提示:请记住,当您“切换”到“tempdb”时,对它所做的任何更改都不会出现在“normaldb”中,因为您实际上将“脱机”(从应用层)用于维护。

相关问题