配置 innodb_file_per_table 时,ibdata1 呈指数增长

Fur*_*o83 4 mysql innodb ibdata

我已经安装了一个带有 InnoDB 的 MySQL 集群(随后启用了 innodb_file_per_table),但是由于我切换到 innodb_file_per_table,文件 ibdata1 增长(每月 2GB)。

我的my.cnf文件是否正确?

为什么我的 ibdata1 这么大(22GB)?

我如何查看 ibdata1 中有什么?

服务器配置:

  • Debian 6 amd64

  • mysql-client-5.1 5.1.61-0+squeeze1

我的 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
Run Code Online (Sandbox Code Playgroud)

程序:

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
Run Code Online (Sandbox Code Playgroud)

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                     |
+-----------------------------------------+------------------------+
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 8

尽管启用了innodb_file_per_table,ibdata1 仍然可以增长。为什么 ?

问题:如果将 InnoDB 表和关联索引写入单个表空间文件(文件扩展名.ibd),还需要写入哪些信息ibdata1

答:以下是写入 InnoDB 系统表空间的信息类:

  • 数据字典
  • 双写缓冲区
    • 防止数据损坏的安全网
    • 帮助绕过操作系统进行缓存
  • 插入缓冲区(简化对二级索引的更改)
  • 回滚段
  • 撤消日志
  • 单击此处查看图示 ibdata1

我之前讨论过这个:

结语

给定足够的事务,回滚段和撤消日志以支持可重复读取可以使 ibdata1 增长。对具有二级索引的 InnoDB 表的 INSERT 和 UPDATE 可以堆积在插入缓冲区中。双写缓冲区在mysqld启动时发生崩溃和随后的崩溃恢复时提供第二级数据冗余。唯一永远不会增长的是数据字典(除非你有 DDL 语句来创建新的 InnoDB 表)。