web-dev-qa-db-ja.com

個々のMySQLデータベースに特定のディレクトリの場所を設定するにはどうすればよいですか?

MySQLの各データベースを個別のdatadirを使用するように設定することは可能ですか?

Userdir開発(サンドボックス)サーバーを実行しており、そのユーザーのデータベースのMySQLデータファイルを/home/<user>/mysqlディレクトリ。

  • Linux Ubuntuサーバー10.4
  • MySQLサーバーのバージョン:5.1.41
  • ストレージエンジンタイプ:InnoDB

どうしますか?

5
Highway of Life

あなたはシンボリックリンクでゲームをするでしょう。

警告:以下はinnodb_file_per_tableが有効な場合にのみ機能します

たとえば、datadirが/ opt/mysql/dataだったとします。各データベースはそのフォルダの下にあります。 3つのデータベース(db1、db2、db3)がある場合、フォルダーは次のとおりです。

  • / opt/mysql/data/db1
  • / opt/mysql/data/db2
  • / opt/mysql/data/db3

何かを行う前に、このクエリを実行します。

mysql> select table_schema,table_name from information_schema.tables
where table_schema in ('db1','db2','db3');

一時データベースの作成から始めましょう

mysql> create database tmpdb1;
mysql> create database tmpdb2;
mysql> create database tmpdb3;

次に、db1があるすべてのテーブルをtmpdb1に、db2をtmpdb2に、db3をtmpdb3に移動しましょう

mysql -uroot -AN -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' RENAME tmp',db,'.',tb,';') FROM information_schema.tables WHERE table_schema in ('db1','db2','db3')" > /root/MoveTables1.sql
mysql -uroot < /root/MoveTables1.sql

はい、すべての.ibdファイルを横にtmpデータベースに移動しました

Mysqlに移動し、すべてのテーブルが移動されていることを確認します。データベースdb1-db3は空でなければなりません

mysql> use db1
mysql> show tables;
mysql> use db2
mysql> show tables;
mysql> use db3
mysql> show tables;
mysql> use tmpdb1
mysql> show tables;
mysql> use tmpdb2
mysql> show tables;
mysql> use tmpdb3
mysql> show tables;

次に、元のデータベースを削除します

mysql> drop database db1;
mysql> drop database db2;
mysql> drop database db3;

OSに移動して、シンボリックリンクを作成します

ln -s /home/user2/mysql /opt/mysql/data/db1
ln -s /home/user2/mysql /opt/mysql/data/db2
ln -s /home/user3/mysql /opt/mysql/data/db3
chown -R mysql:mysql /opt/mysql/data/db1
chown -R mysql:mysql /opt/mysql/data/db2
chown -R mysql:mysql /opt/mysql/data/db3

Mysqlに移動し、データベースが表示されていることを確認します

mysql> show databases;

次に、テーブルをシンボリックリンクされたデータベースに移動します

mysql -uroot -AN -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' RENAME ',SUBSTR(db,4),'.',tb,';') FROM information_schema.tables WHERE table_schema in ('tmpdb1','tmpdb2','tmpdb3')" > /root/MoveTables2.sql
mysql -uroot < /root/MoveTables2.sql

最後に、最初に開始したクエリを実行します

mysql> select table_schema,table_name from information_schema.tables
where table_schema in ('db1','db2','db3');

同じディスプレイが表示されれば、問題はありません。

更新

@ AaronBrown は、.ibdファイルを展開しても、展開されたファイル以外は何も購入しないことを思い出させるほど親切でした。パフォーマンスはまったく向上しません。アーロン、ありがとう。

6
RolandoMySQLDBA

このための組み込みのMySQL機能があります。

https://dev.mysql.com/doc/refman/5.6/en/tablespace-placing.html

CREATE TABLE t2 (c1 INT PRIMARY KEY) 
TABLESPACE = innodb_file_per_table 
DATA DIRECTORY = '/alternative/directory';

これはCREATE TABLE構文の一部です。マニュアルでは、これをシンボリックリンクのサポートされる代替として明示的に推奨しています。

また、これを実行するための悪い理由のリストや、見た目は良いが問題を抱えている理由のリストもあるかもしれませんが、適切なケースの正当な理由の完全に正当なリストもあります。これは、ストレージハードウェアが階層化されており、より高速なデバイスの容量が限られている場合に、パフォーマンスのために活用できる、または活用すべきケースがあります。

5