web-dev-qa-db-ja.com

MySQLの大きなibdataファイル

すべてのテーブルを含むMySQLデータベースをInnoDBとしてfile_per_table構成をオンにしています。しかし、それでも巨大なibdataファイル(〜50GB)が表示されます。すべてのテーブルにも.ibdファイルがあります。これは私がダンプを取ってロードすることで作成したマシンです。これの理由は何ですか。

1
georgecj11

おそらく、大きなトランザクションがたくさんあるか、本当に大きなトランザクションが1つあるでしょう。

Vadim TkachenkoのInnoDBの図解表現をご覧ください

InnoDB

システムテーブル(ibdata1)の内部を見ると、ロールバックセグメントと元に戻すログが表示されます。

ロールバックセグメントは、トランザクションをロールバックするときに、元に戻すスペースに蓄積されたMVCC情報を使用する必要があります。それが成長の大部分が発生する場所です。 PerconaはJun 10, 2010でこれについて言及しました( 暴走したメインInnodbテーブルスペースの理由

私はこれについて前に話しました

UPDATE 2015-03-22 15:00 EDT

データディクショナリが原因であると確信している場合、これを確認できる確実な方法は1つだけです。

  • STEP 01)別のDBサーバーを取得(開発またはテスト)
  • STEP 02)MySQLをインストールします
  • STEP 03)mysqldumpスキーマのみ(--no-dataを使用)
  • STEP 04)スキーマのみのダンプを空のデータベースにロードします
  • STEP 05)実行ls -l /var/lib/mysql/ibdata1 | awk '{print $5}'

表示される数値は、現在のテーブルリストのデータディクショナリエントリのみで、データが含まれていないibdata1のサイズになります。

最後のコメント で、あなたは言った

したがって、オープントランザクションは正しい理由ではないようです。 (ETLツールを使用して)毎日200〜300のテーブルを作成し、定期的に処理した後(2〜3週間に2〜5 kのテーブルをいくつかドロップ)にそれらを削除するために、この属性を大きなファイルに使用できますか?

同じ理由で正しい可能性があります。ロールバックセグメントとUNDOスペースがOSの未使用のディスク領域を再利用するための準備をしていないのと同じように、テーブルを削除して新しいテーブルを作成することも、OSの未使用のディスク領域を再利用するための準備をしていません。

それを証明するには、すべてのテーブルを使用し、データを使用しない新しいサーバーを使用する必要があります。その後、毎週同じドロップとテーブルの作成を実行します。 ibdata1がそのためだけに大きくなる場合、テーブルの削除と作成だけで、innodb_file_per_tableを有効にしてibdata1を大きくできることは明らかです。

Ibdata1をクリーンアップする場合は、私の投稿を参照してください

GRY IT A TRY !!!

4
RolandoMySQLDBA

ローランドの答えに何か付け加えたい。 Mysql 5.6以降では、元に戻すログをib_data1。以下の実験をしてみました。新規インストールでは、システムテーブルスペース(ibdata1)そして、どのようにibdata1成長します。次に、大きなテーブルを作成し、1つのセッションでトランザクションを開きました。別のセッションで更新を発生させたので、この場合にUNDO表領域がどのように大きくなるかを確認しました。

たくさんのテーブルを作成する

マニュアルページは InnoDB Undoログを個別のテーブルスペースに保存する です。

最初に、次の行を.cnfに追加しました。

innodb-undo-tablespaces=2

Datadirを再作成し、システムのサイズをチェックして、テーブルスペースを元に戻しました。

$ mysql_instal_db --basedir=... --datadir --defaults-file=...
$ cd data       
$ du -h undo00* ib*
10M  undo001
10M  undo002
12M  ibdata1
48M  ib_logfile0
48M  ib_logfile1

新鮮な ibdata1(私の構成では)は約12Mです。次のような200000テーブルを作成する簡単なスクリプトを起動しました。

create table t_<xxx> (i int unsigned auto_increment, c char, d datetime, primary key(i) ) engine=innodb;

テーブル作成後のテーブルスペースのサイズは次のとおりです。

$ du -h undo00* ib*
10M  undo001
10M  undo002
141M ibdata1
48M  ib_logfile0
48M  ib_logfile1

200000テーブルは、129M未満です。次に、テーブルを削除して再作成しました。 ibdata1のサイズに違いはありません。

UNDOテーブルスペースの操作

実験を続けるために、テーブルを作成しましたsbtest1 sysbenchを使用して4000000行:

$ sysbench --test=<path>/update_index.lua --mysql-Host=... --mysql-port=... --mysql-user=... --mysql-password=... --oltp-table-size=4000000 prepare

$ du -h sbtest1.ibd
957M sbtest1.ibd

セッション1でトランザクションを開始しました。

session1> start transaction
...
session1> select * from sbtest limit 1;

select * from sbtest1 limit 1;
+----+---------+-----------------------+----------------------------+
| id | k       | c                     | pad                        |
+----+---------+-----------------------+----------------------------+
|  1 | 2006885 | 08566691963-88624.... | 63188288836-92351140030... |
+----+---------+-----------------------+----------------------------+
1 row in set (0.00 sec)

サイズは変わりません:

$ du -h ibdata1 undo00* ib_logfile*
141M    ibdata1
49M undo001
10M undo002
48M ib_logfile0
48M ib_logfile1

私は別のセッションを始めました:

session2> use information_schema;
...
session2> select trx_id, trx_rows_locked, trx_isolation_level from INNODB_TRX;
+---------+-----------------+---------------------+
| trx_id  | trx_rows_locked | trx_isolation_level |
+---------+-----------------+---------------------+
| 3714243 |               0 | REPEATABLE READ     |
+---------+-----------------+---------------------+
1 row in set (0.00 sec)

session2> use sbtest;
...
session2> update sbtest1 set k = k + 1;
Query OK, 4000000 rows affected (3 min 40.75 sec)
Rows matched: 4000000  Changed: 4000000  Warnings: 0

Ibdata1のサイズを確認すると、

$ du -h ibdata1 undo00* ib_logfile*
141M    ibdata1
209M    undo001
10M undo002
48M ib_logfile0
48M ib_logfile1

セッション1でトランザクションをコミットすると、undo001は縮小しません。

結論

開いているトランザクションにより、ibdata1ファイルが200000テーブルを超える可能性があります。これは非常に単純なテストであり、実稼働ワークロードによって大きく異なる可能性があることを知っています。

Mysql 5.7に興味がある場合は、取り消しテーブルスペースを切り捨てる可能性があります。マニュアルを参照してください。 取り消しテーブルスペースに存在する取り消しログの切り捨て

お役に立てば幸いです。

2
Giovanni