Skip to content
Permalink
Browse files
Added tmp_disk_table_size to limit size of Aria temp tables in tmpdir
- Added variable tmp_disk_table_size
- Added variable tmp_memory_table_size as an alias for tmp_table_size
- Changed internal variable tmp_table_size to tmp_memory_table_size
- create_info.data_file_length is now set with tmp_disk_table_size
- Fixed that Aria doesn't reset max_data_file_length for internal tables
- Added status flag if table is full so that we can detect this on next insert.
  This ensures that the table is always 'correct', but we get the error one
  row after the row that grow the table too big.
- Removed some mutex lock for internal temporary tables
  • Loading branch information
montywi committed Jun 30, 2017
1 parent 9f484b6 commit dd8474b
Show file tree
Hide file tree
Showing 18 changed files with 882 additions and 35 deletions.
@@ -1146,9 +1146,17 @@ The following options may be given as the first argument:
--time-format=name The TIME format (ignored)
--timed-mutexes Specify whether to time mutexes. Deprecated, has no
effect.
--tmp-table-size=# If an internal in-memory temporary table exceeds this
--tmp-disk-table-size=#
Max size for data for an internal temporary on-disk
MyISAM or Aria table.
--tmp-memory-table-size=#
If an internal in-memory temporary table exceeds this
size, MySQL will automatically convert it to an on-disk
MyISAM or Aria table
MyISAM or Aria table. Same as tmp_table_size.
--tmp-table-size=# Alias for tmp_memory_table_size. If an internal in-memory
temporary table exceeds this size, MySQL will
automatically convert it to an on-disk MyISAM or Aria
table.
-t, --tmpdir=name Path for temporary files. Several paths may be specified,
separated by a colon (:), in this case they are used in a
round-robin fashion
@@ -1499,6 +1507,8 @@ thread-pool-stall-limit 500
thread-stack 299008
time-format %H:%i:%s
timed-mutexes FALSE
tmp-disk-table-size 18446744073709551615
tmp-memory-table-size 16777216
tmp-table-size 16777216
transaction-alloc-block-size 8192
transaction-isolation REPEATABLE-READ
@@ -4951,14 +4951,42 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TMP_DISK_TABLE_SIZE
SESSION_VALUE 18446744073709551615
GLOBAL_VALUE 18446744073709551615
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 18446744073709551615
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table.
NUMERIC_MIN_VALUE 1024
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TMP_MEMORY_TABLE_SIZE
SESSION_VALUE 16777216
GLOBAL_VALUE 16777216
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 16777216
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size.
NUMERIC_MIN_VALUE 1024
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TMP_TABLE_SIZE
SESSION_VALUE 16777216
GLOBAL_VALUE 16777216
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 16777216
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table
VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table.
NUMERIC_MIN_VALUE 1024
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1
@@ -0,0 +1,146 @@
SET @start_global_value = @@global.tmp_disk_table_size;
SET @start_session_value = @@session.tmp_disk_table_size;
'#--------------------FN_DYNVARS_005_01-------------------------#'
SET @@global.tmp_disk_table_size = 100;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '100'
SET @@global.tmp_disk_table_size = DEFAULT;
SET @@session.tmp_disk_table_size = 200;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '200'
SET @@session.tmp_disk_table_size = DEFAULT;
'#--------------------FN_DYNVARS_005_02-------------------------#'
SELECT @@global.tmp_disk_table_size >= 16777216;
@@global.tmp_disk_table_size >= 16777216
1
SELECT @@session.tmp_disk_table_size >= 16777216;
@@session.tmp_disk_table_size >= 16777216
1
'#--------------------FN_DYNVARS_005_03-------------------------#'
SET @@global.tmp_disk_table_size = 1024;
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = 60020;
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
60020
SET @@global.tmp_disk_table_size = 4294967295;
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
4294967295
'#--------------------FN_DYNVARS_005_04-------------------------#'
SET @@session.tmp_disk_table_size = 1024;
SELECT @@session.tmp_disk_table_size;
@@session.tmp_disk_table_size
1024
SET @@session.tmp_disk_table_size = 4294967295;
SELECT @@session.tmp_disk_table_size;
@@session.tmp_disk_table_size
4294967295
SET @@session.tmp_disk_table_size = 65535;
SELECT @@session.tmp_disk_table_size;
@@session.tmp_disk_table_size
65535
'#------------------FN_DYNVARS_005_05-----------------------#'
SET @@global.tmp_disk_table_size = 0;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '0'
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = -1024;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '-1024'
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = 1000;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '1000'
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = ON;
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@global.tmp_disk_table_size = OFF;
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@global.tmp_disk_table_size = True;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '1'
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = False;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '0'
SELECT @@global.tmp_disk_table_size;
@@global.tmp_disk_table_size
1024
SET @@global.tmp_disk_table_size = 65530.34;
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@global.tmp_disk_table_size ="Test";
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@session.tmp_disk_table_size = ON;
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@session.tmp_disk_table_size = OFF;
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@session.tmp_disk_table_size = True;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '1'
SELECT @@session.tmp_disk_table_size;
@@session.tmp_disk_table_size
1024
SET @@session.tmp_disk_table_size = False;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '0'
SELECT @@session.tmp_disk_table_size;
@@session.tmp_disk_table_size
1024
SET @@session.tmp_disk_table_size = "Test";
ERROR 42000: Incorrect argument type to variable 'tmp_disk_table_size'
SET @@session.tmp_disk_table_size = 12345678901;
SELECT @@session.tmp_disk_table_size IN (12345678901,4294967295);
@@session.tmp_disk_table_size IN (12345678901,4294967295)
1
'#------------------FN_DYNVARS_005_06-----------------------#'
SELECT @@global.tmp_disk_table_size = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='tmp_disk_table_size';
@@global.tmp_disk_table_size = VARIABLE_VALUE
1
'#------------------FN_DYNVARS_005_07-----------------------#'
SELECT @@session.tmp_disk_table_size = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
WHERE VARIABLE_NAME='tmp_disk_table_size';
@@session.tmp_disk_table_size = VARIABLE_VALUE
1
'#---------------------FN_DYNVARS_001_09----------------------#'
SET @@global.tmp_disk_table_size = 1024;
SET @@tmp_disk_table_size = 4294967295;
SELECT @@tmp_disk_table_size = @@global.tmp_disk_table_size;
@@tmp_disk_table_size = @@global.tmp_disk_table_size
0
'#---------------------FN_DYNVARS_001_10----------------------#'
SET @@tmp_disk_table_size = 100;
Warnings:
Warning 1292 Truncated incorrect tmp_disk_table_size value: '100'
SELECT @@tmp_disk_table_size = @@local.tmp_disk_table_size;
@@tmp_disk_table_size = @@local.tmp_disk_table_size
1
SELECT @@local.tmp_disk_table_size = @@session.tmp_disk_table_size;
@@local.tmp_disk_table_size = @@session.tmp_disk_table_size
1
'#---------------------FN_DYNVARS_001_11----------------------#'
SET tmp_disk_table_size = 1027;
SELECT @@tmp_disk_table_size;
@@tmp_disk_table_size
1027
SELECT local.tmp_disk_table_size;
ERROR 42S02: Unknown table 'local' in field list
SELECT global.tmp_disk_table_size;
ERROR 42S02: Unknown table 'global' in field list
SELECT tmp_disk_table_size = @@session.tmp_disk_table_size;
ERROR 42S22: Unknown column 'tmp_disk_table_size' in 'field list'
SET @@global.tmp_disk_table_size = @start_global_value;
SET @@session.tmp_disk_table_size = @start_session_value;
@@ -0,0 +1,25 @@

"Ensure that we get an error if we exceed tmp_disk_table_size"

SET @start_tmp_memory_table_size=@@session.tmp_memory_table_size;
SET @start_tmp_disk_table_size=@@session.tmp_disk_table_size;
set @@session.tmp_memory_table_size=1000;
Warnings:
Warning 1292 Truncated incorrect tmp_memory_table_size value: '1000'
set @@session.tmp_disk_table_size=3000000;
create table t1 (a int primary key, b varchar(2000));
insert into t1 select seq,repeat(char(mod(seq,62)+64),seq) from seq_1_to_2000;
insert into t1 values (20000,"A");
select count(*) as c from t1 group by b having c>1;
c
2
show status like "created_tmp_disk%";
Variable_name Value
Created_tmp_disk_tables 1
set @@session.tmp_disk_table_size=1000000;
select count(*) as c from t1 group by b having c>1;
ERROR HY000: The table '#sql_xxx' is full
show status like "created_tmp_disk%";
Variable_name Value
Created_tmp_disk_tables 2
drop table t1;

0 comments on commit dd8474b

Please sign in to comment.