web-dev-qa-db-ja.com

InnoDB一時テーブルの場所

私は忙しいInnoDBテーブルを持っています。このテーブルは、その負荷に基づいて日常的にサイズを定期的に拡張および縮小します。通常、テーブルのサイズが80GB(50/50のデータとインデックス)に拡大し、その後約30GBに縮小します。残念ながら、InnoDBは、使用していないスペースを解放することを好みません。これは、120 GB SSDの前兆ではありません。

通常、最適化(またはInnoDBテーブル用に再作成)を行うと、少し多くのスペースが確保されます。ただし、一時テーブルを作成するための十分なスペースがない場合があります。

My.cnfの一時テーブル変数に別の場所を設定しているにもかかわらず、InnoDBデータベースは、データベースフォルダ内のデータディレクトリに一時テーブルを作成するように要求しています。一時的なInnoDBテーブルを作成するときに、MySQLを別のドライブにポイントする方法はありますか?

私はそれが良いよりも多くのダメージを与えると確信していますが、大きなドライブにデータベースのシンボリックリンクを作成し、テーブルをSSDにシンボリックリンクできる可能性があることがここで提案されました。このようにして、すべての標準操作ははるかに高速なSSDで実行され、定期的なメンテナンスタスクは大容量で低速のドライブで実行されます。

編集:私は明確にする必要があります。 innodb_file_per_tableが設定され、tmpdirも(より大きなドライブに)設定されますが、tmpdirは私には何もしないようです。

4
MrNorm

InnoDBを定期的にメンテナンスする場合、InnoDBをシンボリックリンクすることは間違いなく良い考えではありません。

私はなぜこれを行わないのかについての記事を書きました:

ただし、これが厳密に大きなテーブルを縮小する目的である場合は、一時テーブルが移動するデータディレクトリ全体をシンボリックリンクできると思いますが、個人的に縮小をスクリプト化する必要があります。

例えば

  • 縮小するテーブルがmydata.mytableであるとします。
  • datsdir/var/lib/mysqlです

あなたの手順は

STEP 01mydatatempというデータベースを作成する必要があります。まだデータを入れないでください。

STEP 02/var/lib/mysql/mydatatempを別のディスクに移動します。

STEP 03:他のディスク上のフォルダーにSymlink /var/lib/mysql/mydatatempを作成します

STEP 04chown -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のシステムテーブルスペースのデータディクショナリセクションを適切に調整することにより、本質的にはディスクから別のディスクへのテーブルのコピーの制御になることに注意してください。これには時間がかかる場合があります。

2
RolandoMySQLDBA