すべてのテーブルを含むMySQLデータベースをInnoDBとしてfile_per_table構成をオンにしています。しかし、それでも巨大なibdataファイル(〜50GB)が表示されます。すべてのテーブルにも.ibdファイルがあります。これは私がダンプを取ってロードすることで作成したマシンです。これの理由は何ですか。
おそらく、大きなトランザクションがたくさんあるか、本当に大きなトランザクションが1つあるでしょう。
Vadim TkachenkoのInnoDBの図解表現をご覧ください
システムテーブル(ibdata1)の内部を見ると、ロールバックセグメントと元に戻すログが表示されます。
ロールバックセグメントは、トランザクションをロールバックするときに、元に戻すスペースに蓄積されたMVCC情報を使用する必要があります。それが成長の大部分が発生する場所です。 PerconaはJun 10, 2010
でこれについて言及しました( 暴走したメインInnodbテーブルスペースの理由 )
私はこれについて前に話しました
Apr 23, 2013
: innodb_file_per_tableが設定されている場合でも、Innodb ibdata1ファイルを5倍に拡張するにはどうすればよいですか?Mar 31, 2014
: テーブルがいっぱいであるために失敗した1つのクエリの後で、mysqlディレクトリが246Gに増加しますJun 16, 2014
: テーブルでのMySQLインデックス作成の失敗がいっぱいですデータディクショナリが原因であると確信している場合、これを確認できる確実な方法は1つだけです。
--no-data
を使用)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をクリーンアップする場合は、私の投稿を参照してください
Sep 26, 2012
: すべてのデータベースをダンプせずにinnodbファイルibdata1を縮小するにはどうすればよいですか? (すべてのデータをダンプし、ibdatat1を削除して、新しいibdata1を作成する必要がある理由)Oct 29, 2010
: 方法:mysql InnoDBストレージエンジンをクリーンアップしますか? (実際にこれを行う方法について)GRY IT A TRY !!!
ローランドの答えに何か付け加えたい。 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のサイズに違いはありません。
実験を続けるために、テーブルを作成しました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に興味がある場合は、取り消しテーブルスペースを切り捨てる可能性があります。マニュアルを参照してください。 取り消しテーブルスペースに存在する取り消しログの切り捨て
お役に立てば幸いです。