我正在寻找一种方式来别名在MySQL数据库中。 原因是为了能够在不停止系统情况下重命名活动,生产数据库。 我想我可以别名数据库的新名称,变更和部署连接到它在我闲暇的代码,并最终删除旧的别名。
如果有更好的方法来做到这一点,请让我知道。
我正在寻找一种方式来别名在MySQL数据库中。 原因是为了能够在不停止系统情况下重命名活动,生产数据库。 我想我可以别名数据库的新名称,变更和部署连接到它在我闲暇的代码,并最终删除旧的别名。
如果有更好的方法来做到这一点,请让我知道。
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语法。
INNODB不会与文件系统的符号链接工作。
在Unix上,符号链接数据库的办法,首先就是一些磁盘,你有免费的空间,然后创建一个从MySQL数据目录的软链接它创建一个目录。
shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir
MySQL不支持链接一个目录到多个数据库。 用一个符号链接替换一个数据库目录的工作,只要你不把数据库之间的符号链接。 假设你有MySQL数据目录下的数据库DB1,然后做一个符号链接DB2指向DB1:
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
使用下面引用创建同义词的代码。
要做到这一点,这将跨存储引擎的工作原理最简单的方法(如:InnoDB的,MyISAM数据等)是使用“同义词”所有对数据库的访问。
这些链接会显示您为了实现这一目标所需要的存储过程。
注意:您应该删除“SYS”。 从“sys.quote_identifier”(应该只是“quote_identifier”)在“create_synonym_db.sql”。
码:
使用方法:
这将使“CURRENT_DB”这将允许通过引用“假DB_NAME”所有标准SQL的功能匹配的访问模式。
CALL create_synonym_db('CURRENT_DB', 'FAKE_DB_NAME');
要删除的代名词:
这将下降的代名词,但不删除原始数据库(玛丽亚10.10.0系列测试)。
DROP DATABASE FAKE_DB_NAME;
为了实现你的需求,你将有所有应用层与“FAKE_DB_NAME”沟通,并就需要做你讨论维修的形式,你会删除当前的代名词,并用一个指向更换到其他数据库。
因此,一旦加载了正确的保养帐户的存储prodecures(无论MySQL账户使用此类维护),你会做以下几点:
(1)创建同义词:
CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
(2)通过使用同义词数据库作为正常:
(3)让您的临时/备份/ replacment与您选择什么方法DB。
(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”你有效地维护了“离线”(从应用层)的任何变化。