我最近移动了一个脚本,开始从不同服务器/数据库上的相同数据运行查询。两台服务器都加载了相同的数据,但其中一台正在退出当天数据的实时加载。以前的服务器运行的是mysql 5.1.73,这个新服务器正在运行MariaDB 10.1。该脚本试图运行以下查询,只更改日期(我已经混淆了一些列和数据过滤器,但在查询中保持col_X一致)。
SELECT
count(*) as num,
sec_to_time(floor(timestamp/1000000)) as true_time,
col_A,col_B,col_C,col_D,col_E,col_F,col_G,id,
sum(if(col_H = 3, 1, 0)) as num_A,
sum(if(col_H = 4,1,0)) as num_B
FROM
`some_table` WHERE
`some_table`.`date` = 20170622 AND
(col_I not in ('VAL_A','VAL_B','VAL_C'))
GROUP BY col_A, col_D, coL_E, col_F, col_B, col_C,
sec_to_time(floor(timestamp/1000000))
HAVING count(*) >= if(col_G='A',50,if(col_G='B',50,150))
ORDER BY sec_to_time(floor(timestamp/1000000));
在新服务器上,查询运行一段时间后我收到此消息: ERROR 1114(HY000):表'/ home / mysql / tmp / #sql_61c5_0'已满
在查询运行时,在该目录中,我看到2个文件在发生此消息之前大小增加到大约1.2GB。我经历了很多变数,发现从旧服务器到新服务器没有任何不同。第一个似乎提到的是tmp_table_size和max_heap_table_size,它们在旧服务器和新服务器上都默认为16MB,但我还是尝试过。
磁盘未满,但它们是较小的分区:
Filesystem Size Used Avail Use% Mounted on
/dev/md125 400G 247G 154G 62% /home
/dev/nvme0n1p1 373G 214G 160G 58% /mnt/nvme
(注意/ home / mysql是/ mnt / nvme / mysql的符号链接,其中包含mysql表和& tmp目录)。
这些是/etc/my.cnf中设置的唯一mysql变量:
[mysqld]
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_buffer_pool_size = 25G
innodb_log_file_size = 768M
max_allowed_packet = 104857600
innodb_file_per_table = 1
max_heap_table_size = 134217728
tmp_table_size = 134217728
对于记录,新服务器正在运行CentOS 7,但我找不到任何可能导致此问题的操作系统限制。任何关于为什么会发生这种情况的提示都将不胜感激。