mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-27 07:54:58 +00:00
Collect INFORMATION_SCHEMA.INNODB_LOCK_WAITS data.
This commit is contained in:
@@ -159,6 +159,13 @@ collect() {
|
|||||||
>> "$d/$p-mysqladmin" 2>&1 &
|
>> "$d/$p-mysqladmin" 2>&1 &
|
||||||
local mysqladmin_pid=$!
|
local mysqladmin_pid=$!
|
||||||
|
|
||||||
|
local have_lock_waits_table=0
|
||||||
|
$MYSQL_CMD "$EXT_ARGV" -e "SHOW TABLES FROM INFORMATION_SCHEMA" \
|
||||||
|
| grep -qi "INNODB_LOCK_WAITS"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
have_lock_waits_table=1
|
||||||
|
fi
|
||||||
|
|
||||||
# This loop gathers data for the rest of the duration, and defines the time
|
# This loop gathers data for the rest of the duration, and defines the time
|
||||||
# of the whole job.
|
# of the whole job.
|
||||||
echo "Loop start: $(date +'TS %s.%N %F %T')"
|
echo "Loop start: $(date +'TS %s.%N %F %T')"
|
||||||
@@ -189,6 +196,10 @@ collect() {
|
|||||||
|
|
||||||
($CMD_MYSQL "$EXT_ARGV" -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \
|
($CMD_MYSQL "$EXT_ARGV" -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \
|
||||||
>> "$d/$p-processlist"
|
>> "$d/$p-processlist"
|
||||||
|
|
||||||
|
if [ $have_lock_waits_table -eq 1 ]; then
|
||||||
|
(lock_waits 2>&1; echo $ts) >>"$d/$p-lock-waits"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
echo "Loop end: $(date +'TS %s.%N %F %T')"
|
echo "Loop end: $(date +'TS %s.%N %F %T')"
|
||||||
|
|
||||||
@@ -246,6 +257,39 @@ open_tables() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock_waits() {
|
||||||
|
local sql1="SELECT
|
||||||
|
CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks,
|
||||||
|
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
|
||||||
|
MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time,
|
||||||
|
COUNT(*) AS num_waiters
|
||||||
|
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
|
||||||
|
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
|
||||||
|
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
|
||||||
|
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
|
||||||
|
GROUP BY who_blocks ORDER BY num_waiters DESC\G"
|
||||||
|
$CMD_MYSQL "$EXT_ARGV" -e "$sql1"
|
||||||
|
|
||||||
|
local sql2="SELECT
|
||||||
|
r.trx_id AS waiting_trx_id,
|
||||||
|
r.trx_mysql_thread_id AS waiting_thread,
|
||||||
|
TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS wait_time,
|
||||||
|
r.trx_query AS waiting_query,
|
||||||
|
l.lock_table AS waiting_table_lock,
|
||||||
|
b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread,
|
||||||
|
SUBSTRING(p.host, 1, INSTR(p.host, ':') - 1) AS blocking_host,
|
||||||
|
SUBSTRING(p.host, INSTR(p.host, ':') +1) AS blocking_port,
|
||||||
|
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
|
||||||
|
b.trx_query AS blocking_query
|
||||||
|
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
|
||||||
|
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
|
||||||
|
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
|
||||||
|
INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id
|
||||||
|
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
|
||||||
|
ORDER BY wait_time DESC\G"
|
||||||
|
$CMD_MYSQL "$EXT_ARGV" -e "$sql2"
|
||||||
|
}
|
||||||
|
|
||||||
# ###########################################################################
|
# ###########################################################################
|
||||||
# End collect package
|
# End collect package
|
||||||
# ###########################################################################
|
# ###########################################################################
|
||||||
|
Reference in New Issue
Block a user