MySQL でデータベースにエイリアスを設定する方法を探しています。その理由は、システムをダウンさせずにライブの本番データベースの名前を変更できるようにするためです。データベースを新しい名前にエイリアスし、自由に接続するコードを変更してデプロイし、最終的に古いエイリアスを削除できると思います。
これを達成するためのより良い方法があれば、私に知らせてください。
https://dev.mysql.com/doc/refman/5.7/en/symbolic-links-to-databases.html言う
MySQL は、1 つのディレクトリを複数のデータベースにリンクすることをサポートしていません。
シンボリック リンクを使用して、データベース ディレクトリを他の場所 (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、MyISAM など) で機能するこれを行う最も簡単な方法は、データベースへのすべてのアクセスに「シノニム」を使用することです。
これらのリンクは、これを達成するために必要なストアド プロシージャを示します。
注:「sys」を削除する必要があります。「create_synonym_db.sql」の「sys.quote_identifier」(単に「quote_identifier」である必要があります)から。
コード:
使用するには:
これにより、「FAKE-DB_NAME」を参照することですべての標準 SQL 機能を許可する「CURRENT_DB」の一致するアクセス スキーマが作成されます。
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)選択した方法で一時/バックアップ/交換DBを作成します。
(4) すべてのアプリ層 SQL コードを一時 DB に切り替えます
DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('TempDB', 'FAKE_DB_NAME');
(5) 「NormalDB」で計画したメンテナンスを実行します
(6) すべてのアプリ層 SQL コードを一時 DB に切り替えます
これら 2 つのトランザクションはほぼ瞬時に行われます。
DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
これにより、アプリ層のコードを変更することなく、任意のデータベースでシームレスにスワップできます。
重要:「TempDB」に「切り替える」場合、それに加えられた変更は、メンテナンスのために (アプリ層から) 「オフライン」にした「NormalDB」には反映されないことに注意してください。
INNODBはファイルシステムのシンボリックリンクでは機能しません。
Unix では、データベースをシンボリック リンクする方法は、最初に空き領域があるディスクにディレクトリを作成し、次に MySQL データ ディレクトリからそのディレクトリへのソフト リンクを作成することです。
shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir
MySQL は、1 つのディレクトリを複数のデータベースにリンクすることをサポートしていません。データベース ディレクトリをシンボリック リンクに置き換えることは、データベース間にシンボリック リンクを作成しない限り機能します。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) 権限を修正します。
chown -R mysql:mysql db_alias
5) 開始mysql
:
service mysql start