##################################################################################### # Test for autoscaling based on innodb_dedicated_server variable. # # # # # # This test checks autoscaling of following variables based on value of # # innodb_dedicated_server option # # - innodb_buffer_pool_size # # - innodb_log_file_size # # - innodb_log_files_in_group # # - innodb_flush_method # # # # This test also does basic testing for new variable innodb_dedicated_server # # This test is diabled on Solaris and Wndows as they dont support O_DIRECT_NO_FSYNC # ##################################################################################### # Make sure to run only on Linux --source include/linux.inc # Make sure this test is not run on PB2 machines --source include/is_local_machine.inc # This test takes long time, so only run it with the --big-test mtr-flag. --source include/big_test.inc # Make sure that there are no other tests running in parallel --source include/not_parallel.inc ############################################################################## # Autoscaling is done as per below formula: # # innodb_buffer_pool_size # # server_memory < 1G ? 128M (same as current default) # # server_memory <= 4G ? server_memory * 0.5 # # server_memory > 4G ? server_memory * 0.75 # # # # innodb_log_file_size # # buf_pool_size < 1G ? 48M (same as current default) # # buf_pool_size < 8G ? 512M # # buf_pool_size <= 128G ? 1024M # # buf_pool_size > 128G ? 2048M # # # # innodb_log_files_in_group # # buf_pool_size < 1G ? 2 (same as current default) # # buf_pool_size < 8G ? ROUND(buf_pool_size/GB) # # buf_pool_size <= 128G ? ROUND(buf_pool_size/GB * 0.75) # # buf_pool_size > 128G ? 64 # # # # Following Perl module calculates server memory and evaluates # # innodb_buffer_pool_size and # # innodb_log_file_size # # innodb_log_files_in_group # # based on above formula. # # # # NOTE : Memory considered here is in Kilo bytes # ############################################################################## perl; use Sys::MemInfo qw(totalmem freemem totalswap); my $dir = $ENV{'MYSQLTEST_VARDIR'}; $total_mem=&totalmem/1024; my $filename="$dir/tmpfile.txt"; open(my $fh, '>', $filename) or die "Could not open file '$filename' $!"; print $fh "let \$total_mem = $total_mem\; \n"; close $fh; EOF # Perl module ends --source $MYSQLTEST_VARDIR/tmpfile.txt --let $mem_size1K = 1024 --let $mem_size1G = 1048576 --let $mem_size4G = 4194304 --let $mem_size8G = 8388608 --let $mem_size128G = 134217728 --let $zero_point_five = 0.5 --let $zero_point_seven_five = 0.75 # Set buffer pool size. # Note: As MTR doesn't have 'else', following sequence of 'if' is important if ($total_mem > $mem_size4G) { --expr $calculated_buffer_pool_size = $total_mem * $zero_point_seven_five } if ($total_mem <= $mem_size4G) { --expr $calculated_buffer_pool_size = $total_mem * $zero_point_five } if ($total_mem < $mem_size1G) { --let $calculated_buffer_pool_size = 131072 } --disable_query_log call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Resizing redo log"); call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Starting to delete and rewrite log files."); call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* New log files created"); call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored "); call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* No argument was provided to --log-bin, and --log-bin-index was not used"); --enable_query_log --echo --echo ########################################### --echo # INITIAL START # --echo # innodb_dedicated_server = OFF # --echo # innodb_buffer_pool_size = default # --echo # innodb_log_file_size = default # --echo # innodb_log_files_in_group = default # --echo # innodb_flush_method = default # --echo ########################################### --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_buffer_pool_size'; SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_file_size'; SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_files_in_group'; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo --echo ########################################### --echo # RESTART 1 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = autoscaled # --echo # innodb_log_file_size = autoscaled # --echo # innodb_log_files_in_group = autoscaled # --echo # innodb_flush_method = autoscaled # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON; let $explicit_default_counter=100000; --source include/restart_mysqld.inc ############################################################################### # Get expected values of Buffer pool size and Log file size # ############################################################################### # Note: If calculated value of innodb_buffer_pool_size evaluates to a value # # that is not equal to or a multiple of # # innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances, # # then innodb_buffer_pool_size is automatically adjusted to a value that is # # equal to or a multiple of # # innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances # # that is not less than the specified buffer pool size. # ############################################################################### --disable_query_log set @innodb_chunk_instance_product = ROUND(@@global.innodb_buffer_pool_chunk_size/1024,2) * @@global.innodb_buffer_pool_instances; let $expected_innodb_buffer_pool_size = `select ROUND(CEIL($calculated_buffer_pool_size/@innodb_chunk_instance_product) * @innodb_chunk_instance_product)`; # Set log_file_size and log_files_in_group now after buffer_pool_size has been decided. # Note: As MTR doesn't have 'else', following sequence of 'if' is important if ($expected_innodb_buffer_pool_size > $mem_size128G) { --let $calculated_log_file_size = 2097152 --let $calculated_log_files_in_group = 64 } if ($expected_innodb_buffer_pool_size <= $mem_size128G) { --let $calculated_log_file_size = 1048576 --let $calculated_log_files_in_group = `SELECT ROUND($expected_innodb_buffer_pool_size*$zero_point_seven_five/$mem_size1G,0)` } if ($expected_innodb_buffer_pool_size <= $mem_size8G) { --let $calculated_log_file_size = 524288 --let $calculated_log_files_in_group = `SELECT ROUND($expected_innodb_buffer_pool_size/($mem_size1K * $mem_size1K),0)` } if ($expected_innodb_buffer_pool_size < $mem_size1G) { --let $calculated_log_file_size = 49152; --let $calculated_log_files_in_group = 2; } let $expected_innodb_log_file_size = `select $calculated_log_file_size`; let $expected_innodb_log_files_in_group = `select $calculated_log_files_in_group`; --enable_query_log --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; let $actual_innodb_buffer_pool_size = `select ROUND(@@global.innodb_buffer_pool_size/1024,2)`; --disable_result_log eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result; --enable_result_log --echo 1 expected select @final_pool_size_result; let $actual_innodb_log_file_size = `select ROUND(@@global.innodb_log_file_size/1024,2)`; --disable_result_log eval select ROUND($expected_innodb_log_file_size,2) = $actual_innodb_log_file_size into @final_log_file_size_result; --enable_result_log --echo 1 expected select @final_log_file_size_result; let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`; --disable_result_log eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result; --enable_result_log --echo 1 expected select @final_log_files_in_group_result; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo --echo ########################################### --echo # RESTART 2 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = explicit # --echo # innodb_log_file_size = autoscaled # --echo # innodb_log_files_in_group = autoscaled # --echo # innodb_flush_method = autoscaled # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_buffer_pool_size=256M; let $explicit_default_counter=100000; --source include/restart_mysqld.inc --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_buffer_pool_size'; let $actual_innodb_log_file_size = `select ROUND(@@global.innodb_log_file_size/1024,2)`; --disable_result_log eval select $expected_innodb_log_file_size = $actual_innodb_log_file_size into @final_log_file_size_result; --enable_result_log --echo 1 expected select @final_log_file_size_result; let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`; --disable_result_log eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result; --enable_result_log --echo 1 expected select @final_log_files_in_group_result; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo # Make sure that the warnings are present in server log. let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_FILE= $server_log; let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_buffer_pool_size; --source include/search_pattern.inc --echo --echo ########################################### --echo # RESTART 3 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = autoscaled # --echo # innodb_log_file_size = explicit # --echo # innodb_log_files_in_group = autoscaled # --echo # innodb_flush_method = autoscaled # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_log_file_size=50M; let $explicit_default_counter=100000; --source include/restart_mysqld.inc --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; let $actual_innodb_buffer_pool_size = `select ROUND(@@global.innodb_buffer_pool_size/1024,2)`; --disable_result_log eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result; --enable_result_log --echo 1 expected select @final_pool_size_result; SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_file_size'; let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`; --disable_result_log eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result; --enable_result_log --echo 1 expected select @final_log_files_in_group_result; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo # Make sure that the warnings are present in server log. let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_FILE= $server_log; let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size; --source include/search_pattern.inc --echo --echo ########################################### --echo # RESTART 4 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = autoscaled # --echo # innodb_log_file_size = autoscaled # --echo # innodb_log_files_in_group = autoscaled # --echo # innodb_flush_method = explicit # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_flush_method=nosync; let $explicit_default_counter=100000; --source include/restart_mysqld.inc --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; let $actual_innodb_buffer_pool_size = `select @@global.innodb_buffer_pool_size/1024`; --disable_result_log eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result; --enable_result_log --echo 1 expected select @final_pool_size_result; let $actual_innodb_log_file_size = `select @@global.innodb_log_file_size/1024`; --disable_result_log eval select $expected_innodb_log_file_size = $actual_innodb_log_file_size into @final_log_file_size_result; --enable_result_log --echo 1 expected select @final_log_file_size_result; let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`; --disable_result_log eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result; --enable_result_log --echo 1 expected select @final_log_files_in_group_result; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo # Make sure that the warnings are present in server log. let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_FILE= $server_log; let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method; --source include/search_pattern.inc --echo --echo ########################################### --echo # RESTART 5 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = explicit # --echo # innodb_log_file_size = explicit # --echo # innodb_log_files_in_group = explicit # --echo # innodb_flush_method = explicit # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_buffer_pool_size=256M --innodb_log_file_size=50M --innodb_log_files_in_group=3 --innodb_flush_method=nosync; let $explicit_default_counter=100000; --source include/restart_mysqld.inc --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_buffer_pool_size'; SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_file_size'; SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_files_in_group'; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo # Make sure that the warnings are present in server log. let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_FILE= $server_log; let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_buffer_pool_size; --source include/search_pattern.inc let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size; --source include/search_pattern.inc let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method; --source include/search_pattern.inc --echo --echo ########################################### --echo # RESTART 6 # --echo # innodb_dedicated_server = ON # --echo # innodb_buffer_pool_size = autoscaled # --echo # innodb_log_file_size = explicit # --echo # innodb_log_files_in_group = explicit # --echo # innodb_flush_method = explicit # --echo ########################################### let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_log_file_size=50M --innodb_log_files_in_group=4 --innodb_flush_method=nosync; let $explicit_default_counter=100000; --source include/restart_mysqld.inc --disable_query_log SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_dedicated_server'; let $actual_innodb_buffer_pool_size = `select @@global.innodb_buffer_pool_size/1024`; --disable_result_log eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result; --enable_result_log --echo 1 expected select @final_pool_size_result; SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_file_size'; SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_log_files_in_group'; SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD FROM performance_schema.global_variables WHERE VARIABLE_NAME='innodb_flush_method'; --enable_query_log --echo # Make sure that the warnings are present in server log. let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; let SEARCH_FILE= $server_log; let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size; --source include/search_pattern.inc let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method; --source include/search_pattern.inc --enable_query_log --remove_file $MYSQLTEST_VARDIR/tmpfile.txt ####################################################################################### # Check if innodb_dedicated_server can be accessed with and without @@ sign # ####################################################################################### --Error ER_INCORRECT_GLOBAL_LOCAL_VAR SET innodb_dedicated_server = 0; SELECT @@innodb_dedicated_server; --Error ER_UNKNOWN_TABLE SELECT local.innodb_dedicated_server; --Error ER_INCORRECT_GLOBAL_LOCAL_VAR SET global innodb_dedicated_server = 0; SELECT @@global.innodb_dedicated_server; --Error ER_INCORRECT_GLOBAL_LOCAL_VAR set session innodb_dedicated_server=1; SELECT @@innodb_dedicated_server; show global variables like 'innodb_dedicated_server'; show session variables like 'innodb_dedicated_server'; #################################################################################################### # Check if the value of innodb_dedicated_server in GLOBAL Table matches value in variable # #################################################################################################### --echo 1 Expected SELECT @@global.innodb_dedicated_server; select * from performance_schema.global_variables where variable_name='innodb_dedicated_server'; select * from performance_schema.session_variables where variable_name='innodb_dedicated_server'; ################################################################################################### # Check if innodb_dedicated_server a non-persistent variable # ################################################################################################### --Error ER_INCORRECT_GLOBAL_LOCAL_VAR set persist_only innodb_dedicated_server=off;