InnoDB表优化没有锁定表

问题描述:

如果我在一段时间后重新包装表(ALTER TABLE foo ENGINE = INNODB),或者在大量INSERT/UPDATE之后重新包装表, /删除操作。我不知道这是因为指示等被重建,还是压缩了表空间或其他东西?InnoDB表优化没有锁定表

这令我做的事情 ALTER TABLE FOO ENGINE = INNODB应该是常规表维护的一部分,然而利用优化或者改变锁定这是不可接受的表,是有做了一个好办法一个数据库服务器(意味着没有故障转移到另一个实例)没有锁定整个表?

更新:使用Percona的5.5.17-55

更新:SHOW VARIABLES LIKE '%的InnoDB';

+----------------------------------------+------------------------+ 
| Variable_name       | Value     | 
+----------------------------------------+------------------------+ 
| innodb_adaptive_checkpoint    | estimate    | 
| innodb_adaptive_flushing    | OFF     | 
| innodb_adaptive_hash_index    | ON      | 
| innodb_additional_mem_pool_size  | 8388608    | 
| innodb_auto_lru_dump     | 120     | 
| innodb_autoextend_increment   | 8      | 
| innodb_autoinc_lock_mode    | 1      | 
| innodb_buffer_pool_shm_checksum  | ON      | 
| innodb_buffer_pool_shm_key    | 0      | 
| innodb_buffer_pool_size    | 30064771072   | 
| innodb_change_buffering    | inserts    | 
| innodb_checkpoint_age_target   | 0      | 
| innodb_checksums      | ON      | 
| innodb_commit_concurrency    | 0      | 
| innodb_concurrency_tickets    | 500     | 
| innodb_data_file_path     | ibdata1:10M:autoextend | 
| innodb_data_home_dir     |      | 
| innodb_dict_size_limit     | 0      | 
| innodb_doublewrite      | ON      | 
| innodb_doublewrite_file    |      | 
| innodb_enable_unsafe_group_commit  | 0      | 
| innodb_expand_import     | 0      | 
| innodb_extra_rsegments     | 0      | 
| innodb_extra_undoslots     | OFF     | 
| innodb_fast_checksum     | OFF     | 
| innodb_fast_recovery     | OFF     | 
| innodb_fast_shutdown     | 1      | 
| innodb_file_format      | Antelope    | 
| innodb_file_format_check    | Barracuda    | 
| innodb_file_per_table     | ON      | 
| innodb_flush_log_at_trx_commit   | 0      | 
| innodb_flush_log_at_trx_commit_session | 3      | 
| innodb_flush_method     | O_DIRECT    | 
| innodb_flush_neighbor_pages   | 1      | 
| innodb_force_recovery     | 0      | 
| innodb_ibuf_accel_rate     | 100     | 
| innodb_ibuf_active_contract   | 1      | 
| innodb_ibuf_max_size     | 15032369152   | 
| innodb_io_capacity      | 200     | 
| innodb_lazy_drop_table     | 0      | 
| innodb_lock_wait_timeout    | 50      | 
| innodb_locks_unsafe_for_binlog   | OFF     | 
| innodb_log_block_size     | 512     | 
| innodb_log_buffer_size     | 67108864    | 
| innodb_log_file_size     | 402653184    | 
| innodb_log_files_in_group    | 2      | 
| innodb_log_group_home_dir    | ./      | 
| innodb_max_dirty_pages_pct    | 75      | 
| innodb_max_purge_lag     | 0      | 
| innodb_mirrored_log_groups    | 1      | 
| innodb_old_blocks_pct     | 37      | 
| innodb_old_blocks_time     | 0      | 
| innodb_open_files      | 300     | 
| innodb_overwrite_relay_log_info  | OFF     | 
| innodb_page_size      | 16384     | 
| innodb_pass_corrupt_table    | 0      | 
| innodb_read_ahead      | linear     | 
| innodb_read_ahead_threshold   | 56      | 
| innodb_read_io_threads     | 4      | 
| innodb_recovery_stats     | OFF     | 
| innodb_replication_delay    | 0      | 
| innodb_rollback_on_timeout    | OFF     | 
| innodb_show_locks_held     | 10      | 
| innodb_show_verbose_locks    | 0      | 
| innodb_spin_wait_delay     | 6      | 
| innodb_stats_auto_update    | 1      | 
| innodb_stats_method     | nulls_equal   | 
| innodb_stats_on_metadata    | ON      | 
| innodb_stats_sample_pages    | 8      | 
| innodb_stats_update_need_lock   | 1      | 
| innodb_strict_mode      | OFF     | 
| innodb_support_xa      | ON      | 
| innodb_sync_spin_loops     | 30      | 
| innodb_table_locks      | ON      | 
| innodb_thread_concurrency    | 8      | 
| innodb_thread_concurrency_timer_based | OFF     | 
| innodb_thread_sleep_delay    | 10000     | 
| innodb_use_purge_thread    | 1      | 
| innodb_use_sys_malloc     | ON      | 
| innodb_use_sys_stats_table    | OFF     | 
| innodb_version       | 1.0.16-12.8   | 
| innodb_write_io_threads    | 4      | 
+----------------------------------------+------------------------+ 
+0

