Merge with xtradb code changes
(4 tests are still failing, so this push is not yet stable)
This commit is contained in:
commit
b35743f987
@ -13,7 +13,8 @@ BEGIN
|
||||
-- that are supposed to change
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||
WHERE variable_name != 'timestamp'
|
||||
AND variable_name != 'INNODB_IBUF_MAX_SIZE'
|
||||
AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND
|
||||
variable_name != 'INNODB_FILE_FORMAT_CHECK'
|
||||
ORDER BY variable_name;
|
||||
|
||||
-- Dump all databases, there should be none
|
||||
|
@ -0,0 +1,4 @@
|
||||
-- require r/have_response_time_distribution.require
|
||||
disable_query_log;
|
||||
show variables like 'have_response_time_distribution';
|
||||
enable_query_log;
|
@ -0,0 +1,2 @@
|
||||
Variable_name Value
|
||||
have_response_time_distribution YES
|
@ -0,0 +1 @@
|
||||
--log-error
|
@ -0,0 +1,15 @@
|
||||
SET @old_max_connections = @@max_connections;
|
||||
SET @old_log_warnings = @@log_warnings;
|
||||
SET GLOBAL max_connections=2;
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
connect(localhost,root,,test,port,socket);
|
||||
ERROR HY000: Too many connections
|
||||
SET GLOBAL LOG_WARNINGS = 1;
|
||||
connect(localhost,root,,test,port,socket);
|
||||
ERROR HY000: Too many connections
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
connect(localhost,root,,test,port,socket);
|
||||
ERROR HY000: Too many connections
|
||||
SET GLOBAL max_connections = @old_max_connections;
|
||||
SET GLOBAL log_warnings = @old_log_warnings;
|
||||
1
|
@ -0,0 +1,52 @@
|
||||
--source include/not_embedded.inc
|
||||
|
||||
connect (main,localhost,root,,);
|
||||
connection main;
|
||||
SET @old_max_connections = @@max_connections;
|
||||
SET @old_log_warnings = @@log_warnings;
|
||||
SET GLOBAL max_connections=2;
|
||||
let $port=`SELECT Variable_value FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE Variable_name LIKE 'port'`;
|
||||
let $socket=`SELECT Variable_value FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE Variable_name LIKE 'socket'`;
|
||||
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
--connect (conn0,localhost,root,,)
|
||||
connection conn0;
|
||||
replace_result $port port $socket socket;
|
||||
--error 1040
|
||||
--connect(conn1,localhost,root,,)
|
||||
disconnect conn0;
|
||||
SLEEP 0.1; # tsarev: hack, but i don't know (and didn't find) how right
|
||||
|
||||
connection main;
|
||||
SET GLOBAL LOG_WARNINGS = 1;
|
||||
--connect (conn1,localhost,root,,)
|
||||
replace_result $port port $socket socket;
|
||||
--error 1040
|
||||
--connect (conn0,localhost,root,,)
|
||||
disconnect conn1;
|
||||
SLEEP 0.1; # tsarev: hack, but i don't know (and didn't find) how right
|
||||
|
||||
connection main;
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
--connect (conn0,localhost,root,,)
|
||||
replace_result $port port $socket socket;
|
||||
--error 1040
|
||||
--connect(conn1,localhost,root,,)
|
||||
disconnect conn0;
|
||||
SLEEP 0.1; # tsarev: hack, but i don't know (and didn't find) how right
|
||||
|
||||
connection main;
|
||||
SET GLOBAL max_connections = @old_max_connections;
|
||||
SET GLOBAL log_warnings = @old_log_warnings;
|
||||
let $log_error_= `SELECT @@GLOBAL.log_error`;
|
||||
if(!`select LENGTH('$log_error_')`)
|
||||
{
|
||||
# MySQL Server on windows is started with --console and thus
|
||||
# does not know the location of its .err log, use default location
|
||||
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
}
|
||||
# Assign env variable LOG_ERROR
|
||||
let LOG_ERROR=$log_error_;
|
||||
|
||||
let cmd=cat $log_error | grep "Too many connections" | wc -l;
|
||||
exec $cmd;
|
@ -0,0 +1,2 @@
|
||||
--innodb_buffer_pool_shm_key=123456
|
||||
--innodb=FORCE
|
@ -0,0 +1,8 @@
|
||||
show variables like 'innodb_buffer_pool_shm%';
|
||||
Variable_name Value
|
||||
innodb_buffer_pool_shm_checksum ON
|
||||
innodb_buffer_pool_shm_key 123456
|
||||
show variables like 'innodb_buffer_pool_shm%';
|
||||
Variable_name Value
|
||||
innodb_buffer_pool_shm_checksum ON
|
||||
innodb_buffer_pool_shm_key 123456
|
19
mysql-test/suite/percona/percona_innodb_buffer_pool_shm.test
Normal file
19
mysql-test/suite/percona/percona_innodb_buffer_pool_shm.test
Normal file
@ -0,0 +1,19 @@
|
||||
--source include/big_test.inc
|
||||
--source include/have_innodb.inc
|
||||
show variables like 'innodb_buffer_pool_shm%';
|
||||
|
||||
#clean shutdown (restart_mysqld.inc is not clean if over 10 sec...)
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
wait
|
||||
EOF
|
||||
shutdown_server 120;
|
||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
restart
|
||||
EOF
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
--disable_reconnect
|
||||
|
||||
show variables like 'innodb_buffer_pool_shm%';
|
||||
--sleep 1
|
||||
--system ipcrm -M 123456
|
@ -1 +0,0 @@
|
||||
--log-error
|
@ -36,10 +36,12 @@ delayed_insert_limit Value
|
||||
delayed_insert_timeout Value
|
||||
delayed_queue_size Value
|
||||
div_precision_increment Value
|
||||
enable_query_response_time_stats Value
|
||||
engine_condition_pushdown Value
|
||||
error_count Value
|
||||
event_scheduler Value
|
||||
expire_logs_days Value
|
||||
fast_index_creation Value
|
||||
flush Value
|
||||
flush_time Value
|
||||
foreign_key_checks Value
|
||||
@ -62,6 +64,7 @@ have_ndbcluster Value
|
||||
have_openssl Value
|
||||
have_partitioning Value
|
||||
have_query_cache Value
|
||||
have_response_time_distribution Value
|
||||
have_rtree_keys Value
|
||||
have_ssl Value
|
||||
have_symlink Value
|
||||
@ -78,6 +81,8 @@ innodb_additional_mem_pool_size Value
|
||||
innodb_auto_lru_dump Value
|
||||
innodb_autoextend_increment Value
|
||||
innodb_autoinc_lock_mode Value
|
||||
innodb_buffer_pool_shm_checksum Value
|
||||
innodb_buffer_pool_shm_key Value
|
||||
innodb_buffer_pool_size Value
|
||||
innodb_change_buffering Value
|
||||
innodb_checkpoint_age_target Value
|
||||
@ -246,6 +251,7 @@ query_cache_strip_comments Value
|
||||
query_cache_type Value
|
||||
query_cache_wlock_invalidate Value
|
||||
query_prealloc_size Value
|
||||
query_response_time_range_base Value
|
||||
rand_seed1 Value
|
||||
rand_seed2 Value
|
||||
range_alloc_block_size Value
|
||||
|
@ -1,3 +1,4 @@
|
||||
--source include/have_response_time_distribution.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
|
||||
|
@ -0,0 +1,16 @@
|
||||
SET @old_slow_query_log_file=@@global.slow_query_log_file;
|
||||
SET GLOBAL slow_query_log=on;
|
||||
SET LOCAL profiling_server=on;
|
||||
SET LOCAL long_query_time=1;
|
||||
SET GLOBAL slow_query_log_file='MYSQLTEST_VARDIR/percona_bug643149_slow.log';;
|
||||
SELECT SLEEP(2);
|
||||
SLEEP(2)
|
||||
0
|
||||
# Time: X X:X:X
|
||||
# User@Host: root[root] @ localhost []
|
||||
# Thread_id: X Schema: test Last_errno: X Killed: X
|
||||
# Query_time: X.X Lock_time: X.X Rows_sent: X Rows_examined: X Rows_affected: X Rows_read: X
|
||||
# Bytes_sent: X Tmp_tables: X Tmp_disk_tables: X Tmp_table_sizes: X
|
||||
# Profile_starting: X.X Profile_starting_cpu: X.X Profile_checking_permissions: X.X Profile_checking_permissions_cpu: X.X Profile_Opening_tables: X.X Profile_Opening_tables_cpu: X.X Profile_init: X.X Profile_init_cpu: X.X Profile_optimizing: X.X Profile_optimizing_cpu: X.X Profile_executing: X.X Profile_executing_cpu: X.X Profile_User_sleep: X.X Profile_User_sleep_cpu: X.X Profile_end: X.X Profile_end_cpu: X.X Profile_query_end: X.X Profile_query_end_cpu: X.X Profile_freeing_items: X.X Profile_freeing_items_cpu: X.X Profile_logging_slow_query: X.X Profile_logging_slow_query_cpu: X.X
|
||||
# Profile_total: X.X Profile_total_cpu: X.X
|
||||
SET GLOBAL slow_query_log_file=@old_slow_query_log_file;
|
@ -0,0 +1,50 @@
|
||||
#
|
||||
# This test suffers from server
|
||||
# Bug#38124 "general_log_file" variable silently unset when using expression
|
||||
# In short:
|
||||
# SET GLOBAL general_log_file = @<whatever>
|
||||
# SET GLOBAL slow_query_log = @<whatever>
|
||||
# cause that the value of these server system variables is set to default
|
||||
# instead of the assigned values. There comes no error message or warning.
|
||||
# If this bug is fixed please
|
||||
# 1. try this test with "let $fixed_bug38124 = 0;"
|
||||
# 2. remove all workarounds if 1. was successful.
|
||||
let $fixed_bug38124 = 0;
|
||||
|
||||
SET @old_slow_query_log_file=@@global.slow_query_log_file;
|
||||
SET GLOBAL slow_query_log=on;
|
||||
SET LOCAL profiling_server=on;
|
||||
SET LOCAL long_query_time=1;
|
||||
|
||||
let slogfile=$MYSQLTEST_VARDIR/percona_bug643149_slow.log;
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
--eval SET GLOBAL slow_query_log_file='$slogfile';
|
||||
|
||||
--disable_ps_protocol
|
||||
SELECT SLEEP(2);
|
||||
--enable_ps_protocol
|
||||
|
||||
perl;
|
||||
$slogfile= $ENV{'slogfile'};
|
||||
|
||||
open(FILE, "$slogfile") or
|
||||
die("Unable to read slow query log file $slogfile: $!\n");
|
||||
while(<FILE>) {
|
||||
next if (!/^#/);
|
||||
s/[0-9]+/X/g;
|
||||
s/ +/ /g;
|
||||
print;
|
||||
}
|
||||
|
||||
close(FILE);
|
||||
EOF
|
||||
|
||||
SET GLOBAL slow_query_log_file=@old_slow_query_log_file;
|
||||
|
||||
if(!$fixed_bug38124)
|
||||
{
|
||||
--disable_query_log
|
||||
let $my_var = `SELECT @old_slow_query_log_file`;
|
||||
eval SET @@global.slow_query_log_file = '$my_var';
|
||||
--enable_query_log
|
||||
}
|
@ -34,4 +34,4 @@ SET SESSION debug="+d,status_wait_query_cache_mutex_sleep";
|
||||
SHOW PROCESSLIST;
|
||||
|
||||
DROP TABLE t;
|
||||
set GLOBAL query_cache_size=0;
|
||||
set GLOBAL query_cache_size=0;
|
||||
|
@ -0,0 +1,70 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
DROP TABLE IF EXISTS t;
|
||||
CREATE TABLE t(id INT);
|
||||
SELECT * from t;
|
||||
id
|
||||
SELECT * from t;
|
||||
id
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1'
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=ON;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
0
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
0
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
2
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
3
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
0
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
0
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
2
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count)
|
||||
3
|
||||
DROP TABLE IF EXISTS t;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=OFF;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1,57 @@
|
||||
--source include/have_response_time_distribution.inc
|
||||
--source include/master-slave.inc
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_debug.inc
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
|
||||
connection master;
|
||||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS t;
|
||||
-- enable_warnings
|
||||
CREATE TABLE t(id INT);
|
||||
SELECT * from t;
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
connection slave;
|
||||
SELECT * from t;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=ON;
|
||||
|
||||
connection master;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
sync_slave_with_master;
|
||||
|
||||
connection slave;
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
|
||||
connection master;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
INSERT INTO t SELECT SLEEP(0.4);
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
sync_slave_with_master;
|
||||
|
||||
connection slave;
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SELECT SUM(INFORMATION_SCHEMA.QUERY_RESPONSE_TIME.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t;
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=OFF;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1,313 @@
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
CREATE FUNCTION test_f()
|
||||
RETURNS CHAR(30) DETERMINISTIC
|
||||
BEGIN
|
||||
DECLARE first VARCHAR(5);
|
||||
DECLARE second VARCHAR(5);
|
||||
DECLARE result VARCHAR(20);
|
||||
SELECT SLEEP(1.11) INTO first;
|
||||
SET first= 'Hello';
|
||||
SET second=', ';
|
||||
SET result= CONCAT(first,second);
|
||||
SET result= CONCAT(result,'world!');
|
||||
RETURN result;
|
||||
END/
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1'
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
44
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000003
|
||||
0.000007
|
||||
0.000015
|
||||
0.000030
|
||||
0.000061
|
||||
0.000122
|
||||
0.000244
|
||||
0.000488
|
||||
0.000976
|
||||
0.001953
|
||||
0.003906
|
||||
0.007812
|
||||
0.015625
|
||||
0.031250
|
||||
0.062500
|
||||
0.125000
|
||||
0.250000
|
||||
0.500000
|
||||
1.000000
|
||||
2.000000
|
||||
4.000000
|
||||
8.000000
|
||||
16.000000
|
||||
32.000000
|
||||
64.000000
|
||||
128.000000
|
||||
256.000000
|
||||
512.000000
|
||||
1024.000000
|
||||
2048.000000
|
||||
4096.000000
|
||||
8192.000000
|
||||
16384.000000
|
||||
32768.000000
|
||||
65536.000000
|
||||
131072.000000
|
||||
262144.000000
|
||||
524288.000000
|
||||
1048576.00000
|
||||
2097152.00000
|
||||
4194304.00000
|
||||
8388608.00000
|
||||
TOO LONG
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
4 4 4 1 44
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
44
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000003
|
||||
0.000007
|
||||
0.000015
|
||||
0.000030
|
||||
0.000061
|
||||
0.000122
|
||||
0.000244
|
||||
0.000488
|
||||
0.000976
|
||||
0.001953
|
||||
0.003906
|
||||
0.007812
|
||||
0.015625
|
||||
0.031250
|
||||
0.062500
|
||||
0.125000
|
||||
0.250000
|
||||
0.500000
|
||||
1.000000
|
||||
2.000000
|
||||
4.000000
|
||||
8.000000
|
||||
16.000000
|
||||
32.000000
|
||||
64.000000
|
||||
128.000000
|
||||
256.000000
|
||||
512.000000
|
||||
1024.000000
|
||||
2048.000000
|
||||
4096.000000
|
||||
8192.000000
|
||||
16384.000000
|
||||
32768.000000
|
||||
65536.000000
|
||||
131072.000000
|
||||
262144.000000
|
||||
524288.000000
|
||||
1048576.00000
|
||||
2097152.00000
|
||||
4194304.00000
|
||||
8388608.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
1 1 1 1 14
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
14
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000010
|
||||
0.000100
|
||||
0.001000
|
||||
0.010000
|
||||
0.100000
|
||||
1.000000
|
||||
10.000000
|
||||
100.000000
|
||||
1000.000000
|
||||
10000.000000
|
||||
100000.000000
|
||||
1000000.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 7;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 7
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
1 1 1 1 17
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
17
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000008
|
||||
0.000059
|
||||
0.000416
|
||||
0.002915
|
||||
0.020408
|
||||
0.142857
|
||||
1.000000
|
||||
7.000000
|
||||
49.000000
|
||||
343.000000
|
||||
2401.000000
|
||||
16807.000000
|
||||
117649.000000
|
||||
823543.000000
|
||||
5764801.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 7
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 156;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 156
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
1 1 1 1 7
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
7
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000041
|
||||
0.006410
|
||||
1.000000
|
||||
156.000000
|
||||
24336.000000
|
||||
3796416.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 156
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1000;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
test_f()
|
||||
Hello, world!
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
1 1 1 1 6
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
6
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.001000
|
||||
1.000000
|
||||
1000.000000
|
||||
1000000.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1001;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1001'
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE =10;
|
||||
DROP FUNCTION test_f;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1,90 @@
|
||||
--source include/have_response_time_distribution.inc
|
||||
--source include/have_debug.inc
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
|
||||
delimiter /;
|
||||
CREATE FUNCTION test_f()
|
||||
RETURNS CHAR(30) DETERMINISTIC
|
||||
BEGIN
|
||||
DECLARE first VARCHAR(5);
|
||||
DECLARE second VARCHAR(5);
|
||||
DECLARE result VARCHAR(20);
|
||||
SELECT SLEEP(1.11) INTO first;
|
||||
SET first= 'Hello';
|
||||
SET second=', ';
|
||||
SET result= CONCAT(first,second);
|
||||
SET result= CONCAT(result,'world!');
|
||||
RETURN result;
|
||||
END/
|
||||
delimiter ;/
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
SELECT test_f();
|
||||
SELECT test_f();
|
||||
SELECT test_f();
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 7;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 156;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1000;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT test_f();
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1001;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE =10;
|
||||
|
||||
DROP FUNCTION test_f;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1,567 @@
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1'
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
44
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000003
|
||||
0.000007
|
||||
0.000015
|
||||
0.000030
|
||||
0.000061
|
||||
0.000122
|
||||
0.000244
|
||||
0.000488
|
||||
0.000976
|
||||
0.001953
|
||||
0.003906
|
||||
0.007812
|
||||
0.015625
|
||||
0.031250
|
||||
0.062500
|
||||
0.125000
|
||||
0.250000
|
||||
0.500000
|
||||
1.000000
|
||||
2.000000
|
||||
4.000000
|
||||
8.000000
|
||||
16.000000
|
||||
32.000000
|
||||
64.000000
|
||||
128.000000
|
||||
256.000000
|
||||
512.000000
|
||||
1024.000000
|
||||
2048.000000
|
||||
4096.000000
|
||||
8192.000000
|
||||
16384.000000
|
||||
32768.000000
|
||||
65536.000000
|
||||
131072.000000
|
||||
262144.000000
|
||||
524288.000000
|
||||
1048576.00000
|
||||
2097152.00000
|
||||
4194304.00000
|
||||
8388608.00000
|
||||
TOO LONG
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT SLEEP(0.31);
|
||||
SLEEP(0.31)
|
||||
0
|
||||
SELECT SLEEP(0.32);
|
||||
SLEEP(0.32)
|
||||
0
|
||||
SELECT SLEEP(0.33);
|
||||
SLEEP(0.33)
|
||||
0
|
||||
SELECT SLEEP(0.34);
|
||||
SLEEP(0.34)
|
||||
0
|
||||
SELECT SLEEP(0.35);
|
||||
SLEEP(0.35)
|
||||
0
|
||||
SELECT SLEEP(0.36);
|
||||
SLEEP(0.36)
|
||||
0
|
||||
SELECT SLEEP(0.37);
|
||||
SLEEP(0.37)
|
||||
0
|
||||
SELECT SLEEP(0.38);
|
||||
SLEEP(0.38)
|
||||
0
|
||||
SELECT SLEEP(0.39);
|
||||
SLEEP(0.39)
|
||||
0
|
||||
SELECT SLEEP(0.40);
|
||||
SLEEP(0.40)
|
||||
0
|
||||
SELECT SLEEP(1.1);
|
||||
SLEEP(1.1)
|
||||
0
|
||||
SELECT SLEEP(1.2);
|
||||
SLEEP(1.2)
|
||||
0
|
||||
SELECT SLEEP(1.3);
|
||||
SLEEP(1.3)
|
||||
0
|
||||
SELECT SLEEP(1.5);
|
||||
SLEEP(1.5)
|
||||
0
|
||||
SELECT SLEEP(1.4);
|
||||
SLEEP(1.4)
|
||||
0
|
||||
SELECT SLEEP(0.5);
|
||||
SLEEP(0.5)
|
||||
0
|
||||
SELECT SLEEP(2.1);
|
||||
SLEEP(2.1)
|
||||
0
|
||||
SELECT SLEEP(2.3);
|
||||
SLEEP(2.3)
|
||||
0
|
||||
SELECT SLEEP(2.5);
|
||||
SLEEP(2.5)
|
||||
0
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
10 19 15 4 44
|
||||
1 19 15 4 44
|
||||
5 19 15 4 44
|
||||
3 19 15 4 44
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
44
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000003
|
||||
0.000007
|
||||
0.000015
|
||||
0.000030
|
||||
0.000061
|
||||
0.000122
|
||||
0.000244
|
||||
0.000488
|
||||
0.000976
|
||||
0.001953
|
||||
0.003906
|
||||
0.007812
|
||||
0.015625
|
||||
0.031250
|
||||
0.062500
|
||||
0.125000
|
||||
0.250000
|
||||
0.500000
|
||||
1.000000
|
||||
2.000000
|
||||
4.000000
|
||||
8.000000
|
||||
16.000000
|
||||
32.000000
|
||||
64.000000
|
||||
128.000000
|
||||
256.000000
|
||||
512.000000
|
||||
1024.000000
|
||||
2048.000000
|
||||
4096.000000
|
||||
8192.000000
|
||||
16384.000000
|
||||
32768.000000
|
||||
65536.000000
|
||||
131072.000000
|
||||
262144.000000
|
||||
524288.000000
|
||||
1048576.00000
|
||||
2097152.00000
|
||||
4194304.00000
|
||||
8388608.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT SLEEP(0.31);
|
||||
SLEEP(0.31)
|
||||
0
|
||||
SELECT SLEEP(0.32);
|
||||
SLEEP(0.32)
|
||||
0
|
||||
SELECT SLEEP(0.33);
|
||||
SLEEP(0.33)
|
||||
0
|
||||
SELECT SLEEP(0.34);
|
||||
SLEEP(0.34)
|
||||
0
|
||||
SELECT SLEEP(0.35);
|
||||
SLEEP(0.35)
|
||||
0
|
||||
SELECT SLEEP(0.36);
|
||||
SLEEP(0.36)
|
||||
0
|
||||
SELECT SLEEP(0.37);
|
||||
SLEEP(0.37)
|
||||
0
|
||||
SELECT SLEEP(0.38);
|
||||
SLEEP(0.38)
|
||||
0
|
||||
SELECT SLEEP(0.39);
|
||||
SLEEP(0.39)
|
||||
0
|
||||
SELECT SLEEP(0.40);
|
||||
SLEEP(0.40)
|
||||
0
|
||||
SELECT SLEEP(1.1);
|
||||
SLEEP(1.1)
|
||||
0
|
||||
SELECT SLEEP(1.2);
|
||||
SLEEP(1.2)
|
||||
0
|
||||
SELECT SLEEP(1.3);
|
||||
SLEEP(1.3)
|
||||
0
|
||||
SELECT SLEEP(1.5);
|
||||
SLEEP(1.5)
|
||||
0
|
||||
SELECT SLEEP(1.4);
|
||||
SLEEP(1.4)
|
||||
0
|
||||
SELECT SLEEP(0.5);
|
||||
SLEEP(0.5)
|
||||
0
|
||||
SELECT SLEEP(2.1);
|
||||
SLEEP(2.1)
|
||||
0
|
||||
SELECT SLEEP(2.3);
|
||||
SLEEP(2.3)
|
||||
0
|
||||
SELECT SLEEP(2.5);
|
||||
SLEEP(2.5)
|
||||
0
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
11 19 17 2 14
|
||||
8 19 17 2 14
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
14
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000010
|
||||
0.000100
|
||||
0.001000
|
||||
0.010000
|
||||
0.100000
|
||||
1.000000
|
||||
10.000000
|
||||
100.000000
|
||||
1000.000000
|
||||
10000.000000
|
||||
100000.000000
|
||||
1000000.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 7;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 7
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT SLEEP(0.31);
|
||||
SLEEP(0.31)
|
||||
0
|
||||
SELECT SLEEP(0.32);
|
||||
SLEEP(0.32)
|
||||
0
|
||||
SELECT SLEEP(0.33);
|
||||
SLEEP(0.33)
|
||||
0
|
||||
SELECT SLEEP(0.34);
|
||||
SLEEP(0.34)
|
||||
0
|
||||
SELECT SLEEP(0.35);
|
||||
SLEEP(0.35)
|
||||
0
|
||||
SELECT SLEEP(0.36);
|
||||
SLEEP(0.36)
|
||||
0
|
||||
SELECT SLEEP(0.37);
|
||||
SLEEP(0.37)
|
||||
0
|
||||
SELECT SLEEP(0.38);
|
||||
SLEEP(0.38)
|
||||
0
|
||||
SELECT SLEEP(0.39);
|
||||
SLEEP(0.39)
|
||||
0
|
||||
SELECT SLEEP(0.40);
|
||||
SLEEP(0.40)
|
||||
0
|
||||
SELECT SLEEP(1.1);
|
||||
SLEEP(1.1)
|
||||
0
|
||||
SELECT SLEEP(1.2);
|
||||
SLEEP(1.2)
|
||||
0
|
||||
SELECT SLEEP(1.3);
|
||||
SLEEP(1.3)
|
||||
0
|
||||
SELECT SLEEP(1.5);
|
||||
SLEEP(1.5)
|
||||
0
|
||||
SELECT SLEEP(1.4);
|
||||
SLEEP(1.4)
|
||||
0
|
||||
SELECT SLEEP(0.5);
|
||||
SLEEP(0.5)
|
||||
0
|
||||
SELECT SLEEP(2.1);
|
||||
SLEEP(2.1)
|
||||
0
|
||||
SELECT SLEEP(2.3);
|
||||
SLEEP(2.3)
|
||||
0
|
||||
SELECT SLEEP(2.5);
|
||||
SLEEP(2.5)
|
||||
0
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
11 19 17 2 17
|
||||
8 19 17 2 17
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
17
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.000008
|
||||
0.000059
|
||||
0.000416
|
||||
0.002915
|
||||
0.020408
|
||||
0.142857
|
||||
1.000000
|
||||
7.000000
|
||||
49.000000
|
||||
343.000000
|
||||
2401.000000
|
||||
16807.000000
|
||||
117649.000000
|
||||
823543.000000
|
||||
5764801.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 7
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 156;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 156
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT SLEEP(0.31);
|
||||
SLEEP(0.31)
|
||||
0
|
||||
SELECT SLEEP(0.32);
|
||||
SLEEP(0.32)
|
||||
0
|
||||
SELECT SLEEP(0.33);
|
||||
SLEEP(0.33)
|
||||
0
|
||||
SELECT SLEEP(0.34);
|
||||
SLEEP(0.34)
|
||||
0
|
||||
SELECT SLEEP(0.35);
|
||||
SLEEP(0.35)
|
||||
0
|
||||
SELECT SLEEP(0.36);
|
||||
SLEEP(0.36)
|
||||
0
|
||||
SELECT SLEEP(0.37);
|
||||
SLEEP(0.37)
|
||||
0
|
||||
SELECT SLEEP(0.38);
|
||||
SLEEP(0.38)
|
||||
0
|
||||
SELECT SLEEP(0.39);
|
||||
SLEEP(0.39)
|
||||
0
|
||||
SELECT SLEEP(0.40);
|
||||
SLEEP(0.40)
|
||||
0
|
||||
SELECT SLEEP(1.1);
|
||||
SLEEP(1.1)
|
||||
0
|
||||
SELECT SLEEP(1.2);
|
||||
SLEEP(1.2)
|
||||
0
|
||||
SELECT SLEEP(1.3);
|
||||
SLEEP(1.3)
|
||||
0
|
||||
SELECT SLEEP(1.5);
|
||||
SLEEP(1.5)
|
||||
0
|
||||
SELECT SLEEP(1.4);
|
||||
SLEEP(1.4)
|
||||
0
|
||||
SELECT SLEEP(0.5);
|
||||
SLEEP(0.5)
|
||||
0
|
||||
SELECT SLEEP(2.1);
|
||||
SLEEP(2.1)
|
||||
0
|
||||
SELECT SLEEP(2.3);
|
||||
SLEEP(2.3)
|
||||
0
|
||||
SELECT SLEEP(2.5);
|
||||
SLEEP(2.5)
|
||||
0
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
11 19 17 2 7
|
||||
8 19 17 2 7
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
7
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000041
|
||||
0.006410
|
||||
1.000000
|
||||
156.000000
|
||||
24336.000000
|
||||
3796416.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 156
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1000;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
SELECT SLEEP(0.31);
|
||||
SLEEP(0.31)
|
||||
0
|
||||
SELECT SLEEP(0.32);
|
||||
SLEEP(0.32)
|
||||
0
|
||||
SELECT SLEEP(0.33);
|
||||
SLEEP(0.33)
|
||||
0
|
||||
SELECT SLEEP(0.34);
|
||||
SLEEP(0.34)
|
||||
0
|
||||
SELECT SLEEP(0.35);
|
||||
SLEEP(0.35)
|
||||
0
|
||||
SELECT SLEEP(0.36);
|
||||
SLEEP(0.36)
|
||||
0
|
||||
SELECT SLEEP(0.37);
|
||||
SLEEP(0.37)
|
||||
0
|
||||
SELECT SLEEP(0.38);
|
||||
SLEEP(0.38)
|
||||
0
|
||||
SELECT SLEEP(0.39);
|
||||
SLEEP(0.39)
|
||||
0
|
||||
SELECT SLEEP(0.40);
|
||||
SLEEP(0.40)
|
||||
0
|
||||
SELECT SLEEP(1.1);
|
||||
SLEEP(1.1)
|
||||
0
|
||||
SELECT SLEEP(1.2);
|
||||
SLEEP(1.2)
|
||||
0
|
||||
SELECT SLEEP(1.3);
|
||||
SLEEP(1.3)
|
||||
0
|
||||
SELECT SLEEP(1.5);
|
||||
SLEEP(1.5)
|
||||
0
|
||||
SELECT SLEEP(1.4);
|
||||
SLEEP(1.4)
|
||||
0
|
||||
SELECT SLEEP(0.5);
|
||||
SLEEP(0.5)
|
||||
0
|
||||
SELECT SLEEP(2.1);
|
||||
SLEEP(2.1)
|
||||
0
|
||||
SELECT SLEEP(2.3);
|
||||
SLEEP(2.3)
|
||||
0
|
||||
SELECT SLEEP(2.5);
|
||||
SLEEP(2.5)
|
||||
0
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
count query_count query_total not_zero_region_count region_count
|
||||
11 19 17 2 6
|
||||
8 19 17 2 6
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
region_count
|
||||
6
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
time
|
||||
0.000001
|
||||
0.001000
|
||||
1.000000
|
||||
1000.000000
|
||||
1000000.00000
|
||||
TOO LONG
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1001;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1001'
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE =10;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1,68 @@
|
||||
--source include/have_response_time_distribution.inc
|
||||
--source include/have_debug.inc
|
||||
SET SESSION debug="+d,response_time_distribution_log_only_more_300_milliseconds";
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 2;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
source include/percona_query_response_time_sleep.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 10;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
source include/percona_query_response_time_sleep.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 7;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
source include/percona_query_response_time_sleep.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 156;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
source include/percona_query_response_time_sleep.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1000;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
source include/percona_query_response_time_flush.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=1;
|
||||
source include/percona_query_response_time_sleep.inc;
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
source include/percona_query_response_time_show.inc;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE = 1001;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
|
||||
SET GLOBAL ENABLE_QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE =10;
|
||||
SET SESSION debug="-d,response_time_distribution_log_only_more_300_milliseconds";
|
@ -0,0 +1 @@
|
||||
FLUSH QUERY_RESPONSE_TIME;
|
@ -0,0 +1,8 @@
|
||||
SELECT d.count,
|
||||
(SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0) as query_count,
|
||||
(SELECT SUM((b.total * 1000000) DIV 1000000) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as b WHERE b.count != 0) as query_total,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count != 0) as not_zero_region_count,
|
||||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME) as region_count
|
||||
FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as d WHERE d.count > 0;
|
||||
SELECT COUNT(*) as region_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SELECT time FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
@ -0,0 +1,19 @@
|
||||
SELECT SLEEP(0.31);
|
||||
SELECT SLEEP(0.32);
|
||||
SELECT SLEEP(0.33);
|
||||
SELECT SLEEP(0.34);
|
||||
SELECT SLEEP(0.35);
|
||||
SELECT SLEEP(0.36);
|
||||
SELECT SLEEP(0.37);
|
||||
SELECT SLEEP(0.38);
|
||||
SELECT SLEEP(0.39);
|
||||
SELECT SLEEP(0.40);
|
||||
SELECT SLEEP(1.1);
|
||||
SELECT SLEEP(1.2);
|
||||
SELECT SLEEP(1.3);
|
||||
SELECT SLEEP(1.5);
|
||||
SELECT SLEEP(1.4);
|
||||
SELECT SLEEP(0.5);
|
||||
SELECT SLEEP(2.1);
|
||||
SELECT SLEEP(2.3);
|
||||
SELECT SLEEP(2.5);
|
@ -0,0 +1,21 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
DROP TABLE IF EXISTS t;
|
||||
CREATE TABLE t(id INT);
|
||||
INSERT INTO t SELECT SLEEP(10);
|
||||
STOP SLAVE;
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
master count(*)
|
||||
master 1
|
||||
slave count(*)
|
||||
slave 0
|
||||
SHOW SLAVE STATUS NOLOCK;
|
||||
START SLAVE;
|
||||
slave count(*)
|
||||
slave 1
|
||||
DROP TABLE t;
|
@ -0,0 +1,47 @@
|
||||
--source include/master-slave.inc
|
||||
--source include/have_binlog_format_statement.inc
|
||||
|
||||
connection master;
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t;
|
||||
--enable_warnings
|
||||
CREATE TABLE t(id INT);
|
||||
sync_slave_with_master;
|
||||
|
||||
connection master;
|
||||
send INSERT INTO t SELECT SLEEP(10);
|
||||
|
||||
connection slave;
|
||||
sleep 15;
|
||||
send STOP SLAVE;
|
||||
|
||||
connection master;
|
||||
reap;
|
||||
|
||||
--disable_query_log
|
||||
select "master",count(*) from t;
|
||||
--enable_query_log
|
||||
|
||||
connection slave1;
|
||||
--disable_query_log
|
||||
select "slave",count(*) from t;
|
||||
--enable_query_log
|
||||
|
||||
--disable_result_log
|
||||
SHOW SLAVE STATUS NOLOCK;
|
||||
--enable_result_log
|
||||
|
||||
connection slave;
|
||||
reap;
|
||||
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
START SLAVE;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
|
||||
--disable_query_log
|
||||
select "slave",count(*) from t;
|
||||
--enable_query_log
|
||||
|
||||
connection master;
|
||||
DROP TABLE t;
|
||||
sync_slave_with_master;
|
16
mysql-test/suite/percona/slow_extended.patch/grep.inc
Normal file
16
mysql-test/suite/percona/slow_extended.patch/grep.inc
Normal file
@ -0,0 +1,16 @@
|
||||
perl;
|
||||
|
||||
$file = $ENV{'grep_file'};
|
||||
$pattern = $ENV{'grep_pattern'};
|
||||
|
||||
open(FILE, "$file")
|
||||
or die("Cannot open file $file: $!\n");
|
||||
|
||||
$lines = 0;
|
||||
while(<FILE>) {
|
||||
$lines++ if (/$pattern/);
|
||||
}
|
||||
print "$lines\n";
|
||||
|
||||
close(FILE);
|
||||
EOF
|
@ -0,0 +1 @@
|
||||
--use_global_long_query_time --log_slow_verbosity="full"
|
@ -0,0 +1,18 @@
|
||||
show variables like 'use_global_long_query_time';
|
||||
Variable_name Value
|
||||
use_global_long_query_time ON
|
||||
show variables like 'use_global_log_slow_control';
|
||||
Variable_name Value
|
||||
use_global_log_slow_control long_query_time
|
||||
show variables like 'log_slow_verbosity';
|
||||
Variable_name Value
|
||||
log_slow_verbosity microtime,query_plan,innodb
|
||||
show global variables like 'use_global_long_query_time';
|
||||
Variable_name Value
|
||||
use_global_long_query_time ON
|
||||
show global variables like 'log_slow_verbosity';
|
||||
Variable_name Value
|
||||
log_slow_verbosity microtime,query_plan,innodb
|
||||
show global variables like 'use_global_log_slow_control';
|
||||
Variable_name Value
|
||||
use_global_log_slow_control long_query_time
|
@ -0,0 +1,6 @@
|
||||
show variables like 'use_global_long_query_time';
|
||||
show variables like 'use_global_log_slow_control';
|
||||
show variables like 'log_slow_verbosity';
|
||||
show global variables like 'use_global_long_query_time';
|
||||
show global variables like 'log_slow_verbosity';
|
||||
show global variables like 'use_global_log_slow_control';
|
@ -0,0 +1 @@
|
||||
--use_global_log_slow_control="long_query_time"
|
@ -0,0 +1,12 @@
|
||||
show variables like 'use_global_long_query_time';
|
||||
Variable_name Value
|
||||
use_global_long_query_time ON
|
||||
show variables like 'use_global_log_slow_control';
|
||||
Variable_name Value
|
||||
use_global_log_slow_control long_query_time
|
||||
show global variables like 'use_global_long_query_time';
|
||||
Variable_name Value
|
||||
use_global_long_query_time ON
|
||||
show global variables like 'use_global_log_slow_control';
|
||||
Variable_name Value
|
||||
use_global_log_slow_control long_query_time
|
@ -0,0 +1,4 @@
|
||||
show variables like 'use_global_long_query_time';
|
||||
show variables like 'use_global_log_slow_control';
|
||||
show global variables like 'use_global_long_query_time';
|
||||
show global variables like 'use_global_log_slow_control';
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-control_global_slow.log --long-query-time=1
|
||||
--slow-query-log-file=percona_slow_query_log-control_global_slow.log --long-query-time=1
|
||||
|
@ -8,5 +8,5 @@ sleep(2)
|
||||
0
|
||||
set global use_global_log_slow_control=none;
|
||||
set global log_slow_verbosity=microtime;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-control_global_slow.log | grep "No InnoDB statistics available for this query" | wc -l
|
||||
FLUSH LOGS;
|
||||
1
|
||||
|
@ -5,6 +5,8 @@ set global use_global_log_slow_control="log_slow_verbosity,long_query_time";
|
||||
SELECT sleep(2);
|
||||
set global use_global_log_slow_control=none;
|
||||
set global log_slow_verbosity=microtime;
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-control_global_slow.log | grep "No InnoDB statistics available for this query" | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-control_global_slow.log
|
||||
--let grep_pattern = No InnoDB statistics available for this query
|
||||
--source include/grep.inc
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-log_slow_filter.log --long-query-time=1
|
||||
--slow-query-log-file=percona_slow_query_log-log_slow_filter.log --long-query-time=1
|
||||
|
@ -21,5 +21,5 @@ SELECT sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
drop table if exists t;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-log_slow_filter.log | grep Query_time | wc -l
|
||||
FLUSH LOGS;
|
||||
2
|
||||
|
@ -26,6 +26,7 @@ SELECT sleep(2);
|
||||
drop table if exists t;
|
||||
--enable_warnings
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-log_slow_filter.log | grep Query_time | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-log_slow_filter.log
|
||||
--let grep_pattern = Query_time
|
||||
--source include/grep.inc
|
||||
|
@ -0,0 +1 @@
|
||||
--log_slow_sp_statements
|
@ -0,0 +1,3 @@
|
||||
show global variables like 'log_slow_sp_statements';
|
||||
Variable_name Value
|
||||
log_slow_sp_statements ON
|
@ -0,0 +1 @@
|
||||
show global variables like 'log_slow_sp_statements';
|
@ -0,0 +1 @@
|
||||
--log_slow_timestamp_every
|
@ -0,0 +1,3 @@
|
||||
show global variables like 'log_slow_timestamp_every';
|
||||
Variable_name Value
|
||||
log_slow_timestamp_every ON
|
@ -0,0 +1 @@
|
||||
show global variables like 'log_slow_timestamp_every';
|
@ -0,0 +1 @@
|
||||
--log_slow_verbosity="full"
|
@ -0,0 +1,9 @@
|
||||
show global variables like 'log_slow_verbosity';
|
||||
Variable_name Value
|
||||
log_slow_verbosity microtime,query_plan,innodb
|
||||
show variables like 'log_slow_verbosity';
|
||||
Variable_name Value
|
||||
log_slow_verbosity microtime,query_plan,innodb
|
||||
select @@log_slow_verbosity;
|
||||
@@log_slow_verbosity
|
||||
microtime,query_plan,innodb
|
@ -0,0 +1,3 @@
|
||||
show global variables like 'log_slow_verbosity';
|
||||
show variables like 'log_slow_verbosity';
|
||||
select @@log_slow_verbosity;
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-log_slow_verbosity.log --long-query-time=1
|
||||
--slow-query-log-file=percona_slow_query_log-log_slow_verbosity.log --long-query-time=1
|
||||
|
@ -5,5 +5,5 @@ set log_slow_verbosity=innodb;
|
||||
SELECT sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
cat var/mysqld.1/data/percona_slow_query_log-log_slow_verbosity.log | grep "No InnoDB statistics available for this query" | wc -l
|
||||
FLUSH LOGS;
|
||||
1
|
||||
|
@ -6,6 +6,7 @@ set log_slow_verbosity=innodb;
|
||||
|
||||
SELECT sleep(2);
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-log_slow_verbosity.log | grep "No InnoDB statistics available for this query" | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-log_slow_verbosity.log
|
||||
--let grep_pattern = No InnoDB statistics available for this query
|
||||
--source include/grep.inc
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-long_query_time.log --long-query-time=2
|
||||
--slow-query-log-file=percona_slow_query_log-long_query_time.log --long-query-time=2
|
||||
|
@ -18,5 +18,5 @@ SELECT sleep(5);
|
||||
sleep(5)
|
||||
0
|
||||
set long_query_time=2;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-long_query_time.log | grep Query_time | wc -l
|
||||
FLUSH LOGS;
|
||||
3
|
||||
|
@ -12,6 +12,8 @@ SELECT sleep(5);
|
||||
|
||||
set long_query_time=2;
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-long_query_time.log | grep Query_time | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-long_query_time.log
|
||||
--let grep_pattern = Query_time
|
||||
--source include/grep.inc
|
||||
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-microseconds_in_slow_query_log.log --long-query-time=1
|
||||
--slow-query-log-file=percona_slow_query_log-microseconds_in_slow_query_log.log --long-query-time=1
|
||||
|
@ -6,7 +6,6 @@ SELECT sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
set global slow_query_log_microseconds_timestamp=OFF;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log | grep -E '# Time: [0-9]+[ ]+[0-9]+:[0-\9]+:[0-9]+.[0-9]+' | wc -l
|
||||
FLUSH LOGS;
|
||||
1
|
||||
cat var/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log | grep -E '# Time: [0-9]+[ ]+[0-9]+:[0-\9]+:[0-9]+' | wc -l
|
||||
2
|
||||
|
@ -8,10 +8,12 @@ SELECT sleep(2);
|
||||
|
||||
set global slow_query_log_microseconds_timestamp=OFF;
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log | grep -E '# Time: [0-9]+[ ]+[0-9]+:[0-\9]+:[0-9]+.[0-9]+' | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log
|
||||
--let grep_pattern = # Time: [0-9]+[ ]+[0-9]+:[0-9]+:[0-9]+.[0-9]+
|
||||
--source include/grep.inc
|
||||
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log
|
||||
--let grep_pattern = # Time: [0-9]+[ ]+[0-9]+:[0-9]+:[0-9]+
|
||||
--source include/grep.inc
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-microseconds_in_slow_query_log.log | grep -E '# Time: [0-9]+[ ]+[0-9]+:[0-\9]+:[0-9]+' | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-min_examined_row_limit.log --long-query-time=1
|
||||
--slow-query-log-file=percona_slow_query_log-min_examined_row_limit.log --long-query-time=1
|
||||
|
@ -21,5 +21,5 @@ SELECT sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
drop table if exists t;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-min_examined_row_limit.log | grep Query_time | wc -l
|
||||
FLUSH LOGS;
|
||||
2
|
||||
|
@ -26,6 +26,7 @@ SELECT sleep(2);
|
||||
drop table if exists t;
|
||||
--enable_warnings
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-min_examined_row_limit.log | grep Query_time | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-min_examined_row_limit.log
|
||||
--let grep_pattern = Query_time
|
||||
--source include/grep.inc
|
||||
|
@ -18,4 +18,5 @@ STOP SLAVE;
|
||||
START SLAVE;
|
||||
INSERT INTO t SELECT t.id,t.data from t;
|
||||
DROP TABLE IF EXISTS t;
|
||||
FLUSH LOGS;
|
||||
4
|
||||
|
@ -41,4 +41,8 @@ connection master;
|
||||
DROP TABLE IF EXISTS t;
|
||||
sync_slave_with_master;
|
||||
|
||||
exec cat var/mysqld.2/mysqld-slow.log | grep InnoDB_IO_r_ops | wc -l;
|
||||
connection slave;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.2/mysqld-slow.log
|
||||
--let grep_pattern = InnoDB_IO_r_ops
|
||||
--source include/grep.inc
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-master.log --long-query-time=1
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-master.log --long-query-time=1
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-slave.log --long-query-time=1
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-slave.log --long-query-time=1
|
||||
|
@ -75,12 +75,14 @@ Variable_name Value
|
||||
use_global_long_query_time ON
|
||||
set global long_query_time=1;
|
||||
set global use_global_long_query_time=0;
|
||||
FLUSH LOGS;
|
||||
# Analyse master slow_query_log
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
FLUSH LOGS;
|
||||
# Analyse slave slow_query_log
|
||||
0
|
||||
0
|
||||
|
@ -75,26 +75,32 @@ show global variables like 'use_global_long_query_time';
|
||||
set global long_query_time=1;
|
||||
set global use_global_long_query_time=0;
|
||||
|
||||
connection master;
|
||||
FLUSH LOGS;
|
||||
|
||||
-- echo # Analyse master slow_query_log
|
||||
let $i=5;
|
||||
let $k=1;
|
||||
let $cmd=cat ./var/mysqld.1/data/percona_log_slow_slave_statements-master.log | grep;
|
||||
while($i)
|
||||
{
|
||||
let $current_cmd = $cmd "INSERT INTO t VALUES ($k)" | wc -l;
|
||||
exec $current_cmd;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_log_slow_slave_statements-master.log
|
||||
--let grep_pattern = INSERT INTO t VALUES \($k\)
|
||||
--source include/grep.inc
|
||||
dec $i;
|
||||
inc $k;
|
||||
}
|
||||
|
||||
connection slave;
|
||||
FLUSH LOGS;
|
||||
|
||||
-- echo # Analyse slave slow_query_log
|
||||
let $i=5;
|
||||
let $k=1;
|
||||
let $cmd=cat ./var/mysqld.2/data/percona_log_slow_slave_statements-slave.log | grep;
|
||||
while($i)
|
||||
{
|
||||
let $current_cmd = $cmd "INSERT INTO t VALUES ($k)" | wc -l;
|
||||
exec $current_cmd;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.2/data/percona_log_slow_slave_statements-slave.log
|
||||
--let grep_pattern = INSERT INTO t VALUES \($k\)
|
||||
--source include/grep.inc
|
||||
dec $i;
|
||||
inc $k;
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-master.log --long-query-time=0
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-master.log --long-query-time=0
|
||||
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-slave.log --long-query-time=0
|
||||
--slow-query-log-file=percona_log_slow_slave_statements-slave.log --long-query-time=0
|
||||
|
@ -64,6 +64,7 @@ START SLAVE;
|
||||
INSERT INTO t VALUES (7);
|
||||
# Read information about master binlog
|
||||
# Sync slave(7) thread
|
||||
FLUSH LOGS;
|
||||
# Analyse master slow_query_log
|
||||
1
|
||||
1
|
||||
@ -72,6 +73,7 @@ INSERT INTO t VALUES (7);
|
||||
1
|
||||
1
|
||||
1
|
||||
FLUSH LOGS;
|
||||
# Analyse slave slow_query_log
|
||||
0
|
||||
0
|
||||
|
@ -122,26 +122,32 @@ let $binlog_position = query_get_value(SHOW MASTER STATUS,Position,1);
|
||||
connection slave;
|
||||
let $sync_result = `SELECT MASTER_POS_WAIT('$binlog_file',$binlog_position)`;
|
||||
|
||||
connection master;
|
||||
FLUSH LOGS;
|
||||
|
||||
-- echo # Analyse master slow_query_log
|
||||
let $i=7;
|
||||
let $k=1;
|
||||
let $cmd=cat ./var/mysqld.1/data/percona_log_slow_slave_statements-master.log | grep;
|
||||
while($i)
|
||||
{
|
||||
let $current_cmd = $cmd "INSERT INTO t VALUES ($k)" | wc -l;
|
||||
exec $current_cmd;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_log_slow_slave_statements-master.log
|
||||
--let grep_pattern = INSERT INTO t VALUES \($k\)
|
||||
--source include/grep.inc
|
||||
dec $i;
|
||||
inc $k;
|
||||
}
|
||||
|
||||
connection slave;
|
||||
FLUSH LOGS;
|
||||
|
||||
-- echo # Analyse slave slow_query_log
|
||||
let $i=7;
|
||||
let $k=1;
|
||||
let $cmd=cat ./var/mysqld.2/data/percona_log_slow_slave_statements-slave.log | grep;
|
||||
while($i)
|
||||
{
|
||||
let $current_cmd = $cmd "INSERT INTO t VALUES ($k)" | wc -l;
|
||||
exec $current_cmd;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.2/data/percona_log_slow_slave_statements-slave.log
|
||||
--let grep_pattern = INSERT INTO t VALUES \($k\)
|
||||
--source include/grep.inc
|
||||
dec $i;
|
||||
inc $k;
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
--slow_query_log_microseconds_timestamp
|
@ -0,0 +1,3 @@
|
||||
show global variables like 'slow_query_log_microseconds_timestamp';
|
||||
Variable_name Value
|
||||
slow_query_log_microseconds_timestamp ON
|
@ -0,0 +1 @@
|
||||
show global variables like 'slow_query_log_microseconds_timestamp';
|
@ -0,0 +1 @@
|
||||
--use_global_long_query_time
|
@ -0,0 +1,3 @@
|
||||
show global variables like 'use_global_long_query_time';
|
||||
Variable_name Value
|
||||
use_global_long_query_time ON
|
@ -0,0 +1 @@
|
||||
show global variables like 'use_global_long_query_time';
|
@ -1 +1 @@
|
||||
--slow-query-log-file=percona_slow_query_log-use_global_long_query_time.log --long-query-time=2 --use_global_log_slow_control=long_query_time --use_global_long_query_time=1
|
||||
--slow-query-log-file=percona_slow_query_log-use_global_long_query_time.log --long-query-time=2 --use_global_log_slow_control=long_query_time --use_global_long_query_time=1
|
||||
|
@ -20,7 +20,7 @@ sleep(5)
|
||||
0
|
||||
set global long_query_time=2;
|
||||
set global use_global_long_query_time=0;
|
||||
cat var/mysqld.1/data/percona_slow_query_log-use_global_long_query_time.log | grep Query_time | wc -l
|
||||
FLUSH LOGS;
|
||||
3
|
||||
show global variables like 'use_global_log_slow_control';
|
||||
Variable_name Value
|
||||
|
@ -14,9 +14,10 @@ SELECT sleep(5);
|
||||
set global long_query_time=2;
|
||||
set global use_global_long_query_time=0;
|
||||
|
||||
let $cmd = cat var/mysqld.1/data/percona_slow_query_log-use_global_long_query_time.log | grep Query_time | wc -l;
|
||||
echo $cmd;
|
||||
exec $cmd;
|
||||
FLUSH LOGS;
|
||||
--let grep_file = $MYSQLTEST_VARDIR/mysqld.1/data/percona_slow_query_log-use_global_long_query_time.log
|
||||
--let grep_pattern = Query_time
|
||||
--source include/grep.inc
|
||||
|
||||
show global variables like 'use_global_log_slow_control';
|
||||
show global variables like 'use_global_long_query_time';
|
||||
|
@ -1,23 +0,0 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
DROP TABLE IF EXISTS t;
|
||||
CREATE TABLE t(id INT);
|
||||
INSERT INTO t SELECT SLEEP(5);
|
||||
STOP SLAVE;
|
||||
select count(*) from t;
|
||||
count(*)
|
||||
0
|
||||
SHOW SLAVE STATUS NOLOCK;
|
||||
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error
|
||||
host user port 1 master-bin.000001 276 slave-relay-bin.000003 422 master-bin.000001 No No 0 0 276 577 None 0 No NULL No 0 0
|
||||
select count(*) from t;
|
||||
count(*)
|
||||
0
|
||||
START SLAVE;
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
DROP TABLE t;
|
@ -1,28 +0,0 @@
|
||||
--source include/master-slave.inc
|
||||
|
||||
connection master;
|
||||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS t;
|
||||
-- enable_warnings
|
||||
CREATE TABLE t(id INT);
|
||||
sync_slave_with_master;
|
||||
connection master;
|
||||
send INSERT INTO t SELECT SLEEP(5);
|
||||
sleep 1;
|
||||
connection slave;
|
||||
send STOP SLAVE;
|
||||
connection slave1;
|
||||
select count(*) from t;
|
||||
replace_column 2 host 3 user 4 port;
|
||||
SHOW SLAVE STATUS NOLOCK;
|
||||
select count(*) from t;
|
||||
|
||||
connection slave;
|
||||
reap;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
START SLAVE;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
connection master;
|
||||
reap;
|
||||
DROP TABLE t;
|
||||
sync_slave_with_master;
|
@ -0,0 +1,12 @@
|
||||
drop table if exists t1;
|
||||
create table t (a int not null);
|
||||
insert into t values (1),(2),(3);
|
||||
SELECT SQL_NO_FCACHE SLEEP(0);
|
||||
SLEEP(0)
|
||||
0
|
||||
SELECT /*!40001 SQL_NO_CACHE */ /*!50084 SQL_NO_FCACHE */ * FROM t;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TABLE t;
|
@ -0,0 +1,11 @@
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
create table t (a int not null);
|
||||
insert into t values (1),(2),(3);
|
||||
|
||||
SELECT SQL_NO_FCACHE SLEEP(0);
|
||||
SELECT /*!40001 SQL_NO_CACHE */ /*!50084 SQL_NO_FCACHE */ * FROM t;
|
||||
|
||||
DROP TABLE t;
|
@ -1,13 +1,56 @@
|
||||
2010-11-11 The InnoDB Team
|
||||
* thr/thr0loc.c, trx/trx0i_s.c:
|
||||
Fix Bug#57802 Empty ASSERTION parameter passed to the HASH_SEARCH macro
|
||||
|
||||
2010-11-10 The InnoDB Team
|
||||
|
||||
* dict/dict0dict.c, handler/handler0alter.cc, include/dict0dict.h
|
||||
row/row0merge.c:
|
||||
Fix Bug#55084 InnoDB crash and corruption after ALTER TABLE
|
||||
|
||||
2010-11-10 The InnoDB Team
|
||||
|
||||
* srv/srv0start.c:
|
||||
Fix Bug#48026 Log start and end of InnoDB buffer pool
|
||||
initialization to the error log
|
||||
|
||||
2010-11-03 The InnoDB Team
|
||||
|
||||
* include/btr0btr.h, include/btr0btr.ic, dict/dict0crea.c:
|
||||
Fix Bug#57947 InnoDB diagnostics shows btr_block_get calls
|
||||
instead of real callers
|
||||
|
||||
2010-11-03 The InnoDB Team
|
||||
|
||||
* fil/fil0fil.c, fsp/fsp0fsp.c, handler/ha_innodb.cc,
|
||||
include/fil0fil.h, include/univ.i:
|
||||
Fix Bug #54538 - use of exclusive innodb dictionary lock limits
|
||||
performance.
|
||||
|
||||
2010-11-02 The InnoDB Team
|
||||
|
||||
* btr/btr0cur.c, dict/dict0dict.c, dict/dict0load.c,
|
||||
handler/ha_innodb.cc, include/dict0dict.h, row/row0mysql.c,
|
||||
innodb_bug53046.result, innodb_bug53046.test:
|
||||
Fix Bug#53046 dict_update_statistics_low can still be run
|
||||
concurrently on same table
|
||||
|
||||
2010-11-02 The InnoDB Team
|
||||
|
||||
* row/row0sel.c:
|
||||
Fix Bug#57799 READ UNCOMMITTED access failure of off-page
|
||||
DYNAMIC or COMPRESSED columns again
|
||||
|
||||
2010-10-24 The InnoDB Team
|
||||
|
||||
* row/row0mysql.c
|
||||
Fix Bug #57700 Latching order violation in
|
||||
Fix Bug#57700 Latching order violation in
|
||||
row_truncate_table_for_mysql()
|
||||
|
||||
2010-10-20 The InnoDB Team
|
||||
|
||||
* dict/dict0load.c
|
||||
Fix Bug #57616 Sig 11 in dict_load_table() when failed to load
|
||||
Fix Bug#57616 Sig 11 in dict_load_table() when failed to load
|
||||
index or foreign key
|
||||
|
||||
2010-10-19 The InnoDB Team
|
||||
@ -17,7 +60,7 @@
|
||||
include/ibuf0ibuf.h, include/row0mysql.h,
|
||||
row/row0mysql.c, row/row0sel.c,
|
||||
innodb_bug56680.test, innodb_bug56680.result:
|
||||
Fix Bug #56680 InnoDB may return wrong results from a
|
||||
Fix Bug#56680 InnoDB may return wrong results from a
|
||||
case-insensitive covering index
|
||||
|
||||
2010-10-18 The InnoDB Team
|
||||
@ -72,7 +115,7 @@
|
||||
2010-08-03 The InnoDB Team
|
||||
|
||||
* include/dict0dict.h, include/dict0dict.ic, row/row0mysql.c:
|
||||
Fix bug #54678, InnoDB, TRUNCATE, ALTER, I_S SELECT, crash or deadlock
|
||||
Fix Bug#54678 InnoDB, TRUNCATE, ALTER, I_S SELECT, crash or deadlock
|
||||
|
||||
2010-08-03 The InnoDB Team
|
||||
|
||||
@ -146,7 +189,7 @@
|
||||
|
||||
* dict/dict0load.c, fil/fil0fil.c:
|
||||
Fix Bug#54658: InnoDB: Warning: allocated tablespace %lu,
|
||||
old maximum was 0 (introduced in Bug #53578 fix)
|
||||
old maximum was 0 (introduced in Bug#53578 fix)
|
||||
|
||||
2010-06-16 The InnoDB Team
|
||||
|
||||
|
@ -1124,7 +1124,7 @@ btr_cur_ins_lock_and_undo(
|
||||
not zero, the parameters index and thr
|
||||
should be specified */
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert */
|
||||
const dtuple_t* entry, /*!< in: entry to insert */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
mtr_t* mtr, /*!< in/out: mini-transaction */
|
||||
ibool* inherit)/*!< out: TRUE if the inserted new record maybe
|
||||
@ -3582,11 +3582,9 @@ btr_estimate_number_of_different_key_vals(
|
||||
effective_pages = btr_estimate_n_pages_not_null(index, 1 /*k*/, first_rec_path);
|
||||
|
||||
if (!effective_pages) {
|
||||
dict_index_stat_mutex_enter(index);
|
||||
for (j = 0; j <= n_cols; j++) {
|
||||
index->stat_n_diff_key_vals[j] = (ib_int64_t)index->stat_n_leaf_pages;
|
||||
}
|
||||
dict_index_stat_mutex_exit(index);
|
||||
return;
|
||||
} else if (effective_pages > index->stat_n_leaf_pages) {
|
||||
effective_pages = index->stat_n_leaf_pages;
|
||||
@ -3728,8 +3726,6 @@ btr_estimate_number_of_different_key_vals(
|
||||
also the pages used for external storage of fields (those pages are
|
||||
included in index->stat_n_leaf_pages) */
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
|
||||
for (j = 0; j <= n_cols; j++) {
|
||||
index->stat_n_diff_key_vals[j]
|
||||
= ((n_diff[j]
|
||||
@ -3768,8 +3764,6 @@ btr_estimate_number_of_different_key_vals(
|
||||
}
|
||||
}
|
||||
|
||||
dict_index_stat_mutex_exit(index);
|
||||
|
||||
mem_free(n_diff);
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
mem_heap_free(heap);
|
||||
@ -4182,7 +4176,7 @@ Stores the fields in big_rec_vec to the tablespace and puts pointers to
|
||||
them in rec. The extern flags in rec will have to be set beforehand.
|
||||
The fields are stored on pages allocated from leaf node
|
||||
file segment of the index tree.
|
||||
@return DB_SUCCESS or error */
|
||||
@return DB_SUCCESS or DB_OUT_OF_FILE_SPACE */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
btr_store_big_rec_extern_fields(
|
||||
|
@ -53,6 +53,10 @@ Created 11/5/1995 Heikki Tuuri
|
||||
#include "page0zip.h"
|
||||
#include "trx0trx.h"
|
||||
#include "srv0start.h"
|
||||
#include "que0que.h"
|
||||
#include "read0read.h"
|
||||
#include "row0row.h"
|
||||
#include "ha_prototypes.h"
|
||||
|
||||
/* prototypes for new functions added to ha_innodb.cc */
|
||||
trx_t* innobase_get_trx();
|
||||
@ -310,6 +314,30 @@ read-ahead or flush occurs */
|
||||
UNIV_INTERN ibool buf_debug_prints = FALSE;
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
/* Buffer pool shared memory segment information */
|
||||
typedef struct buf_shm_info_struct buf_shm_info_t;
|
||||
|
||||
struct buf_shm_info_struct {
|
||||
char head_str[8];
|
||||
ulint binary_id;
|
||||
ibool is_new; /* during initializing */
|
||||
ibool clean; /* clean shutdowned and free */
|
||||
ibool reusable; /* reusable */
|
||||
ulint buf_pool_size; /* backup value */
|
||||
ulint page_size; /* backup value */
|
||||
ulint frame_offset; /* offset of the first frame based on chunk->mem */
|
||||
ulint zip_hash_offset;
|
||||
ulint zip_hash_n;
|
||||
|
||||
ulint checksum;
|
||||
|
||||
buf_pool_t buf_pool_backup;
|
||||
buf_chunk_t chunk_backup;
|
||||
|
||||
ib_uint64_t dummy;
|
||||
};
|
||||
|
||||
#define BUF_SHM_INFO_HEAD "XTRA_SHM"
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/********************************************************************//**
|
||||
@ -756,6 +784,45 @@ buf_block_init(
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
buf_block_reuse(
|
||||
/*============*/
|
||||
buf_block_t* block,
|
||||
ptrdiff_t frame_offset)
|
||||
{
|
||||
/* block_init */
|
||||
block->frame += frame_offset;
|
||||
|
||||
UNIV_MEM_DESC(block->frame, UNIV_PAGE_SIZE, block);
|
||||
|
||||
block->index = NULL;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* recreate later */
|
||||
block->page.in_page_hash = FALSE;
|
||||
block->page.in_zip_hash = FALSE;
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
||||
block->n_pointers = 0;
|
||||
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
||||
|
||||
if (block->page.zip.data)
|
||||
block->page.zip.data += frame_offset;
|
||||
|
||||
block->is_hashed = FALSE;
|
||||
|
||||
mutex_create(&block->mutex, SYNC_BUF_BLOCK);
|
||||
|
||||
rw_lock_create(&block->lock, SYNC_LEVEL_VARYING);
|
||||
ut_ad(rw_lock_validate(&(block->lock)));
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
rw_lock_create(&block->debug_latch, SYNC_NO_ORDER_CHECK);
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Allocates a chunk of buffer frames.
|
||||
@return chunk, or NULL on failure */
|
||||
@ -768,26 +835,188 @@ buf_chunk_init(
|
||||
{
|
||||
buf_block_t* block;
|
||||
byte* frame;
|
||||
ulint zip_hash_n = 0;
|
||||
ulint zip_hash_mem_size = 0;
|
||||
hash_table_t* zip_hash_tmp = NULL;
|
||||
ulint i;
|
||||
buf_shm_info_t* shm_info = NULL;
|
||||
|
||||
/* Round down to a multiple of page size,
|
||||
although it already should be. */
|
||||
mem_size = ut_2pow_round(mem_size, UNIV_PAGE_SIZE);
|
||||
|
||||
srv_buffer_pool_shm_is_reused = FALSE;
|
||||
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
/* zip_hash size */
|
||||
zip_hash_n = (mem_size / UNIV_PAGE_SIZE) * 2;
|
||||
zip_hash_mem_size = ut_2pow_round(hash_create_needed(zip_hash_n)
|
||||
+ (UNIV_PAGE_SIZE - 1), UNIV_PAGE_SIZE);
|
||||
}
|
||||
|
||||
/* Reserve space for the block descriptors. */
|
||||
mem_size += ut_2pow_round((mem_size / UNIV_PAGE_SIZE) * (sizeof *block)
|
||||
+ (UNIV_PAGE_SIZE - 1), UNIV_PAGE_SIZE);
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
mem_size += ut_2pow_round(sizeof(buf_shm_info_t)
|
||||
+ (UNIV_PAGE_SIZE - 1), UNIV_PAGE_SIZE);
|
||||
mem_size += zip_hash_mem_size;
|
||||
}
|
||||
|
||||
chunk->mem_size = mem_size;
|
||||
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
ulint binary_id;
|
||||
ibool is_new;
|
||||
|
||||
ut_a(buf_pool->n_chunks == 1);
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: The innodb_buffer_pool_shm_key option has been specified.\n"
|
||||
"InnoDB: Do not change the following between restarts of the server while this option is being used:\n"
|
||||
"InnoDB: * the mysqld executable between restarts of the server.\n"
|
||||
"InnoDB: * the value of innodb_buffer_pool_size.\n"
|
||||
"InnoDB: * the value of innodb_page_size.\n"
|
||||
"InnoDB: * datafiles created by InnoDB during this session.\n"
|
||||
"InnoDB: Otherwise, data corruption in datafiles may result.\n");
|
||||
|
||||
/* FIXME: This is vague id still */
|
||||
binary_id = (ulint) ((byte*)mtr_commit - (byte*)btr_root_get)
|
||||
+ (ulint) ((byte*)os_get_os_version - (byte*)buf_calc_page_new_checksum)
|
||||
+ (ulint) ((byte*)page_dir_find_owner_slot - (byte*)dfield_data_is_binary_equal)
|
||||
+ (ulint) ((byte*)que_graph_publish - (byte*)dict_casedn_str)
|
||||
+ (ulint) ((byte*)read_view_oldest_copy_or_open_new - (byte*)fil_space_get_version)
|
||||
+ (ulint) ((byte*)rec_get_n_extern_new - (byte*)fsp_get_size_low)
|
||||
+ (ulint) ((byte*)row_get_trx_id_offset - (byte*)ha_create_func)
|
||||
+ (ulint) ((byte*)srv_set_io_thread_op_info - (byte*)thd_is_replication_slave_thread)
|
||||
+ (ulint) ((byte*)mutex_create_func - (byte*)ibuf_inside)
|
||||
+ (ulint) ((byte*)trx_set_detailed_error - (byte*)lock_check_trx_id_sanity)
|
||||
+ (ulint) ((byte*)ut_time - (byte*)mem_heap_strdup);
|
||||
|
||||
chunk->mem = os_shm_alloc(&chunk->mem_size, srv_buffer_pool_shm_key, &is_new);
|
||||
|
||||
if (UNIV_UNLIKELY(chunk->mem == NULL)) {
|
||||
return(NULL);
|
||||
}
|
||||
init_again:
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
if (is_new) {
|
||||
memset(chunk->mem, '\0', chunk->mem_size);
|
||||
}
|
||||
#endif
|
||||
/* for ut_fold_binary_32(), these values should be 32-bit aligned */
|
||||
ut_a(sizeof(buf_shm_info_t) % 4 == 0);
|
||||
ut_a((ulint)chunk->mem % 4 == 0);
|
||||
ut_a(chunk->mem_size % 4 == 0);
|
||||
|
||||
shm_info = chunk->mem;
|
||||
|
||||
zip_hash_tmp = (hash_table_t*)((byte*)chunk->mem + chunk->mem_size - zip_hash_mem_size);
|
||||
|
||||
if (is_new) {
|
||||
strncpy(shm_info->head_str, BUF_SHM_INFO_HEAD, 8);
|
||||
shm_info->binary_id = binary_id;
|
||||
shm_info->is_new = TRUE; /* changed to FALSE when the initialization is finished */
|
||||
shm_info->clean = FALSE; /* changed to TRUE when free the segment. */
|
||||
shm_info->reusable = FALSE; /* changed to TRUE when validation is finished. */
|
||||
shm_info->buf_pool_size = srv_buf_pool_size;
|
||||
shm_info->page_size = srv_page_size;
|
||||
shm_info->zip_hash_offset = chunk->mem_size - zip_hash_mem_size;
|
||||
shm_info->zip_hash_n = zip_hash_n;
|
||||
} else {
|
||||
ulint checksum;
|
||||
|
||||
if (strncmp(shm_info->head_str, BUF_SHM_INFO_HEAD, 8)) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: The shared memory segment seems not to be for buffer pool.\n");
|
||||
return(NULL);
|
||||
}
|
||||
if (shm_info->binary_id != binary_id) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: The shared memory segment seems not to be for this binary.\n");
|
||||
return(NULL);
|
||||
}
|
||||
if (shm_info->is_new) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: The shared memory was not initialized yet.\n");
|
||||
return(NULL);
|
||||
}
|
||||
if (shm_info->buf_pool_size != srv_buf_pool_size) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: srv_buf_pool_size is different (shm=%lu current=%lu).\n",
|
||||
shm_info->buf_pool_size, srv_buf_pool_size);
|
||||
return(NULL);
|
||||
}
|
||||
if (shm_info->page_size != srv_page_size) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: srv_page_size is different (shm=%lu current=%lu).\n",
|
||||
shm_info->page_size, srv_page_size);
|
||||
return(NULL);
|
||||
}
|
||||
if (!shm_info->reusable) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: The shared memory has unrecoverable contents.\n"
|
||||
"InnoDB: The shared memory segment is initialized.\n");
|
||||
is_new = TRUE;
|
||||
goto init_again;
|
||||
}
|
||||
if (!shm_info->clean) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: The shared memory was not shut down cleanly.\n"
|
||||
"InnoDB: The shared memory segment is initialized.\n");
|
||||
is_new = TRUE;
|
||||
goto init_again;
|
||||
}
|
||||
|
||||
ut_a(shm_info->zip_hash_offset == chunk->mem_size - zip_hash_mem_size);
|
||||
ut_a(shm_info->zip_hash_n == zip_hash_n);
|
||||
|
||||
/* check checksum */
|
||||
if (srv_buffer_pool_shm_checksum) {
|
||||
checksum = ut_fold_binary_32((byte*)chunk->mem + sizeof(buf_shm_info_t),
|
||||
chunk->mem_size - sizeof(buf_shm_info_t));
|
||||
} else {
|
||||
checksum = BUF_NO_CHECKSUM_MAGIC;
|
||||
}
|
||||
|
||||
if (shm_info->checksum != BUF_NO_CHECKSUM_MAGIC
|
||||
&& shm_info->checksum != checksum) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: checksum of the shared memory is not match. "
|
||||
"(stored=%lu calculated=%lu)\n",
|
||||
shm_info->checksum, checksum);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* flag to use the segment. */
|
||||
shm_info->clean = FALSE; /* changed to TRUE when free the segment. */
|
||||
}
|
||||
|
||||
/* init zip_hash contents */
|
||||
if (is_new) {
|
||||
hash_create_init(zip_hash_tmp, zip_hash_n);
|
||||
} else {
|
||||
/* adjust offset is done later */
|
||||
hash_create_reuse(zip_hash_tmp);
|
||||
|
||||
srv_buffer_pool_shm_is_reused = TRUE;
|
||||
}
|
||||
} else {
|
||||
chunk->mem = os_mem_alloc_large(&chunk->mem_size);
|
||||
|
||||
if (UNIV_UNLIKELY(chunk->mem == NULL)) {
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate the block descriptors from
|
||||
the start of the memory block. */
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
chunk->blocks = (buf_block_t*)((byte*)chunk->mem + sizeof(buf_shm_info_t));
|
||||
} else {
|
||||
chunk->blocks = chunk->mem;
|
||||
}
|
||||
|
||||
/* Align a pointer to the first frame. Note that when
|
||||
os_large_page_size is smaller than UNIV_PAGE_SIZE,
|
||||
@ -795,8 +1024,13 @@ buf_chunk_init(
|
||||
it is bigger, we may allocate more blocks than requested. */
|
||||
|
||||
frame = ut_align(chunk->mem, UNIV_PAGE_SIZE);
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
/* reserve zip_hash space and always -1 for reproductibity */
|
||||
chunk->size = (chunk->mem_size - zip_hash_mem_size) / UNIV_PAGE_SIZE - 1;
|
||||
} else {
|
||||
chunk->size = chunk->mem_size / UNIV_PAGE_SIZE
|
||||
- (frame != chunk->mem);
|
||||
}
|
||||
|
||||
/* Subtract the space needed for block descriptors. */
|
||||
{
|
||||
@ -810,6 +1044,98 @@ buf_chunk_init(
|
||||
chunk->size = size;
|
||||
}
|
||||
|
||||
if (shm_info && !(shm_info->is_new)) {
|
||||
/* convert the shared memory segment for reuse */
|
||||
ptrdiff_t phys_offset;
|
||||
ptrdiff_t logi_offset;
|
||||
ptrdiff_t blocks_offset;
|
||||
void* previous_frame_address;
|
||||
|
||||
if (chunk->size < shm_info->chunk_backup.size) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: The buffer pool became smaller because of allocated address.\n"
|
||||
"InnoDB: Retrying may avoid this situation.\n");
|
||||
shm_info->clean = TRUE; /* release the flag for retrying */
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
chunk->size = shm_info->chunk_backup.size;
|
||||
phys_offset = frame - ((byte*)chunk->mem + shm_info->frame_offset);
|
||||
logi_offset = frame - chunk->blocks[0].frame;
|
||||
previous_frame_address = chunk->blocks[0].frame;
|
||||
blocks_offset = (byte*)chunk->blocks - (byte*)shm_info->chunk_backup.blocks;
|
||||
|
||||
if (phys_offset || logi_offset || blocks_offset) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Buffer pool in the shared memory segment should be converted.\n"
|
||||
"InnoDB: Previous frames in address : %p\n"
|
||||
"InnoDB: Previous frames were located : %p\n"
|
||||
"InnoDB: Current frames should be located: %p\n"
|
||||
"InnoDB: Pysical offset : %ld (%#lx)\n"
|
||||
"InnoDB: Logical offset (frames) : %ld (%#lx)\n"
|
||||
"InnoDB: Logical offset (blocks) : %ld (%#lx)\n",
|
||||
(byte*)chunk->mem + shm_info->frame_offset,
|
||||
chunk->blocks[0].frame, frame,
|
||||
phys_offset, phys_offset, logi_offset, logi_offset,
|
||||
blocks_offset, blocks_offset);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Buffer pool in the shared memory segment can be used as it is.\n");
|
||||
}
|
||||
|
||||
if (phys_offset) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Aligning physical offset...");
|
||||
|
||||
memmove(frame, (byte*)chunk->mem + shm_info->frame_offset,
|
||||
chunk->size * UNIV_PAGE_SIZE);
|
||||
|
||||
fprintf(stderr,
|
||||
" Done.\n");
|
||||
}
|
||||
|
||||
/* buf_block_t */
|
||||
block = chunk->blocks;
|
||||
for (i = chunk->size; i--; ) {
|
||||
buf_block_reuse(block, logi_offset);
|
||||
block++;
|
||||
}
|
||||
|
||||
if (logi_offset || blocks_offset) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Aligning logical offset...");
|
||||
|
||||
|
||||
/* buf_pool_t buf_pool_backup */
|
||||
UT_LIST_OFFSET(flush_list, buf_page_t, shm_info->buf_pool_backup.flush_list,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
UT_LIST_OFFSET(free, buf_page_t, shm_info->buf_pool_backup.free,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
UT_LIST_OFFSET(LRU, buf_page_t, shm_info->buf_pool_backup.LRU,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
if (shm_info->buf_pool_backup.LRU_old)
|
||||
shm_info->buf_pool_backup.LRU_old =
|
||||
(buf_page_t*)((byte*)(shm_info->buf_pool_backup.LRU_old)
|
||||
+ (((void*)shm_info->buf_pool_backup.LRU_old > previous_frame_address)
|
||||
? logi_offset : blocks_offset));
|
||||
|
||||
UT_LIST_OFFSET(unzip_LRU, buf_block_t, shm_info->buf_pool_backup.unzip_LRU,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
|
||||
UT_LIST_OFFSET(zip_list, buf_page_t, shm_info->buf_pool_backup.zip_clean,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
for (i = 0; i < BUF_BUDDY_SIZES_MAX; i++) {
|
||||
UT_LIST_OFFSET(zip_list, buf_page_t, shm_info->buf_pool_backup.zip_free[i],
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
}
|
||||
|
||||
HASH_OFFSET(zip_hash_tmp, buf_page_t, hash,
|
||||
previous_frame_address, logi_offset, blocks_offset);
|
||||
|
||||
fprintf(stderr,
|
||||
" Done.\n");
|
||||
}
|
||||
} else {
|
||||
/* Init block structs and assign frames for them. Then we
|
||||
assign the frames to the first blocks (we already mapped the
|
||||
memory above). */
|
||||
@ -833,6 +1159,11 @@ buf_chunk_init(
|
||||
block++;
|
||||
frame += UNIV_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
if (shm_info) {
|
||||
shm_info->frame_offset = chunk->blocks[0].frame - (byte*)chunk->mem;
|
||||
}
|
||||
|
||||
return(chunk);
|
||||
}
|
||||
@ -1014,6 +1345,8 @@ buf_chunk_free(
|
||||
UNIV_MEM_UNDESC(block);
|
||||
}
|
||||
|
||||
ut_a(!srv_buffer_pool_shm_key);
|
||||
|
||||
os_mem_free_large(chunk->mem, chunk->mem_size);
|
||||
}
|
||||
|
||||
@ -1063,7 +1396,10 @@ buf_pool_init(void)
|
||||
srv_buf_pool_curr_size = buf_pool->curr_size * UNIV_PAGE_SIZE;
|
||||
|
||||
buf_pool->page_hash = hash_create(2 * buf_pool->curr_size);
|
||||
/* zip_hash is allocated to shm when srv_buffer_pool_shm_key is enabled */
|
||||
if (!srv_buffer_pool_shm_key) {
|
||||
buf_pool->zip_hash = hash_create(2 * buf_pool->curr_size);
|
||||
}
|
||||
|
||||
buf_pool->last_printout_time = time(NULL);
|
||||
|
||||
@ -1078,6 +1414,86 @@ buf_pool_init(void)
|
||||
--------------------------- */
|
||||
/* All fields are initialized by mem_zalloc(). */
|
||||
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
buf_shm_info_t* shm_info;
|
||||
|
||||
ut_a((byte*)chunk->blocks == (byte*)chunk->mem + sizeof(buf_shm_info_t));
|
||||
shm_info = chunk->mem;
|
||||
|
||||
buf_pool->zip_hash = (hash_table_t*)((byte*)chunk->mem + shm_info->zip_hash_offset);
|
||||
|
||||
if(shm_info->is_new) {
|
||||
shm_info->is_new = FALSE; /* initialization was finished */
|
||||
} else {
|
||||
buf_block_t* block = chunk->blocks;
|
||||
buf_page_t* b;
|
||||
|
||||
/* shm_info->buf_pool_backup should be converted */
|
||||
/* at buf_chunk_init(). So copy simply. */
|
||||
buf_pool->flush_list = shm_info->buf_pool_backup.flush_list;
|
||||
buf_pool->freed_page_clock = shm_info->buf_pool_backup.freed_page_clock;
|
||||
buf_pool->free = shm_info->buf_pool_backup.free;
|
||||
buf_pool->LRU = shm_info->buf_pool_backup.LRU;
|
||||
buf_pool->LRU_old = shm_info->buf_pool_backup.LRU_old;
|
||||
buf_pool->LRU_old_len = shm_info->buf_pool_backup.LRU_old_len;
|
||||
buf_pool->unzip_LRU = shm_info->buf_pool_backup.unzip_LRU;
|
||||
buf_pool->zip_clean = shm_info->buf_pool_backup.zip_clean;
|
||||
for (i = 0; i < BUF_BUDDY_SIZES_MAX; i++) {
|
||||
buf_pool->zip_free[i] = shm_info->buf_pool_backup.zip_free[i];
|
||||
}
|
||||
|
||||
for (i = 0; i < chunk->size; i++, block++) {
|
||||
if (buf_block_get_state(block)
|
||||
== BUF_BLOCK_FILE_PAGE) {
|
||||
ut_d(block->page.in_page_hash = TRUE);
|
||||
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash,
|
||||
buf_page_address_fold(
|
||||
block->page.space,
|
||||
block->page.offset),
|
||||
&block->page);
|
||||
}
|
||||
}
|
||||
|
||||
for (b = UT_LIST_GET_FIRST(buf_pool->zip_clean); b;
|
||||
b = UT_LIST_GET_NEXT(zip_list, b)) {
|
||||
ut_ad(!b->in_flush_list);
|
||||
ut_ad(b->in_LRU_list);
|
||||
|
||||
ut_d(b->in_page_hash = TRUE);
|
||||
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash,
|
||||
buf_page_address_fold(b->space, b->offset), b);
|
||||
}
|
||||
|
||||
for (b = UT_LIST_GET_FIRST(buf_pool->flush_list); b;
|
||||
b = UT_LIST_GET_NEXT(flush_list, b)) {
|
||||
ut_ad(b->in_flush_list);
|
||||
ut_ad(b->in_LRU_list);
|
||||
|
||||
switch (buf_page_get_state(b)) {
|
||||
case BUF_BLOCK_ZIP_DIRTY:
|
||||
ut_d(b->in_page_hash = TRUE);
|
||||
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash,
|
||||
buf_page_address_fold(b->space,
|
||||
b->offset), b);
|
||||
break;
|
||||
case BUF_BLOCK_FILE_PAGE:
|
||||
/* uncompressed page */
|
||||
break;
|
||||
case BUF_BLOCK_ZIP_FREE:
|
||||
case BUF_BLOCK_ZIP_PAGE:
|
||||
case BUF_BLOCK_NOT_USED:
|
||||
case BUF_BLOCK_READY_FOR_USE:
|
||||
case BUF_BLOCK_MEMORY:
|
||||
case BUF_BLOCK_REMOVE_HASH:
|
||||
ut_error;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
mutex_exit(&LRU_list_mutex);
|
||||
rw_lock_x_unlock(&page_hash_latch);
|
||||
buf_pool_mutex_exit();
|
||||
@ -1102,6 +1518,34 @@ buf_pool_free(void)
|
||||
buf_chunk_t* chunk;
|
||||
buf_chunk_t* chunks;
|
||||
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
buf_shm_info_t* shm_info;
|
||||
|
||||
ut_a(buf_pool->n_chunks == 1);
|
||||
|
||||
chunk = buf_pool->chunks;
|
||||
shm_info = chunk->mem;
|
||||
ut_a((byte*)chunk->blocks == (byte*)chunk->mem + sizeof(buf_shm_info_t));
|
||||
|
||||
/* validation the shared memory segment doesn't have unrecoverable contents. */
|
||||
/* Currently, validation became not needed */
|
||||
shm_info->reusable = TRUE;
|
||||
|
||||
memcpy(&(shm_info->buf_pool_backup), buf_pool, sizeof(buf_pool_t));
|
||||
memcpy(&(shm_info->chunk_backup), chunk, sizeof(buf_chunk_t));
|
||||
|
||||
if (srv_fast_shutdown < 2) {
|
||||
if (srv_buffer_pool_shm_checksum) {
|
||||
shm_info->checksum = ut_fold_binary_32((byte*)chunk->mem + sizeof(buf_shm_info_t),
|
||||
chunk->mem_size - sizeof(buf_shm_info_t));
|
||||
} else {
|
||||
shm_info->checksum = BUF_NO_CHECKSUM_MAGIC;
|
||||
}
|
||||
shm_info->clean = TRUE;
|
||||
}
|
||||
|
||||
os_shm_free(chunk->mem, chunk->mem_size);
|
||||
} else {
|
||||
chunks = buf_pool->chunks;
|
||||
chunk = chunks + buf_pool->n_chunks;
|
||||
|
||||
@ -1110,10 +1554,13 @@ buf_pool_free(void)
|
||||
would fail at shutdown. */
|
||||
os_mem_free_large(chunk->mem, chunk->mem_size);
|
||||
}
|
||||
}
|
||||
|
||||
mem_free(buf_pool->chunks);
|
||||
hash_table_free(buf_pool->page_hash);
|
||||
if (!srv_buffer_pool_shm_key) {
|
||||
hash_table_free(buf_pool->zip_hash);
|
||||
}
|
||||
mem_free(buf_pool);
|
||||
buf_pool = NULL;
|
||||
}
|
||||
@ -1308,6 +1755,11 @@ try_again:
|
||||
//buf_pool_mutex_enter();
|
||||
mutex_enter(&LRU_list_mutex);
|
||||
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
/* Cannot support shrink */
|
||||
goto func_done;
|
||||
}
|
||||
|
||||
shrink_again:
|
||||
if (buf_pool->n_chunks <= 1) {
|
||||
|
||||
@ -1551,6 +2003,11 @@ void
|
||||
buf_pool_resize(void)
|
||||
/*=================*/
|
||||
{
|
||||
if (srv_buffer_pool_shm_key) {
|
||||
/* Cannot support resize */
|
||||
return;
|
||||
}
|
||||
|
||||
//buf_pool_mutex_enter();
|
||||
mutex_enter(&LRU_list_mutex);
|
||||
|
||||
|
@ -1811,9 +1811,9 @@ buf_flush_validate_low(void)
|
||||
ut_a(om > 0);
|
||||
|
||||
if (UNIV_LIKELY_NULL(buf_pool->flush_rbt)) {
|
||||
buf_page_t* rpage;
|
||||
ut_a(rnode);
|
||||
buf_page_t* rpage = *rbt_value(buf_page_t*,
|
||||
rnode);
|
||||
rpage = *rbt_value(buf_page_t*, rnode);
|
||||
ut_a(rpage);
|
||||
ut_a(rpage == bpage);
|
||||
rnode = rbt_next(buf_pool->flush_rbt, rnode);
|
||||
|
@ -2265,7 +2265,7 @@ buf_LRU_file_restore(void)
|
||||
ulint req = 0;
|
||||
ibool terminated = FALSE;
|
||||
ibool ret = FALSE;
|
||||
dump_record_t* records= 0;
|
||||
dump_record_t* records = NULL;
|
||||
ulint size;
|
||||
ulint size_high;
|
||||
ulint length;
|
||||
|
@ -894,7 +894,7 @@ dict_truncate_index_tree(
|
||||
appropriate field in the SYS_INDEXES record: this mini-transaction
|
||||
marks the B-tree totally truncated */
|
||||
|
||||
btr_page_get(space, zip_size, root_page_no, RW_X_LATCH, mtr);
|
||||
btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr);
|
||||
|
||||
btr_free_root(space, zip_size, root_page_no, mtr);
|
||||
create:
|
||||
|
@ -81,9 +81,18 @@ UNIV_INTERN rw_lock_t dict_operation_lock;
|
||||
/** Identifies generated InnoDB foreign key names */
|
||||
static char dict_ibfk[] = "_ibfk_";
|
||||
|
||||
/** array of mutexes protecting dict_index_t::stat_n_diff_key_vals[] */
|
||||
#define DICT_INDEX_STAT_MUTEX_SIZE 32
|
||||
static mutex_t dict_index_stat_mutex[DICT_INDEX_STAT_MUTEX_SIZE];
|
||||
/** array of rw locks protecting
|
||||
dict_table_t::stat_initialized
|
||||
dict_table_t::stat_n_rows (*)
|
||||
dict_table_t::stat_clustered_index_size
|
||||
dict_table_t::stat_sum_of_other_index_sizes
|
||||
dict_table_t::stat_modified_counter (*)
|
||||
dict_table_t::indexes*::stat_n_diff_key_vals[]
|
||||
dict_table_t::indexes*::stat_index_size
|
||||
dict_table_t::indexes*::stat_n_leaf_pages
|
||||
(*) those are not always protected for performance reasons */
|
||||
#define DICT_TABLE_STATS_LATCHES_SIZE 64
|
||||
static rw_lock_t dict_table_stats_latches[DICT_TABLE_STATS_LATCHES_SIZE];
|
||||
|
||||
/*******************************************************************//**
|
||||
Tries to find column names for the index and sets the col field of the
|
||||
@ -244,43 +253,65 @@ dict_mutex_exit_for_mysql(void)
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
}
|
||||
|
||||
/** Get the mutex that protects index->stat_n_diff_key_vals[] */
|
||||
#define GET_INDEX_STAT_MUTEX(index) \
|
||||
(&dict_index_stat_mutex[ut_fold_dulint(index->id) \
|
||||
% DICT_INDEX_STAT_MUTEX_SIZE])
|
||||
/** Get the latch that protects the stats of a given table */
|
||||
#define GET_TABLE_STATS_LATCH(table) \
|
||||
(&dict_table_stats_latches[ut_fold_dulint(table->id) \
|
||||
% DICT_TABLE_STATS_LATCHES_SIZE])
|
||||
|
||||
/**********************************************************************//**
|
||||
Lock the appropriate mutex to protect index->stat_n_diff_key_vals[].
|
||||
index->id is used to pick the right mutex and it should not change
|
||||
before dict_index_stat_mutex_exit() is called on this index. */
|
||||
Lock the appropriate latch to protect a given table's statistics.
|
||||
table->id is used to pick the corresponding latch from a global array of
|
||||
latches. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_index_stat_mutex_enter(
|
||||
/*========================*/
|
||||
const dict_index_t* index) /*!< in: index */
|
||||
dict_table_stats_lock(
|
||||
/*==================*/
|
||||
const dict_table_t* table, /*!< in: table */
|
||||
ulint latch_mode) /*!< in: RW_S_LATCH or
|
||||
RW_X_LATCH */
|
||||
{
|
||||
ut_ad(index != NULL);
|
||||
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
||||
ut_ad(index->cached);
|
||||
ut_ad(!index->to_be_dropped);
|
||||
ut_ad(table != NULL);
|
||||
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
||||
|
||||
mutex_enter(GET_INDEX_STAT_MUTEX(index));
|
||||
switch (latch_mode) {
|
||||
case RW_S_LATCH:
|
||||
rw_lock_s_lock(GET_TABLE_STATS_LATCH(table));
|
||||
break;
|
||||
case RW_X_LATCH:
|
||||
rw_lock_x_lock(GET_TABLE_STATS_LATCH(table));
|
||||
break;
|
||||
case RW_NO_LATCH:
|
||||
/* fall through */
|
||||
default:
|
||||
ut_error;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
Unlock the appropriate mutex that protects index->stat_n_diff_key_vals[]. */
|
||||
Unlock the latch that has been locked by dict_table_stats_lock() */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_index_stat_mutex_exit(
|
||||
/*=======================*/
|
||||
const dict_index_t* index) /*!< in: index */
|
||||
dict_table_stats_unlock(
|
||||
/*====================*/
|
||||
const dict_table_t* table, /*!< in: table */
|
||||
ulint latch_mode) /*!< in: RW_S_LATCH or
|
||||
RW_X_LATCH */
|
||||
{
|
||||
ut_ad(index != NULL);
|
||||
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
||||
ut_ad(index->cached);
|
||||
ut_ad(!index->to_be_dropped);
|
||||
ut_ad(table != NULL);
|
||||
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
||||
|
||||
mutex_exit(GET_INDEX_STAT_MUTEX(index));
|
||||
switch (latch_mode) {
|
||||
case RW_S_LATCH:
|
||||
rw_lock_s_unlock(GET_TABLE_STATS_LATCH(table));
|
||||
break;
|
||||
case RW_X_LATCH:
|
||||
rw_lock_x_unlock(GET_TABLE_STATS_LATCH(table));
|
||||
break;
|
||||
case RW_NO_LATCH:
|
||||
/* fall through */
|
||||
default:
|
||||
ut_error;
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
@ -671,8 +702,8 @@ dict_init(void)
|
||||
|
||||
mutex_create(&dict_foreign_err_mutex, SYNC_ANY_LATCH);
|
||||
|
||||
for (i = 0; i < DICT_INDEX_STAT_MUTEX_SIZE; i++) {
|
||||
mutex_create(&dict_index_stat_mutex[i], SYNC_INDEX_TREE);
|
||||
for (i = 0; i < DICT_TABLE_STATS_LATCHES_SIZE; i++) {
|
||||
rw_lock_create(&dict_table_stats_latches[i], SYNC_INDEX_TREE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -704,13 +735,12 @@ dict_table_get(
|
||||
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
|
||||
if (table != NULL) {
|
||||
if (!table->stat_initialized && !table->is_corrupt) {
|
||||
/* If table->ibd_file_missing == TRUE, this will
|
||||
print an error message and return without doing
|
||||
anything. */
|
||||
dict_update_statistics(table, FALSE);
|
||||
}
|
||||
if (table != NULL && !table->is_corrupt) {
|
||||
/* If table->ibd_file_missing == TRUE, this will
|
||||
print an error message and return without doing
|
||||
anything. */
|
||||
dict_update_statistics(table, TRUE /* only update stats
|
||||
if they have not been initialized */, FALSE);
|
||||
}
|
||||
|
||||
return(table);
|
||||
@ -4366,11 +4396,9 @@ next_rec:
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
for (i = 0; i <= n_cols; i++) {
|
||||
index->stat_n_diff_key_vals[i] = stat_n_diff_key_vals_tmp[i];
|
||||
}
|
||||
dict_index_stat_mutex_exit(index);
|
||||
}
|
||||
/*===========================================*/
|
||||
|
||||
@ -4424,11 +4452,9 @@ dict_store_statistics(
|
||||
n_cols = dict_index_get_n_unique(index);
|
||||
stat_n_diff_key_vals_tmp = mem_heap_zalloc(heap, (n_cols + 1) * sizeof(ib_int64_t));
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
for (i = 0; i <= n_cols; i++) {
|
||||
stat_n_diff_key_vals_tmp[i] = index->stat_n_diff_key_vals[i];
|
||||
}
|
||||
dict_index_stat_mutex_exit(index);
|
||||
|
||||
sys_stats = dict_sys->sys_stats;
|
||||
sys_index = UT_LIST_GET_FIRST(sys_stats->indexes);
|
||||
@ -4504,12 +4530,13 @@ Calculates new estimates for table and index statistics. The statistics
|
||||
are used in query optimization. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_update_statistics_low(
|
||||
/*=======================*/
|
||||
dict_update_statistics(
|
||||
/*===================*/
|
||||
dict_table_t* table, /*!< in/out: table */
|
||||
ibool has_dict_mutex __attribute__((unused)),
|
||||
/*!< in: TRUE if the caller has the
|
||||
dictionary mutex */
|
||||
ibool only_calc_if_missing_stats, /*!< in: only
|
||||
update/recalc the stats if they have
|
||||
not been initialized yet, otherwise
|
||||
do nothing */
|
||||
ibool sync) /*!< in: TRUE if must update SYS_STATS */
|
||||
{
|
||||
dict_index_t* index;
|
||||
@ -4528,6 +4555,8 @@ dict_update_statistics_low(
|
||||
}
|
||||
|
||||
if (srv_use_sys_stats_table && !((table->flags >> DICT_TF2_SHIFT) & DICT_TF2_TEMPORARY) && !sync) {
|
||||
dict_table_stats_lock(table, RW_X_LATCH);
|
||||
|
||||
/* reload statistics from SYS_STATS table */
|
||||
if (dict_reload_statistics(table, &sum_of_index_sizes)) {
|
||||
/* success */
|
||||
@ -4537,6 +4566,8 @@ dict_update_statistics_low(
|
||||
#endif
|
||||
goto end;
|
||||
}
|
||||
|
||||
dict_table_stats_unlock(table, RW_X_LATCH);
|
||||
}
|
||||
#ifdef UNIV_DEBUG
|
||||
fprintf(stderr, "InnoDB: DEBUG: update_statistics for %s.\n",
|
||||
@ -4555,6 +4586,13 @@ dict_update_statistics_low(
|
||||
return;
|
||||
}
|
||||
|
||||
dict_table_stats_lock(table, RW_X_LATCH);
|
||||
|
||||
if (only_calc_if_missing_stats && table->stat_initialized) {
|
||||
dict_table_stats_unlock(table, RW_X_LATCH);
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
if (table->is_corrupt) {
|
||||
ut_a(srv_pass_corrupt_table);
|
||||
@ -4609,13 +4647,9 @@ dict_update_statistics_low(
|
||||
end:
|
||||
index = dict_table_get_first_index(table);
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
|
||||
table->stat_n_rows = index->stat_n_diff_key_vals[
|
||||
dict_index_get_n_unique(index)];
|
||||
|
||||
dict_index_stat_mutex_exit(index);
|
||||
|
||||
table->stat_clustered_index_size = index->stat_index_size;
|
||||
|
||||
table->stat_sum_of_other_index_sizes = sum_of_index_sizes
|
||||
@ -4624,19 +4658,8 @@ end:
|
||||
table->stat_initialized = TRUE;
|
||||
|
||||
table->stat_modified_counter = 0;
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Calculates new estimates for table and index statistics. The statistics
|
||||
are used in query optimization. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_update_statistics(
|
||||
/*===================*/
|
||||
dict_table_t* table, /*!< in/out: table */
|
||||
ibool sync)
|
||||
{
|
||||
dict_update_statistics_low(table, FALSE, sync);
|
||||
dict_table_stats_unlock(table, RW_X_LATCH);
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
@ -4716,8 +4739,9 @@ dict_table_print_low(
|
||||
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
|
||||
if (srv_stats_auto_update)
|
||||
dict_update_statistics_low(table, TRUE, FALSE);
|
||||
dict_update_statistics(table, FALSE /* update even if initialized */, FALSE);
|
||||
|
||||
dict_table_stats_lock(table, RW_S_LATCH);
|
||||
|
||||
fprintf(stderr,
|
||||
"--------------------------------------\n"
|
||||
@ -4746,6 +4770,8 @@ dict_table_print_low(
|
||||
index = UT_LIST_GET_NEXT(indexes, index);
|
||||
}
|
||||
|
||||
dict_table_stats_unlock(table, RW_S_LATCH);
|
||||
|
||||
foreign = UT_LIST_GET_FIRST(table->foreign_list);
|
||||
|
||||
while (foreign != NULL) {
|
||||
@ -4794,8 +4820,6 @@ dict_index_print_low(
|
||||
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
|
||||
if (index->n_user_defined_cols > 0) {
|
||||
n_vals = index->stat_n_diff_key_vals[
|
||||
index->n_user_defined_cols];
|
||||
@ -4803,8 +4827,6 @@ dict_index_print_low(
|
||||
n_vals = index->stat_n_diff_key_vals[1];
|
||||
}
|
||||
|
||||
dict_index_stat_mutex_exit(index);
|
||||
|
||||
fprintf(stderr,
|
||||
" INDEX: name %s, id %lu %lu, fields %lu/%lu,"
|
||||
" uniq %lu, type %lu\n"
|
||||
@ -5148,7 +5170,8 @@ void
|
||||
dict_table_replace_index_in_foreign_list(
|
||||
/*=====================================*/
|
||||
dict_table_t* table, /*!< in/out: table */
|
||||
dict_index_t* index) /*!< in: index to be replaced */
|
||||
dict_index_t* index, /*!< in: index to be replaced */
|
||||
const trx_t* trx) /*!< in: transaction handle */
|
||||
{
|
||||
dict_foreign_t* foreign;
|
||||
|
||||
@ -5159,7 +5182,13 @@ dict_table_replace_index_in_foreign_list(
|
||||
if (foreign->foreign_index == index) {
|
||||
dict_index_t* new_index
|
||||
= dict_foreign_find_equiv_index(foreign);
|
||||
ut_a(new_index);
|
||||
|
||||
/* There must exist an alternative index if
|
||||
check_foreigns (FOREIGN_KEY_CHECKS) is on,
|
||||
since ha_innobase::prepare_drop_index had done
|
||||
the check before we reach here. */
|
||||
|
||||
ut_a(new_index || !trx->check_foreigns);
|
||||
|
||||
foreign->foreign_index = new_index;
|
||||
}
|
||||
@ -5293,8 +5322,8 @@ dict_close(void)
|
||||
mem_free(dict_sys);
|
||||
dict_sys = NULL;
|
||||
|
||||
for (i = 0; i < DICT_INDEX_STAT_MUTEX_SIZE; i++) {
|
||||
mutex_free(&dict_index_stat_mutex[i]);
|
||||
for (i = 0; i < DICT_TABLE_STATS_LATCHES_SIZE; i++) {
|
||||
rw_lock_free(&dict_table_stats_latches[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,8 +222,9 @@ loop:
|
||||
/* The table definition was corrupt if there
|
||||
is no index */
|
||||
|
||||
if (srv_stats_auto_update && dict_table_get_first_index(table)) {
|
||||
dict_update_statistics_low(table, TRUE, FALSE);
|
||||
if (dict_table_get_first_index(table)) {
|
||||
dict_update_statistics(table, FALSE /* update
|
||||
even if initialized */, FALSE);
|
||||
}
|
||||
|
||||
dict_table_print_low(table);
|
||||
|
@ -336,14 +336,15 @@ fil_get_space_id_for_table(
|
||||
/*******************************************************************//**
|
||||
Frees a space object from the tablespace memory cache. Closes the files in
|
||||
the chain but does not delete them. There must not be any pending i/o's or
|
||||
flushes on the files. */
|
||||
flushes on the files.
|
||||
@return TRUE on success */
|
||||
static
|
||||
ibool
|
||||
fil_space_free(
|
||||
/*===========*/
|
||||
/* out: TRUE if success */
|
||||
ulint id, /* in: space id */
|
||||
ibool own_mutex);/* in: TRUE if own system->mutex */
|
||||
ulint id, /* in: space id */
|
||||
ibool x_latched); /* in: TRUE if caller has space->latch
|
||||
in X mode */
|
||||
/********************************************************************//**
|
||||
Reads data from a space to a buffer. Remember that the possible incomplete
|
||||
blocks at the end of file are ignored: they are not taken into account when
|
||||
@ -617,7 +618,7 @@ fil_node_create(
|
||||
|
||||
UT_LIST_ADD_LAST(chain, space->chain, node);
|
||||
|
||||
if (id < SRV_LOG_SPACE_FIRST_ID && fil_system->max_assigned_id < id) {
|
||||
if (id < SRV_EXTRA_SYS_SPACE_FIRST_ID && fil_system->max_assigned_id < id) {
|
||||
|
||||
fil_system->max_assigned_id = id;
|
||||
}
|
||||
@ -1130,6 +1131,7 @@ try_again:
|
||||
space = fil_space_get_by_name(name);
|
||||
|
||||
if (UNIV_LIKELY_NULL(space)) {
|
||||
ibool success;
|
||||
ulint namesake_id;
|
||||
|
||||
ut_print_timestamp(stderr);
|
||||
@ -1168,9 +1170,10 @@ try_again:
|
||||
|
||||
namesake_id = space->id;
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
success = fil_space_free(namesake_id, FALSE);
|
||||
ut_a(success);
|
||||
|
||||
fil_space_free(namesake_id, FALSE);
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
goto try_again;
|
||||
}
|
||||
@ -1205,6 +1208,7 @@ try_again:
|
||||
space->mark = FALSE;
|
||||
|
||||
if (UNIV_LIKELY(purpose == FIL_TABLESPACE && !recv_recovery_on)
|
||||
&& UNIV_UNLIKELY(id < SRV_EXTRA_SYS_SPACE_FIRST_ID)
|
||||
&& UNIV_UNLIKELY(id > fil_system->max_assigned_id)) {
|
||||
if (!fil_system->space_id_reuse_warned) {
|
||||
fil_system->space_id_reuse_warned = TRUE;
|
||||
@ -1290,7 +1294,7 @@ fil_assign_new_space_id(
|
||||
(ulong) SRV_LOG_SPACE_FIRST_ID);
|
||||
}
|
||||
|
||||
success = (id < SRV_LOG_SPACE_FIRST_ID);
|
||||
success = (id < SRV_EXTRA_SYS_SPACE_FIRST_ID);
|
||||
|
||||
if (success) {
|
||||
*space_id = fil_system->max_assigned_id = id;
|
||||
@ -1323,15 +1327,14 @@ fil_space_free(
|
||||
/*===========*/
|
||||
/* out: TRUE if success */
|
||||
ulint id, /* in: space id */
|
||||
ibool own_mutex) /* in: TRUE if own system->mutex */
|
||||
ibool x_latched) /* in: TRUE if caller has space->latch
|
||||
in X mode */
|
||||
{
|
||||
fil_space_t* space;
|
||||
fil_space_t* namespace;
|
||||
fil_node_t* fil_node;
|
||||
|
||||
if (!own_mutex) {
|
||||
mutex_enter(&fil_system->mutex);
|
||||
}
|
||||
ut_ad(mutex_own(&fil_system->mutex));
|
||||
|
||||
space = fil_space_get_by_id(id);
|
||||
|
||||
@ -1342,8 +1345,6 @@ fil_space_free(
|
||||
" from the cache but\n"
|
||||
"InnoDB: it is not there.\n", (ulong) id);
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
@ -1378,8 +1379,8 @@ fil_space_free(
|
||||
|
||||
ut_a(0 == UT_LIST_GET_LEN(space->chain));
|
||||
|
||||
if (!own_mutex) {
|
||||
mutex_exit(&fil_system->mutex);
|
||||
if (x_latched) {
|
||||
rw_lock_x_unlock(&space->latch);
|
||||
}
|
||||
|
||||
rw_lock_free(&(space->latch));
|
||||
@ -1626,25 +1627,27 @@ fil_close_all_files(void)
|
||||
/*=====================*/
|
||||
{
|
||||
fil_space_t* space;
|
||||
fil_node_t* node;
|
||||
|
||||
mutex_enter(&fil_system->mutex);
|
||||
|
||||
space = UT_LIST_GET_FIRST(fil_system->space_list);
|
||||
|
||||
while (space != NULL) {
|
||||
fil_node_t* node;
|
||||
fil_space_t* prev_space = space;
|
||||
|
||||
node = UT_LIST_GET_FIRST(space->chain);
|
||||
for (node = UT_LIST_GET_FIRST(space->chain);
|
||||
node != NULL;
|
||||
node = UT_LIST_GET_NEXT(chain, node)) {
|
||||
|
||||
while (node != NULL) {
|
||||
if (node->open) {
|
||||
fil_node_close_file(node, fil_system);
|
||||
}
|
||||
node = UT_LIST_GET_NEXT(chain, node);
|
||||
}
|
||||
|
||||
space = UT_LIST_GET_NEXT(space_list, space);
|
||||
fil_space_free(prev_space->id, TRUE);
|
||||
|
||||
fil_space_free(prev_space->id, FALSE);
|
||||
}
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
@ -1666,6 +1669,10 @@ fil_set_max_space_id_if_bigger(
|
||||
ut_error;
|
||||
}
|
||||
|
||||
if (max_id >= SRV_EXTRA_SYS_SPACE_FIRST_ID) {
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_enter(&fil_system->mutex);
|
||||
|
||||
if (fil_system->max_assigned_id < max_id) {
|
||||
@ -1684,6 +1691,7 @@ static
|
||||
ulint
|
||||
fil_write_lsn_and_arch_no_to_file(
|
||||
/*==============================*/
|
||||
ulint space_id,
|
||||
ulint sum_of_sizes, /*!< in: combined size of previous files
|
||||
in space, in database pages */
|
||||
ib_uint64_t lsn, /*!< in: lsn to write */
|
||||
@ -1693,14 +1701,16 @@ fil_write_lsn_and_arch_no_to_file(
|
||||
byte* buf1;
|
||||
byte* buf;
|
||||
|
||||
ut_a(trx_sys_sys_space(space_id));
|
||||
|
||||
buf1 = mem_alloc(2 * UNIV_PAGE_SIZE);
|
||||
buf = ut_align(buf1, UNIV_PAGE_SIZE);
|
||||
|
||||
fil_read(TRUE, 0, 0, sum_of_sizes, 0, UNIV_PAGE_SIZE, buf, NULL);
|
||||
fil_read(TRUE, space_id, 0, sum_of_sizes, 0, UNIV_PAGE_SIZE, buf, NULL);
|
||||
|
||||
mach_write_ull(buf + FIL_PAGE_FILE_FLUSH_LSN, lsn);
|
||||
|
||||
fil_write(TRUE, 0, 0, sum_of_sizes, 0, UNIV_PAGE_SIZE, buf, NULL);
|
||||
fil_write(TRUE, space_id, 0, sum_of_sizes, 0, UNIV_PAGE_SIZE, buf, NULL);
|
||||
|
||||
mem_free(buf1);
|
||||
|
||||
@ -1736,7 +1746,7 @@ fil_write_flushed_lsn_to_data_files(
|
||||
always open. */
|
||||
|
||||
if (space->purpose == FIL_TABLESPACE
|
||||
&& space->id == 0) {
|
||||
&& trx_sys_sys_space(space->id)) {
|
||||
sum_of_sizes = 0;
|
||||
|
||||
node = UT_LIST_GET_FIRST(space->chain);
|
||||
@ -1744,7 +1754,7 @@ fil_write_flushed_lsn_to_data_files(
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
err = fil_write_lsn_and_arch_no_to_file(
|
||||
sum_of_sizes, lsn, arch_log_no);
|
||||
space->id, sum_of_sizes, lsn, arch_log_no);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
return(err);
|
||||
@ -2264,6 +2274,19 @@ try_again:
|
||||
path = mem_strdup(space->name);
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
/* Important: We rely on the data dictionary mutex to ensure
|
||||
that a race is not possible here. It should serialize the tablespace
|
||||
drop/free. We acquire an X latch only to avoid a race condition
|
||||
when accessing the tablespace instance via:
|
||||
|
||||
fsp_get_available_space_in_free_extents().
|
||||
|
||||
There our main motivation is to reduce the contention on the
|
||||
dictionary mutex. */
|
||||
|
||||
rw_lock_x_lock(&space->latch);
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/* Invalidate in the buffer pool all pages belonging to the
|
||||
tablespace. Since we have set space->is_being_deleted = TRUE, readahead
|
||||
@ -2276,7 +2299,11 @@ try_again:
|
||||
#endif
|
||||
/* printf("Deleting tablespace %s id %lu\n", space->name, id); */
|
||||
|
||||
success = fil_space_free(id, FALSE);
|
||||
mutex_enter(&fil_system->mutex);
|
||||
|
||||
success = fil_space_free(id, TRUE);
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
if (success) {
|
||||
success = os_file_delete(path);
|
||||
@ -2284,6 +2311,8 @@ try_again:
|
||||
if (!success) {
|
||||
success = os_file_delete_if_exists(path);
|
||||
}
|
||||
} else {
|
||||
rw_lock_x_unlock(&space->latch);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
@ -2311,6 +2340,31 @@ try_again:
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
Returns TRUE if a single-table tablespace is being deleted.
|
||||
@return TRUE if being deleted */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
fil_tablespace_is_being_deleted(
|
||||
/*============================*/
|
||||
ulint id) /*!< in: space id */
|
||||
{
|
||||
fil_space_t* space;
|
||||
ibool is_being_deleted;
|
||||
|
||||
mutex_enter(&fil_system->mutex);
|
||||
|
||||
space = fil_space_get_by_id(id);
|
||||
|
||||
ut_a(space != NULL);
|
||||
|
||||
is_being_deleted = space->is_being_deleted;
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
return(is_being_deleted);
|
||||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/*******************************************************************//**
|
||||
Discards a single-table tablespace. The tablespace must be cached in the
|
||||
@ -5342,7 +5396,7 @@ fil_page_get_type(
|
||||
return(mach_read_from_2(page + FIL_PAGE_TYPE));
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
/****************************************************************//**
|
||||
Initializes the tablespace memory cache. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
|
@ -3126,13 +3126,63 @@ fsp_get_available_space_in_free_extents(
|
||||
|
||||
ut_ad(!mutex_own(&kernel_mutex));
|
||||
|
||||
/* The convoluted mutex acquire is to overcome latching order
|
||||
issues: The problem is that the fil_mutex is at a lower level
|
||||
than the tablespace latch and the buffer pool mutex. We have to
|
||||
first prevent any operations on the file system by acquiring the
|
||||
dictionary mutex. Then acquire the tablespace latch to obey the
|
||||
latching order and then release the dictionary mutex. That way we
|
||||
ensure that the tablespace instance can't be freed while we are
|
||||
examining its contents (see fil_space_free()).
|
||||
|
||||
However, there is one further complication, we release the fil_mutex
|
||||
when we need to invalidate the the pages in the buffer pool and we
|
||||
reacquire the fil_mutex when deleting and freeing the tablespace
|
||||
instance in fil0fil.c. Here we need to account for that situation
|
||||
too. */
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
|
||||
/* At this stage there is no guarantee that the tablespace even
|
||||
exists in the cache. */
|
||||
|
||||
if (fil_tablespace_deleted_or_being_deleted_in_mem(space, -1)) {
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
return(ULLINT_UNDEFINED);
|
||||
}
|
||||
|
||||
mtr_start(&mtr);
|
||||
|
||||
latch = fil_space_get_latch(space, &flags);
|
||||
|
||||
/* This should ensure that the tablespace instance can't be freed
|
||||
by another thread. However, the tablespace pages can still be freed
|
||||
from the buffer pool. We need to check for that again. */
|
||||
|
||||
zip_size = dict_table_flags_to_zip_size(flags);
|
||||
|
||||
mtr_x_lock(latch, &mtr);
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
/* At this point it is possible for the tablespace to be deleted and
|
||||
its pages removed from the buffer pool. We need to check for that
|
||||
situation. However, the tablespace instance can't be deleted because
|
||||
our latching above should ensure that. */
|
||||
|
||||
if (fil_tablespace_is_being_deleted(space)) {
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
return(ULLINT_UNDEFINED);
|
||||
}
|
||||
|
||||
/* From here on even if the user has dropped the tablespace, the
|
||||
pages _must_ still exist in the buffer pool and the tablespace
|
||||
instance _must_ be in the file system hash table. */
|
||||
|
||||
space_header = fsp_get_space_header(space, zip_size, &mtr);
|
||||
|
||||
size = mtr_read_ulint(space_header + FSP_SIZE, MLOG_4BYTES, &mtr);
|
||||
|
@ -127,6 +127,70 @@ hash_create(
|
||||
return(table);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
*/
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
hash_create_needed(
|
||||
/*===============*/
|
||||
ulint n)
|
||||
{
|
||||
ulint prime;
|
||||
ulint offset;
|
||||
|
||||
prime = ut_find_prime(n);
|
||||
|
||||
offset = (sizeof(hash_table_t) + 7) / 8;
|
||||
offset *= 8;
|
||||
|
||||
return(offset + sizeof(hash_cell_t) * prime);
|
||||
}
|
||||
|
||||
UNIV_INTERN
|
||||
void
|
||||
hash_create_init(
|
||||
/*=============*/
|
||||
hash_table_t* table,
|
||||
ulint n)
|
||||
{
|
||||
ulint prime;
|
||||
ulint offset;
|
||||
|
||||
prime = ut_find_prime(n);
|
||||
|
||||
offset = (sizeof(hash_table_t) + 7) / 8;
|
||||
offset *= 8;
|
||||
|
||||
table->array = (hash_cell_t*)(((byte*)table) + offset);
|
||||
table->n_cells = prime;
|
||||
# if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
||||
table->adaptive = FALSE;
|
||||
# endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
||||
table->n_mutexes = 0;
|
||||
table->mutexes = NULL;
|
||||
table->heaps = NULL;
|
||||
table->heap = NULL;
|
||||
ut_d(table->magic_n = HASH_TABLE_MAGIC_N);
|
||||
|
||||
/* Initialize the cell array */
|
||||
hash_table_clear(table);
|
||||
}
|
||||
|
||||
UNIV_INTERN
|
||||
void
|
||||
hash_create_reuse(
|
||||
/*==============*/
|
||||
hash_table_t* table)
|
||||
{
|
||||
ulint offset;
|
||||
|
||||
offset = (sizeof(hash_table_t) + 7) / 8;
|
||||
offset *= 8;
|
||||
|
||||
table->array = (hash_cell_t*)(((byte*)table) + offset);
|
||||
ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
Frees a hash table. */
|
||||
UNIV_INTERN
|
||||
|
@ -149,6 +149,7 @@ static ulong innobase_read_io_threads;
|
||||
static ulong innobase_write_io_threads;
|
||||
|
||||
static ulong innobase_page_size;
|
||||
static ulong innobase_log_block_size;
|
||||
|
||||
static my_bool innobase_thread_concurrency_timer_based;
|
||||
static long long innobase_buffer_pool_size, innobase_log_file_size;
|
||||
@ -194,6 +195,7 @@ static my_bool innobase_rollback_on_timeout = FALSE;
|
||||
static my_bool innobase_create_status_file = FALSE;
|
||||
static my_bool innobase_stats_on_metadata = TRUE;
|
||||
static my_bool innobase_use_sys_stats_table = FALSE;
|
||||
static my_bool innobase_buffer_pool_shm_checksum = TRUE;
|
||||
|
||||
static char* internal_innobase_data_file_path = NULL;
|
||||
|
||||
@ -2114,6 +2116,32 @@ innobase_init(
|
||||
goto error;
|
||||
}
|
||||
|
||||
srv_log_block_size = 0;
|
||||
if (innobase_log_block_size != (1 << 9)) { /*!=512*/
|
||||
uint n_shift;
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: innodb_log_block_size has been changed from default value 512. (###EXPERIMENTAL### operation)\n");
|
||||
for (n_shift = 9; n_shift <= UNIV_PAGE_SIZE_SHIFT_MAX; n_shift++) {
|
||||
if (innobase_log_block_size == ((ulong)1 << n_shift)) {
|
||||
srv_log_block_size = (1 << n_shift);
|
||||
fprintf(stderr,
|
||||
"InnoDB: The log block size is set to %lu.\n",
|
||||
srv_log_block_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
srv_log_block_size = 512;
|
||||
}
|
||||
|
||||
if (!srv_log_block_size) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: %lu is not valid value for innodb_log_block_size.\n",
|
||||
innobase_log_block_size);
|
||||
goto error;
|
||||
}
|
||||
|
||||
#ifndef MYSQL_SERVER
|
||||
innodb_overwrite_relay_log_info = FALSE;
|
||||
#endif
|
||||
@ -2417,7 +2445,7 @@ innobase_change_buffering_inited_ok:
|
||||
srv_n_write_io_threads = (ulint) innobase_write_io_threads;
|
||||
|
||||
srv_read_ahead &= 3;
|
||||
srv_adaptive_checkpoint %= 3;
|
||||
srv_adaptive_checkpoint %= 4;
|
||||
|
||||
srv_force_recovery = (ulint) innobase_force_recovery;
|
||||
|
||||
@ -2426,6 +2454,7 @@ innobase_change_buffering_inited_ok:
|
||||
srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite;
|
||||
srv_use_checksums = (ibool) innobase_use_checksums;
|
||||
srv_fast_checksum = (ibool) innobase_fast_checksum;
|
||||
srv_buffer_pool_shm_checksum = (ibool) innobase_buffer_pool_shm_checksum;
|
||||
|
||||
#ifdef HAVE_LARGE_PAGES
|
||||
if ((os_use_large_pages = (ibool) my_use_large_pages))
|
||||
@ -3871,6 +3900,7 @@ retry:
|
||||
of length ref_length! */
|
||||
|
||||
if (!row_table_got_default_clust_index(ib_table)) {
|
||||
|
||||
prebuilt->clust_index_was_generated = FALSE;
|
||||
|
||||
if (UNIV_UNLIKELY(primary_key >= MAX_KEY)) {
|
||||
@ -6671,6 +6701,33 @@ create_clustered_index_when_no_primary(
|
||||
return(error);
|
||||
}
|
||||
|
||||
/*****************************************************************//**
|
||||
Return a display name for the row format
|
||||
@return row format name */
|
||||
|
||||
const char *get_row_format_name(
|
||||
/*============================*/
|
||||
enum row_type row_format) /*!< in: Row Format */
|
||||
{
|
||||
switch (row_format) {
|
||||
case ROW_TYPE_COMPACT:
|
||||
return("COMPACT");
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
return("COMPRESSED");
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
return("DYNAMIC");
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
return("REDUNDANT");
|
||||
case ROW_TYPE_DEFAULT:
|
||||
return("DEFAULT");
|
||||
case ROW_TYPE_FIXED:
|
||||
return("FIXED");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return("NOT USED");
|
||||
}
|
||||
|
||||
/*****************************************************************//**
|
||||
Validates the create options. We may build on this function
|
||||
in future. For now, it checks two specifiers:
|
||||
@ -6686,9 +6743,9 @@ create_options_are_valid(
|
||||
columns and indexes */
|
||||
HA_CREATE_INFO* create_info) /*!< in: create info. */
|
||||
{
|
||||
ibool kbs_specified = FALSE;
|
||||
ibool kbs_specified = FALSE;
|
||||
ibool ret = TRUE;
|
||||
|
||||
enum row_type row_type = form->s->row_type;
|
||||
|
||||
ut_ad(thd != NULL);
|
||||
|
||||
@ -6697,13 +6754,28 @@ create_options_are_valid(
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/* Check for a valid Innodb ROW_FORMAT specifier. For example,
|
||||
ROW_TYPE_FIXED can be sent to Innodb */
|
||||
switch (row_type) {
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
case ROW_TYPE_DEFAULT:
|
||||
break;
|
||||
default:
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: invalid ROW_FORMAT specifier.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
ut_ad(form != NULL);
|
||||
ut_ad(create_info != NULL);
|
||||
|
||||
/* First check if KEY_BLOCK_SIZE was specified. */
|
||||
if (create_info->key_block_size
|
||||
|| (create_info->used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE)) {
|
||||
|
||||
/* First check if a non-zero KEY_BLOCK_SIZE was specified. */
|
||||
if (create_info->key_block_size) {
|
||||
kbs_specified = TRUE;
|
||||
switch (create_info->key_block_size) {
|
||||
case 1:
|
||||
@ -6714,13 +6786,12 @@ create_options_are_valid(
|
||||
/* Valid value. */
|
||||
break;
|
||||
default:
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: invalid"
|
||||
" KEY_BLOCK_SIZE = %lu."
|
||||
" Valid values are"
|
||||
" [1, 2, 4, 8, 16]",
|
||||
create_info->key_block_size);
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: invalid KEY_BLOCK_SIZE = %lu."
|
||||
" Valid values are [1, 2, 4, 8, 16]",
|
||||
create_info->key_block_size);
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
@ -6728,109 +6799,67 @@ create_options_are_valid(
|
||||
/* If KEY_BLOCK_SIZE was specified, check for its
|
||||
dependencies. */
|
||||
if (kbs_specified && !srv_file_per_table) {
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
if (kbs_specified && srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_format >"
|
||||
" Antelope.");
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_format > Antelope.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
/* Now check for ROW_FORMAT specifier. */
|
||||
if (create_info->used_fields & HA_CREATE_USED_ROW_FORMAT) {
|
||||
switch (form->s->row_type) {
|
||||
const char* row_format_name;
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
row_format_name
|
||||
= form->s->row_type == ROW_TYPE_COMPRESSED
|
||||
? "COMPRESSED"
|
||||
: "DYNAMIC";
|
||||
|
||||
/* These two ROW_FORMATs require srv_file_per_table
|
||||
and srv_file_format > Antelope */
|
||||
if (!srv_file_per_table) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_per_table.",
|
||||
row_format_name);
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
if (srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_format >"
|
||||
" Antelope.",
|
||||
row_format_name);
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
/* Cannot specify KEY_BLOCK_SIZE with
|
||||
ROW_FORMAT = DYNAMIC.
|
||||
However, we do allow COMPRESSED to be
|
||||
specified with KEY_BLOCK_SIZE. */
|
||||
if (kbs_specified
|
||||
&& form->s->row_type == ROW_TYPE_DYNAMIC) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: cannot specify"
|
||||
" ROW_FORMAT = DYNAMIC with"
|
||||
" KEY_BLOCK_SIZE.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_DEFAULT:
|
||||
/* Default is COMPACT. */
|
||||
row_format_name
|
||||
= form->s->row_type == ROW_TYPE_REDUNDANT
|
||||
? "REDUNDANT"
|
||||
: "COMPACT";
|
||||
|
||||
/* Cannot specify KEY_BLOCK_SIZE with these
|
||||
format specifiers. */
|
||||
if (kbs_specified) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: cannot specify"
|
||||
" ROW_FORMAT = %s with"
|
||||
" KEY_BLOCK_SIZE.",
|
||||
row_format_name);
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
push_warning(thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: invalid ROW_FORMAT specifier.");
|
||||
ret = FALSE;
|
||||
|
||||
switch (row_type) {
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
/* These two ROW_FORMATs require srv_file_per_table
|
||||
and srv_file_format > Antelope */
|
||||
if (!srv_file_per_table) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_per_table.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
if (srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_format > Antelope.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (row_type) {
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
/* KEY_BLOCK_SIZE is only allowed with Compressed or Default */
|
||||
if (kbs_specified) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: cannot specify ROW_FORMAT = %s"
|
||||
" with KEY_BLOCK_SIZE.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return(ret);
|
||||
@ -6956,8 +6985,7 @@ ha_innobase::create(
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (create_info->key_block_size
|
||||
|| (create_info->used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE)) {
|
||||
if (create_info->key_block_size) {
|
||||
/* Determine the page_zip.ssize corresponding to the
|
||||
requested page size (key_block_size) in kilobytes. */
|
||||
|
||||
@ -6978,38 +7006,39 @@ ha_innobase::create(
|
||||
}
|
||||
|
||||
if (!srv_file_per_table) {
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
if (file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_format >"
|
||||
" Antelope.");
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_format > Antelope.");
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
if (!flags) {
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ignoring"
|
||||
" KEY_BLOCK_SIZE=%lu.",
|
||||
create_info->key_block_size);
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ignoring"
|
||||
" KEY_BLOCK_SIZE=%lu.",
|
||||
create_info->key_block_size);
|
||||
}
|
||||
}
|
||||
|
||||
row_type = form->s->row_type;
|
||||
|
||||
if (flags) {
|
||||
/* if KEY_BLOCK_SIZE was specified on this statement and
|
||||
ROW_FORMAT was not, automatically change ROW_FORMAT to COMPRESSED.*/
|
||||
if ( (create_info->used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE)
|
||||
&& !(create_info->used_fields & HA_CREATE_USED_ROW_FORMAT)) {
|
||||
/* if ROW_FORMAT is set to default,
|
||||
automatically change it to COMPRESSED.*/
|
||||
if (row_type == ROW_TYPE_DEFAULT) {
|
||||
row_type = ROW_TYPE_COMPRESSED;
|
||||
} else if (row_type != ROW_TYPE_COMPRESSED) {
|
||||
/* ROW_FORMAT other than COMPRESSED
|
||||
@ -7019,8 +7048,7 @@ ha_innobase::create(
|
||||
such combinations can be obtained
|
||||
with ALTER TABLE anyway. */
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ignoring KEY_BLOCK_SIZE=%lu"
|
||||
" unless ROW_FORMAT=COMPRESSED.",
|
||||
@ -7045,33 +7073,24 @@ ha_innobase::create(
|
||||
}
|
||||
|
||||
switch (row_type) {
|
||||
const char* row_format_name;
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
break;
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
row_format_name
|
||||
= row_type == ROW_TYPE_COMPRESSED
|
||||
? "COMPRESSED"
|
||||
: "DYNAMIC";
|
||||
|
||||
if (!srv_file_per_table) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_per_table.",
|
||||
row_format_name);
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_per_table.",
|
||||
get_row_format_name(row_type));
|
||||
} else if (file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning_printf(
|
||||
thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_format >"
|
||||
" Antelope.",
|
||||
row_format_name);
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_format > Antelope.",
|
||||
get_row_format_name(row_type));
|
||||
} else {
|
||||
flags |= DICT_TF_COMPACT
|
||||
| (DICT_TF_FORMAT_ZIP
|
||||
@ -7083,10 +7102,10 @@ ha_innobase::create(
|
||||
case ROW_TYPE_NOT_USED:
|
||||
case ROW_TYPE_FIXED:
|
||||
default:
|
||||
push_warning(thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: assuming ROW_FORMAT=COMPACT.");
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: assuming ROW_FORMAT=COMPACT.");
|
||||
case ROW_TYPE_DEFAULT:
|
||||
case ROW_TYPE_COMPACT:
|
||||
flags = DICT_TF_COMPACT;
|
||||
@ -7269,6 +7288,14 @@ ha_innobase::discard_or_import_tablespace(
|
||||
err = row_discard_tablespace_for_mysql(dict_table->name, trx);
|
||||
} else {
|
||||
err = row_import_tablespace_for_mysql(dict_table->name, trx);
|
||||
|
||||
/* in expanded import mode re-initialize auto_increment again */
|
||||
if ((err == DB_SUCCESS) && srv_expand_import &&
|
||||
(table->found_next_number_field != NULL)) {
|
||||
dict_table_autoinc_lock(dict_table);
|
||||
innobase_initialize_autoinc();
|
||||
dict_table_autoinc_unlock(dict_table);
|
||||
}
|
||||
}
|
||||
|
||||
err = convert_error_code_to_mysql(err, dict_table->flags, NULL);
|
||||
@ -7734,6 +7761,7 @@ ha_innobase::estimate_rows_upper_bound(void)
|
||||
dict_index_t* index;
|
||||
ulonglong estimate;
|
||||
ulonglong local_data_file_length;
|
||||
ulint stat_n_leaf_pages;
|
||||
|
||||
DBUG_ENTER("estimate_rows_upper_bound");
|
||||
|
||||
@ -7753,10 +7781,12 @@ ha_innobase::estimate_rows_upper_bound(void)
|
||||
|
||||
index = dict_table_get_first_index(prebuilt->table);
|
||||
|
||||
ut_a(index->stat_n_leaf_pages > 0);
|
||||
stat_n_leaf_pages = index->stat_n_leaf_pages;
|
||||
|
||||
ut_a(stat_n_leaf_pages > 0);
|
||||
|
||||
local_data_file_length =
|
||||
((ulonglong) index->stat_n_leaf_pages) * UNIV_PAGE_SIZE;
|
||||
((ulonglong) stat_n_leaf_pages) * UNIV_PAGE_SIZE;
|
||||
|
||||
|
||||
/* Calculate a minimum length for a clustered index record and from
|
||||
@ -7959,13 +7989,12 @@ ha_innobase::info_low(
|
||||
ib_table = prebuilt->table;
|
||||
|
||||
if (flag & HA_STATUS_TIME) {
|
||||
if ((called_from_analyze || innobase_stats_on_metadata)
|
||||
&& !share->ib_table->is_corrupt) {
|
||||
if ((called_from_analyze || innobase_stats_on_metadata) && !share->ib_table->is_corrupt) {
|
||||
/* In sql_show we call with this flag: update
|
||||
then statistics so that they are up-to-date */
|
||||
|
||||
if (srv_use_sys_stats_table && !((ib_table->flags >> DICT_TF2_SHIFT) & DICT_TF2_TEMPORARY)
|
||||
&& thd_sql_command(user_thd) == SQLCOM_ANALYZE) {
|
||||
&& called_from_analyze) {
|
||||
/* If the indexes on the table don't have enough rows in SYS_STATS system table, */
|
||||
/* they need to be created. */
|
||||
dict_index_t* index;
|
||||
@ -7987,7 +8016,8 @@ ha_innobase::info_low(
|
||||
prebuilt->trx->op_info = "updating table statistics";
|
||||
|
||||
dict_update_statistics(ib_table,
|
||||
(thd_sql_command(user_thd) == SQLCOM_ANALYZE)?TRUE:FALSE);
|
||||
FALSE /* update even if stats
|
||||
are initialized */, called_from_analyze);
|
||||
|
||||
prebuilt->trx->op_info = "returning various info to MySQL";
|
||||
}
|
||||
@ -8006,6 +8036,9 @@ ha_innobase::info_low(
|
||||
}
|
||||
|
||||
if (flag & HA_STATUS_VARIABLE) {
|
||||
|
||||
dict_table_stats_lock(ib_table, RW_S_LATCH);
|
||||
|
||||
n_rows = ib_table->stat_n_rows;
|
||||
|
||||
/* Because we do not protect stat_n_rows by any mutex in a
|
||||
@ -8055,12 +8088,14 @@ ha_innobase::info_low(
|
||||
ib_table->stat_sum_of_other_index_sizes)
|
||||
* UNIV_PAGE_SIZE;
|
||||
|
||||
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
||||
|
||||
/* Since fsp_get_available_space_in_free_extents() is
|
||||
acquiring latches inside InnoDB, we do not call it if we
|
||||
are asked by MySQL to avoid locking. Another reason to
|
||||
avoid the call is that it uses quite a lot of CPU.
|
||||
See Bug#38185. */
|
||||
if (flag & HA_STATUS_NO_LOCK) {
|
||||
if (flag & HA_STATUS_NO_LOCK || !srv_stats_update_need_lock) {
|
||||
/* We do not update delete_length if no
|
||||
locking is requested so the "old" value can
|
||||
remain. delete_length is initialized to 0 in
|
||||
@ -8070,21 +8105,13 @@ ha_innobase::info_low(
|
||||
/* Avoid accessing the tablespace if
|
||||
innodb_crash_recovery is set to a high value. */
|
||||
stats.delete_length = 0;
|
||||
} else if (srv_stats_update_need_lock) {
|
||||
} else {
|
||||
ullint avail_space;
|
||||
|
||||
/* lock the data dictionary to avoid races with
|
||||
ibd_file_missing and tablespace_discarded */
|
||||
row_mysql_lock_data_dictionary(prebuilt->trx);
|
||||
|
||||
/* ib_table->space must be an existent tablespace */
|
||||
if (!ib_table->ibd_file_missing
|
||||
&& !ib_table->tablespace_discarded) {
|
||||
|
||||
stats.delete_length =
|
||||
fsp_get_available_space_in_free_extents(
|
||||
ib_table->space) * 1024;
|
||||
} else {
|
||||
avail_space = fsp_get_available_space_in_free_extents(
|
||||
ib_table->space);
|
||||
|
||||
if (avail_space == ULLINT_UNDEFINED) {
|
||||
THD* thd;
|
||||
|
||||
thd = ha_thd();
|
||||
@ -8101,9 +8128,9 @@ ha_innobase::info_low(
|
||||
ib_table->name);
|
||||
|
||||
stats.delete_length = 0;
|
||||
} else {
|
||||
stats.delete_length = avail_space * 1024;
|
||||
}
|
||||
|
||||
row_mysql_unlock_data_dictionary(prebuilt->trx);
|
||||
}
|
||||
|
||||
stats.check_time = 0;
|
||||
@ -8132,6 +8159,8 @@ ha_innobase::info_low(
|
||||
table->s->keys);
|
||||
}
|
||||
|
||||
dict_table_stats_lock(ib_table, RW_S_LATCH);
|
||||
|
||||
for (i = 0; i < table->s->keys; i++) {
|
||||
ulong j;
|
||||
/* We could get index quickly through internal
|
||||
@ -8169,8 +8198,6 @@ ha_innobase::info_low(
|
||||
break;
|
||||
}
|
||||
|
||||
dict_index_stat_mutex_enter(index);
|
||||
|
||||
if (index->stat_n_diff_key_vals[j + 1] == 0) {
|
||||
|
||||
rec_per_key = stats.records;
|
||||
@ -8179,8 +8206,6 @@ ha_innobase::info_low(
|
||||
index->stat_n_diff_key_vals[j + 1]);
|
||||
}
|
||||
|
||||
dict_index_stat_mutex_exit(index);
|
||||
|
||||
/* Since MySQL seems to favor table scans
|
||||
too much over index searches, we pretend
|
||||
index selectivity is 2 times better than
|
||||
@ -8197,6 +8222,8 @@ ha_innobase::info_low(
|
||||
(ulong) rec_per_key;
|
||||
}
|
||||
}
|
||||
|
||||
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
||||
}
|
||||
|
||||
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) {
|
||||
@ -11176,6 +11203,11 @@ static MYSQL_SYSVAR_ULONG(page_size, innobase_page_size,
|
||||
"###EXPERIMENTAL###: The universal page size of the database. Changing for created database is not supported. Use on your own risk!",
|
||||
NULL, NULL, (1 << 14), (1 << 12), (1 << UNIV_PAGE_SIZE_SHIFT_MAX), 0);
|
||||
|
||||
static MYSQL_SYSVAR_ULONG(log_block_size, innobase_log_block_size,
|
||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||
"###EXPERIMENTAL###: The log block size of the transaction log file. Changing for created log file is not supported. Use on your own risk!",
|
||||
NULL, NULL, (1 << 9)/*512*/, (1 << 9)/*512*/, (1 << UNIV_PAGE_SIZE_SHIFT_MAX), 0);
|
||||
|
||||
static MYSQL_SYSVAR_STR(data_home_dir, innobase_data_home_dir,
|
||||
PLUGIN_VAR_READONLY,
|
||||
"The common part for InnoDB table spaces.",
|
||||
@ -11394,6 +11426,16 @@ static MYSQL_SYSVAR_LONGLONG(buffer_pool_size, innobase_buffer_pool_size,
|
||||
"The size of the memory buffer InnoDB uses to cache data and indexes of its tables.",
|
||||
NULL, NULL, 128*1024*1024L, 32*1024*1024L, LONGLONG_MAX, 1024*1024L);
|
||||
|
||||
static MYSQL_SYSVAR_UINT(buffer_pool_shm_key, srv_buffer_pool_shm_key,
|
||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||
"[experimental] The key value of shared memory segment for the buffer pool. 0 (default) disables the feature.",
|
||||
NULL, NULL, 0, 0, INT_MAX32, 0);
|
||||
|
||||
static MYSQL_SYSVAR_BOOL(buffer_pool_shm_checksum, innobase_buffer_pool_shm_checksum,
|
||||
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
|
||||
"Enable buffer_pool_shm checksum validation (enabled by default).",
|
||||
NULL, NULL, TRUE);
|
||||
|
||||
static MYSQL_SYSVAR_ULONG(commit_concurrency, innobase_commit_concurrency,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Helps in performance tuning in heavily concurrent environments.",
|
||||
@ -11604,17 +11646,19 @@ innodb_adaptive_checkpoint_update(
|
||||
void* var_ptr,
|
||||
const void* save)
|
||||
{
|
||||
*(long *)var_ptr= (*(long *)save) % 3;
|
||||
*(long *)var_ptr= (*(long *)save) % 4;
|
||||
}
|
||||
const char *adaptive_checkpoint_names[]=
|
||||
{
|
||||
"none", /* 0 */
|
||||
"reflex", /* 1 */
|
||||
"estimate", /* 2 */
|
||||
"keep_average", /* 3 */
|
||||
/* For compatibility of the older patch */
|
||||
"0", /* 3 ("none" + 3) */
|
||||
"1", /* 4 ("reflex" + 3) */
|
||||
"2", /* 5 ("estimate" + 3) */
|
||||
"0", /* 4 ("none" + 3) */
|
||||
"1", /* 5 ("reflex" + 3) */
|
||||
"2", /* 6 ("estimate" + 3) */
|
||||
"3", /* 7 ("keep_average" + 4) */
|
||||
NullS
|
||||
};
|
||||
TYPELIB adaptive_checkpoint_typelib=
|
||||
@ -11624,7 +11668,7 @@ TYPELIB adaptive_checkpoint_typelib=
|
||||
};
|
||||
static MYSQL_SYSVAR_ENUM(adaptive_checkpoint, srv_adaptive_checkpoint,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Enable/Disable flushing along modified age. (none, reflex, [estimate])",
|
||||
"Enable/Disable flushing along modified age. (none, reflex, [estimate], keep_average)",
|
||||
NULL, innodb_adaptive_checkpoint_update, 2, &adaptive_checkpoint_typelib);
|
||||
|
||||
static MYSQL_SYSVAR_ULONG(enable_unsafe_group_commit, srv_enable_unsafe_group_commit,
|
||||
@ -11663,9 +11707,12 @@ static MYSQL_SYSVAR_ULINT(pass_corrupt_table, srv_pass_corrupt_table,
|
||||
|
||||
static struct st_mysql_sys_var* innobase_system_variables[]= {
|
||||
MYSQL_SYSVAR(page_size),
|
||||
MYSQL_SYSVAR(log_block_size),
|
||||
MYSQL_SYSVAR(additional_mem_pool_size),
|
||||
MYSQL_SYSVAR(autoextend_increment),
|
||||
MYSQL_SYSVAR(buffer_pool_size),
|
||||
MYSQL_SYSVAR(buffer_pool_shm_key),
|
||||
MYSQL_SYSVAR(buffer_pool_shm_checksum),
|
||||
MYSQL_SYSVAR(checksums),
|
||||
MYSQL_SYSVAR(fast_checksum),
|
||||
MYSQL_SYSVAR(commit_concurrency),
|
||||
|
@ -1012,12 +1012,13 @@ ha_innobase::prepare_drop_index(
|
||||
index->to_be_dropped = TRUE;
|
||||
}
|
||||
|
||||
/* If FOREIGN_KEY_CHECK = 1 you may not drop an index defined
|
||||
/* If FOREIGN_KEY_CHECKS = 1 you may not drop an index defined
|
||||
for a foreign key constraint because InnoDB requires that both
|
||||
tables contain indexes for the constraint. Note that CREATE
|
||||
INDEX id ON table does a CREATE INDEX and DROP INDEX, and we
|
||||
can ignore here foreign keys because a new index for the
|
||||
foreign key has already been created.
|
||||
tables contain indexes for the constraint. Such index can
|
||||
be dropped only if FOREIGN_KEY_CHECKS is set to 0.
|
||||
Note that CREATE INDEX id ON table does a CREATE INDEX and
|
||||
DROP INDEX, and we can ignore here foreign keys because a
|
||||
new index for the foreign key has already been created.
|
||||
|
||||
We check for the foreign key constraints after marking the
|
||||
candidate indexes for deletion, because when we check for an
|
||||
|
@ -47,5 +47,6 @@ struct innodb_enhancement {
|
||||
{"innodb_fast_checksum","Using the checksum on 32bit-unit calculation","incompatible for unpatched ver.","http://www.percona.com/docs/wiki/percona-xtradb"},
|
||||
{"innodb_files_extend","allow >4GB transaction log files, and can vary universal page size of datafiles","incompatible for unpatched ver.","http://www.percona.com/docs/wiki/percona-xtradb"},
|
||||
{"innodb_sys_tables_sys_indexes","Expose InnoDB SYS_TABLES and SYS_INDEXES schema tables","","http://www.percona.com/docs/wiki/percona-xtradb"},
|
||||
{"innodb_buffer_pool_shm","Put buffer pool contents to shared memory segment and reuse it at clean restart [experimental]","","http://www.percona.com/docs/wiki/percona-xtradb"},
|
||||
{NULL, NULL, NULL, NULL}
|
||||
};
|
||||
|
@ -94,26 +94,35 @@ btr_root_get(
|
||||
Gets a buffer page and declares its latching order level. */
|
||||
UNIV_INLINE
|
||||
buf_block_t*
|
||||
btr_block_get(
|
||||
/*==========*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
mtr_t* mtr); /*!< in: mtr */
|
||||
/**************************************************************//**
|
||||
Gets a buffer page and declares its latching order level. */
|
||||
UNIV_INLINE
|
||||
page_t*
|
||||
btr_page_get(
|
||||
/*=========*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
mtr_t* mtr); /*!< in: mtr */
|
||||
btr_block_get_func(
|
||||
/*===============*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
const char* file, /*!< in: file name */
|
||||
ulint line, /*!< in: line where called */
|
||||
mtr_t* mtr) /*!< in/out: mtr */
|
||||
__attribute__((nonnull));
|
||||
/** Gets a buffer page and declares its latching order level.
|
||||
@param space tablespace identifier
|
||||
@param zip_size compressed page size in bytes or 0 for uncompressed pages
|
||||
@param page_no page number
|
||||
@param mode latch mode
|
||||
@param mtr mini-transaction handle
|
||||
@return the block descriptor */
|
||||
# define btr_block_get(space,zip_size,page_no,mode,mtr) \
|
||||
btr_block_get_func(space,zip_size,page_no,mode,__FILE__,__LINE__,mtr)
|
||||
/** Gets a buffer page and declares its latching order level.
|
||||
@param space tablespace identifier
|
||||
@param zip_size compressed page size in bytes or 0 for uncompressed pages
|
||||
@param page_no page number
|
||||
@param mode latch mode
|
||||
@param mtr mini-transaction handle
|
||||
@return the uncompressed page frame */
|
||||
# define btr_page_get(space,zip_size,page_no,mode,mtr) \
|
||||
buf_block_get_frame(btr_block_get(space,zip_size,page_no,mode,mtr))
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
/**************************************************************//**
|
||||
Gets the index id field of a page.
|
||||
|
@ -39,18 +39,21 @@ Created 6/2/1994 Heikki Tuuri
|
||||
Gets a buffer page and declares its latching order level. */
|
||||
UNIV_INLINE
|
||||
buf_block_t*
|
||||
btr_block_get(
|
||||
/*==========*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
btr_block_get_func(
|
||||
/*===============*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
const char* file, /*!< in: file name */
|
||||
ulint line, /*!< in: line where called */
|
||||
mtr_t* mtr) /*!< in/out: mtr */
|
||||
{
|
||||
buf_block_t* block;
|
||||
|
||||
block = buf_page_get(space, zip_size, page_no, mode, mtr);
|
||||
block = buf_page_get_gen(space, zip_size, page_no, mode,
|
||||
NULL, BUF_GET, file, line, mtr);
|
||||
|
||||
ut_a(srv_pass_corrupt_table || block);
|
||||
|
||||
@ -62,23 +65,6 @@ btr_block_get(
|
||||
return(block);
|
||||
}
|
||||
|
||||
/**************************************************************//**
|
||||
Gets a buffer page and declares its latching order level. */
|
||||
UNIV_INLINE
|
||||
page_t*
|
||||
btr_page_get(
|
||||
/*=========*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page_no, /*!< in: page number */
|
||||
ulint mode, /*!< in: latch mode */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
return(buf_block_get_frame(btr_block_get(space, zip_size, page_no,
|
||||
mode, mtr)));
|
||||
}
|
||||
|
||||
/**************************************************************//**
|
||||
Sets the index id field of a page. */
|
||||
UNIV_INLINE
|
||||
|
@ -520,7 +520,7 @@ Stores the fields in big_rec_vec to the tablespace and puts pointers to
|
||||
them in rec. The extern flags in rec will have to be set beforehand.
|
||||
The fields are stored on pages allocated from leaf node
|
||||
file segment of the index tree.
|
||||
@return DB_SUCCESS or error */
|
||||
@return DB_SUCCESS or DB_OUT_OF_FILE_SPACE */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
btr_store_big_rec_extern_fields(
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user