6 mysql innodb myisam replication
我们的复制从站在运行相对简单的插入时生成了大约 300GB 的临时文件。
我们的设置:
大师:5.0.45-0.sles10.x86_64,
从站:5.0.85-win32,也试过 5.1.57-win64,同样的数据库
从机配置:
MAX_CONNECTIONS = 100
query_cache_size变量= 1M
的table_cache = 2048
tmp_table_size的= 32M
thread_cache_size的= 8
binlog_cache_size = 10M
myisam_max_sort_file_size = 100G
myisam_sort_buffer_size = 69M
的key_buffer_size = 55M
read_buffer_size = 64K
read_rnd_buffer_size = 256K
sort_buffer_size的值= 8M
innodb_additional_mem_pool_size = 16M
的innodb_flush_log_at_trx_commit = 0
innodb_log_buffer_size = 16M
innodb_buffer_pool_size = 512M
innodb_thread_concurrency参数= 10
datadir=D:\MySQLrepl\
innodb_data_home_dir=D:\MySQLrepl\
innodb_data_file_path中= ibdata1中:33266M; ibdata2:31484M; ibdata3:52988M; ibdata4:123492M; ibdata5:100M:自动扩展
innodb_log_group_home_dir = d:\ MySQLrepl \
innodb_log_files_in_group = 2
innodb_log_file_size = 128M
登录斌= MySQL的宾
数据库信息:
~360 GB 总数据大小
~50 GB 受影响数据库的数据大小,其余在不同的数据库
中 所有表的存储引擎是 innoDB
数据库已转移到从属 MySQL Enterprise Backup 3.5.2
sernumbers_results 包含约 3.17 亿行,大小为大约 17,7 GB,rowid 是主键。
产生问题的查询之一:
INSERT INTO sernumbers_results_2009 SELECT * FROM sernumbers_results WHERE rowid>(SELECT rowid FROM sernumbers_results_2009 order by rowid desc limit 1) ORDER BY rowid LIMIT 10000
这应该做的,按照我同事的逻辑,是将2009年的结果一点一点地复制到单独的表中。他对此有一个很好的借口,他是法国人 ;)
他还说在服务器上运行插入查询很快,而且确实:该查询的 SELECT 部分在 0.18 秒内运行没有任何问题,所以似乎有插入位有问题。在应用查询之前,似乎所有数据库都转换为临时 MyISAM 表。似乎也几乎没有反向转换,因为当之前的临时表达到其最大大小时,服务器几乎立即开始使用下一个临时表。
我在这里真的一无所知,因此非常感谢任何帮助或建议。
从算法上来说,它就是按照你的同事所说的去做。但是,你看到它在做什么吗???
在遍历 InnoDB 内部索引中的 3.17 亿行后,它生成 10,000 个临时表,每个临时表包含 1 行。每个临时表都是 sernumbers_results_2009 表中 rowid 的完整重新生成,并在内部执行 handler_read_prev 命令,通过从内部 rowid 索引后面开始的索引扫描对数据进行排序。另外,请记住您正在处理 InnoDB。谁知道多版本控制(通过 MVCC)正在发生什么,以便 INSERT 在没有干扰的情况下完成并具有回滚功能。
这个查询有什么原因对你不起作用吗???
INSERT INTO sernumbers_results_2009
SELECT * FROM sernumbers_results
ORDER BY rowid DESC LIMIT 10000;
Run Code Online (Sandbox Code Playgroud)
这肯定会生成一个临时表。
试一试 !!!