web-dev-qa-db-ja.com

innodb_file_per_tableが設定されている場合、ibdata1は指数関数的に増加します

InnoDB(innodb_file_per_tableを後で有効にした状態)でMySQL Clusterをインストールしましたが、innodb_file_per_tableに切り替えたため、ファイルibdata1が増加します(月あたり2GB)。

Is My my.cnfファイルは正しいですか?

なぜibdata1が非常に大きい(22GB)か

ibdata1の内容を確認するにはどうすればよいですか?

サーバー構成:

  • Debian 6 AMD64

  • mysql-client-5.1 5.1.61-0 + squeeze1

My InnoDB構成ファイル:

#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#

innodb_data_home_dir            = /var/lib/mysql
innodb_data_file_path           = ibdata1:10M:autoextend
innodb_log_group_home_dir       = /var/lib/mysql
innodb_file_per_table
innodb_buffer_pool_size         = 5G
innodb_additional_mem_pool_size = 48M
innodb_log_files_in_group       = 3
innodb_log_file_size            = 512M
innodb_log_buffer_size          = 8M
innodb_flush_log_at_trx_commit  = 0
innodb_lock_wait_timeout        = 50
innodb_thread_concurrency       = 15 
innodb_flush_method             = O_DIRECT

手順:

1) Dump All DB's
2) Stop MySQL
3) Add "innodb_file_per_table"
4) Delete all ib* file
5) Start MySQL
6) Import All DB's

InnoDB会議:

mysql> show variables like 'innodb%';
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index              | ON                     |
| innodb_additional_mem_pool_size         | 50331648               |
| innodb_autoextend_increment             | 8                      |
| innodb_autoinc_lock_mode                | 1                      |
| innodb_buffer_pool_size                 | 25165824000            |
| innodb_checksums                        | ON                     |
| innodb_commit_concurrency               | 0                      |
| innodb_concurrency_tickets              | 500                    |
| innodb_data_file_path                   | ibdata1:10M:autoextend |
| innodb_data_home_dir                    | /var/lib/mysql         |
| innodb_doublewrite                      | ON                     |
| innodb_fast_shutdown                    | 1                      |
| innodb_file_io_threads                  | 4                      |
| innodb_file_per_table                   | ON                     |
| innodb_flush_log_at_trx_commit          | 0                      |
| innodb_flush_method                     | O_DIRECT               |
| innodb_force_recovery                   | 0                      |
| innodb_lock_wait_timeout                | 50                     |
| innodb_locks_unsafe_for_binlog          | OFF                    |
| innodb_log_buffer_size                  | 8388608                |
| innodb_log_file_size                    | 536870912              |
| innodb_log_files_in_group               | 3                      |
| innodb_log_group_home_dir               | /var/lib/mysql         |
| innodb_max_dirty_pages_pct              | 90                     |
| innodb_max_purge_lag                    | 0                      |
| innodb_mirrored_log_groups              | 1                      |
| innodb_open_files                       | 300                    |
| innodb_rollback_on_timeout              | OFF                    |
| innodb_stats_method                     | nulls_equal            |
| innodb_stats_on_metadata                | ON                     |
| innodb_support_xa                       | ON                     |
| innodb_sync_spin_loops                  | 20                     |
| innodb_table_locks                      | ON                     |
| innodb_thread_concurrency               | 15                     |
| innodb_thread_sleep_delay               | 10000                  |
| innodb_use_legacy_cardinality_algorithm | ON                     |
+-----------------------------------------+------------------------+
4
Furo83

innodb_file_per_table が有効になっているにもかかわらず、ibdata1は引き続き増加する可能性があります。どうして ?

質問:InnoDBテーブルと連想インデックスが個々のテーブルスペースファイル(ファイル拡張子.ibd)に書き込まれる場合、どの情報をibdata1に書き込む必要がありますか?

回答:InnoDBのシステムテーブルスペースに書き込まれる以下の情報クラスがあります。

  • データ辞書
  • 二重書き込みバッファ
    • データの破損を防ぐセーフティネット
    • キャッシングのためのOSのバイパスを支援
  • バッファーの挿入(セカンダリインデックスへの変更を合理化)
  • ロールバックセグメント
  • ログを元に戻す
  • ここをクリックしてibdata1の図解をご覧ください

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

エピローグ

十分なトランザクションがある場合、REPEATABLE READをサポートするためのロールバックセグメントとログの取り消しにより、ibdata1が大きくなる可能性があります。セカンダリインデックスを持つInnoDBテーブルへのINSERTおよびUPDATEは、挿入バッファに蓄積される可能性があります。二重書き込みバッファは、mysqldの起動時にクラッシュが発生し、その後クラッシュが発生した場合に、第2レベルのデータ冗長性を提供します。成長できないのはデータディクショナリだけです(新しいInnoDBテーブルを作成するDDLステートメントがない場合)。

7
RolandoMySQLDBA

Ibdata1ファイルを膨らませる可能性があるため、長時間実行されているトランザクションのinnodbステータスを確認します。しばらく実行せずにinnodb_file_per_tableに変更した場合、既存のテーブルはおそらくそこにまだ書き込みます。 innodb_file_per_tableは、1。ダンプしてリロードし、2。no-opを変更しない限り、引き続きグローバルテーブルスペースに書き込みます。構成変更後に作成された新しいテーブルには、独自のテーブルスペースがあります。

1
eroomydna

Mysql 5.7では、元に戻すログを別のファイルに移動することを検討できます。 http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_undo_logs

また、必要に応じてこれらのログを切り捨てるオプションも提供されます。 https://dev.mysql.com/doc/refman/5.7/en/truncate-undo-tablespace.html

My.cnfでは、この設定で問題が解決するはずです。

innodb_undo_tablespaces=2

残念ながら、この設定はmysqlの新規インストールでのみ使用できるようです。この設定でサーバーを再起動するだけではできません。再起動するとエラーが発生します。ただし、おそらくibdata1ファイルも圧縮する必要があるため、とにかくフルダンプが必要になります。

0
Haluk