InnoDB(innodb_file_per_tableを後で有効にした状態)でMySQL Clusterをインストールしましたが、innodb_file_per_tableに切り替えたため、ファイルibdata1が増加します(月あたり2GB)。
my.cnf
ファイルは正しいですか?サーバー構成:
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 |
+-----------------------------------------+------------------------+
innodb_file_per_table が有効になっているにもかかわらず、ibdata1は引き続き増加する可能性があります。どうして ?
質問:InnoDBテーブルと連想インデックスが個々のテーブルスペースファイル(ファイル拡張子.ibd
)に書き込まれる場合、どの情報をibdata1
に書き込む必要がありますか?
回答:InnoDBのシステムテーブルスペースに書き込まれる以下の情報クラスがあります。
ibdata1
の図解をご覧ください私はこれについて前に話しました:
Dec 09, 2011
: mysqlでibdataのサイズを削減する最良の方法は何ですか?Apr 01, 2012
: innodb_file_per_tableは推奨ですか?Mar 25, 2012
: なぜInnoDBはすべてのデータベースを1つのファイルに格納するのですか?十分なトランザクションがある場合、REPEATABLE READをサポートするためのロールバックセグメントとログの取り消しにより、ibdata1が大きくなる可能性があります。セカンダリインデックスを持つInnoDBテーブルへのINSERTおよびUPDATEは、挿入バッファに蓄積される可能性があります。二重書き込みバッファは、mysqldの起動時にクラッシュが発生し、その後クラッシュが発生した場合に、第2レベルのデータ冗長性を提供します。成長できないのはデータディクショナリだけです(新しいInnoDBテーブルを作成するDDLステートメントがない場合)。
Ibdata1ファイルを膨らませる可能性があるため、長時間実行されているトランザクションのinnodbステータスを確認します。しばらく実行せずにinnodb_file_per_tableに変更した場合、既存のテーブルはおそらくそこにまだ書き込みます。 innodb_file_per_tableは、1。ダンプしてリロードし、2。no-opを変更しない限り、引き続きグローバルテーブルスペースに書き込みます。構成変更後に作成された新しいテーブルには、独自のテーブルスペースがあります。
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ファイルも圧縮する必要があるため、とにかくフルダンプが必要になります。