你正在使用什么版本的MySQL? – RolandoMySQLDBA 2012-04-03 17:32:06

+0

更新的问题包括MySQL版本 – Jeremy 2012-04-03 19:52:10

+0

请将此添加到您的问题:SHOW VARIABLES LIKE'innodb%';' – RolandoMySQLDBA 2012-04-03 20:05:00

你不能改变或优化表,而将其锁定。但是,使用Percona Toolkit的pt-online-schema-change工具(免责声明:我的雇主),您可以做到这一点,并且工作得非常好。优化表,只需使用这样的事情:

pt-online-schema-change <options> --alter='ENGINE=InnoDB' 

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

+0

为了清楚起见,我更新了问题。我会研究pt-online-schema-change,谢谢。 – Jeremy 2012-04-04 15:58:16

+0

正是我在找什么,谢谢。 – Jeremy 2012-04-05 18:18:54

+0

阅读文档,我不会在InnoDB表中使用这个工具(全部使用外键)。检查http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html#cmdoption-pt-online-schema-change--alter-foreign-keys-method – 2013-11-05 15:32:09

基本上,你正在做一个OPTIMIZE在桌子上。对于InnoDB表,OPTIMIZE映射到ALTER TABLE。从MySQL手册引用:

对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE,它重建表来更新索引统计信息并释放聚集索引中未使用的空间。

当删除1/2表时,OPTIMIZE后是一个真正的好主意。

我会提出一个改善性能的建议。看到您在配置中支持新文件格式BARRACUDA,您应该使用它。启用它是很容易,只需添加在您的my.cnf

innodb_file​_format=Barracuda 

重新启动服务器,然后改变你的表来使用新的可用ROW_FORMAT = COMPRESSED:使用压缩行时

ALTER TABLE x ROW_FORMAT=COMPRESSED; 

从个人的经验,格式,表格大小减少到一半,对性能也有显着的积极影响。

欲了解更多详情请尝试通过量:

http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html

http://www.mysqlperformanceblog.com/2008/04/23/testing-innodb-barracuda-format-with-compression/

+0

使用新文件格式或行压缩是否有缺点? – Jeremy 2012-04-04 15:59:35

+0

CPU使用率应该有小幅增加,但是我所见过的所有测试都表明没有负面影响。旧格式“Antelope”保留为默认值,主要用于与旧版MySQL兼容。新的Barracuda文件格式很可能成为下一个主要MySQL版本的默认文件格式。 – capi 2012-04-05 12:12:54

+0

根据我的经验,启用压缩行格式只有在您的平均行长足够大的情况下才有意义(使用SHOW TABLE STATUS LIKE'table_name''来检查),并且至少有一个文本字段含有较长的内容。 – 2015-07-20 17:02:19

从MySQL 5.6.17,MySQL的默认支持InnoDB表的在线优化。