19

MySQL でデータベースにエイリアスを設定する方法を探しています。その理由は、システムをダウンさせずにライブの本番データベースの名前を変更できるようにするためです。データベースを新しい名前にエイリアスし、自由に接続するコードを変更してデプロイし、最終的に古いエイリアスを削除できると思います。

これを達成するためのより良い方法があれば、私に知らせてください。

4

4 に答える 4

9

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 構文がありません。

于 2009-08-19T22:51:42.687 に答える
9

以下で参照されているコードを使用して、シノニムを作成します。

複数のストレージ エンジン (例: 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) 同義語で通常どおりデータベースを使用します。

  • 「FAKE_DB_NAME」によってデータベースを参照するすべての SQL コード

(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」には反映されないことに注意してください。

于 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 は、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

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 に答える