我正在寻找一种在MySQL中对数据库进行别名的方法。原因是能够重命名实时的生产数据库而不会导致系统崩溃。我想我可以将数据库别名为新名称,在我闲暇时更改和部署连接到它的代码,并最终删除旧别名。
如果有更好的方法可以实现这一点,请告诉我。
答案 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
警告:不使用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)通过同义词正常使用数据库:
(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”中层)进行维护。