私は忙しいInnoDBテーブルを持っています。このテーブルは、その負荷に基づいて日常的にサイズを定期的に拡張および縮小します。通常、テーブルのサイズが80GB(50/50のデータとインデックス)に拡大し、その後約30GBに縮小します。残念ながら、InnoDBは、使用していないスペースを解放することを好みません。これは、120 GB SSDの前兆ではありません。
通常、最適化(またはInnoDBテーブル用に再作成)を行うと、少し多くのスペースが確保されます。ただし、一時テーブルを作成するための十分なスペースがない場合があります。
My.cnfの一時テーブル変数に別の場所を設定しているにもかかわらず、InnoDBデータベースは、データベースフォルダ内のデータディレクトリに一時テーブルを作成するように要求しています。一時的なInnoDBテーブルを作成するときに、MySQLを別のドライブにポイントする方法はありますか?
私はそれが良いよりも多くのダメージを与えると確信していますが、大きなドライブにデータベースのシンボリックリンクを作成し、テーブルをSSDにシンボリックリンクできる可能性があることがここで提案されました。このようにして、すべての標準操作ははるかに高速なSSDで実行され、定期的なメンテナンスタスクは大容量で低速のドライブで実行されます。
編集:私は明確にする必要があります。 innodb_file_per_tableが設定され、tmpdirも(より大きなドライブに)設定されますが、tmpdirは私には何もしないようです。
InnoDBを定期的にメンテナンスする場合、InnoDBをシンボリックリンクすることは間違いなく良い考えではありません。
私はなぜこれを行わないのかについての記事を書きました:
Aug 07, 2011
: MySQL InnoDBデータファイルをディスクスライスに直接(固定サイズ)?Mar 12, 2012
: 個々のMySQLデータベースに特定のディレクトリの場所を設定する方法ただし、これが厳密に大きなテーブルを縮小する目的である場合は、一時テーブルが移動するデータディレクトリ全体をシンボリックリンクできると思いますが、個人的に縮小をスクリプト化する必要があります。
例えば
mydata.mytable
であるとします。datsdir
は/var/lib/mysql
ですあなたの手順は
STEP 01:mydatatemp
というデータベースを作成する必要があります。まだデータを入れないでください。
STEP 02:/var/lib/mysql/mydatatemp
を別のディスクに移動します。
STEP 03:他のディスク上のフォルダーにSymlink /var/lib/mysql/mydatatemp
を作成します
STEP 04:chown -R mysql:mysql
を外部フォルダーおよびシンボリックリンクに対して。
STEP 05:次のようにデータ圧縮を実行します。
CREATE TABLE mydatatemp.mytable LIKE mydata.mytable;
INSERT INTO mydatatemp.mytable SELECT * FROM mydata.mytable;
DROP TABLE mydata.mytable;
ALTER TABLE mydatatemp.mytable RENAME mydata.mytable;
要約すると、以下を実行します(/tmpdata
が外部ディスクであると想定)
ステップ01-04
chown mysql:mysql /tmpdata
ln -s /tmpdata /var/lib/mysql/mydatatemp
chown -R mysql:mysql /var/lib/mysql/mydatatemp
次にSTEP 05を実行します
これはかなりリスクが高くなりますが、うまくいくはずです。最初に次のように空のテーブルでこれをテストしてください:
USE mydatatemp
CREATE TABLE mrnorm (id int not null, name varchar(20) primary key (id));
INSERT INTO mrnorm (name) VALUES ('one'),('two'),('three');
SELECT * FROM mrnorm;
これらのSQLコマンドが機能した場合は、OSに移動して次のようにします。
cd /tmpdata
ls -l
2つのファイルが表示されます。
mrnorm.frm
mrnorm.ibd
また、mrnormを移動できるかどうかをテストします
CREATE DATABASE helloworld;
ALTER TABLE mydatatemp.mrnorm RENAME helloworld.mrnorm;
OSに移動して実行します
cd /tmpdata
ls -l
テーブルはなくなっているはずです。今、これを行います:
cd /var/lib/mysql/helloworld
ls -l
テーブルがあるはずです
テストの終わり
テーブルの名前の変更は、ibdata1のシステムテーブルスペースのデータディクショナリセクションを適切に調整することにより、本質的にはディスクから別のディスクへのテーブルのコピーの制御になることに注意してください。これには時間がかかる場合があります。