diff --git a/Changelog b/Changelog index 8ad59180..c33079ee 100644 --- a/Changelog +++ b/Changelog @@ -2,6 +2,7 @@ Changelog for Percona Toolkit v3.0.7 + * Feature PT-644 : Added --mysql-only option to pt-stalk for RDS * Fixed bug PT-1256: pt-table-sync does not use the character set for the table it is synchronizing v3.0.6 released 2017-12-20 diff --git a/bin/pt-stalk b/bin/pt-stalk index 82a64df6..9bdf2ef0 100755 --- a/bin/pt-stalk +++ b/bin/pt-stalk @@ -128,6 +128,7 @@ OPT_ERRS=0 # How many command line option errors OPT_VERSION="" # If --version was specified OPT_HELP="" # If --help was specified OPT_ASK_PASS="" # If --ask-pass was specified +OPT_MYSQL_ONLY="" # If --mysql-only was specified PO_DIR="" # Directory with program option spec files usage() { @@ -795,7 +796,10 @@ collect() { local d="$1" # directory to save results in local p="$2" # prefix for each result file - local mysqld_pid=$(_pidof mysqld | awk '{print $1; exit;}') + local mysqld_pid="" + if [ ! "$OPT_MYSQL_ONLY" ]; then + mysqld_pid=$(_pidof mysqld | awk '{print $1; exit;}') + fi if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then if $CMD_PMAP --help 2>&1 | grep -- -x >/dev/null 2>&1 ; then @@ -824,7 +828,7 @@ collect() { fi local tail_error_log_pid="" - if [ "$mysql_error_log" ]; then + if [ "$mysql_error_log" -a ! "$OPT_MYSQL_ONLY" ]; then log "The MySQL error log seems to be $mysql_error_log" tail -f "$mysql_error_log" >"$d/$p-log_error" & tail_error_log_pid=$! @@ -865,37 +869,39 @@ collect() { local strace_pid=$! fi - ps -eaF >> "$d/$p-ps" & - top -bn${OPT_RUN_TIME} >> "$d/$p-top" & + if [ ! "$OPT_MYSQL_ONLY" ]; then + ps -eaF >> "$d/$p-ps" & + top -bn${OPT_RUN_TIME} >> "$d/$p-top" & - [ "$mysqld_pid" ] && _lsof $mysqld_pid >> "$d/$p-lsof" & + [ "$mysqld_pid" ] && _lsof $mysqld_pid >> "$d/$p-lsof" & - if [ "$CMD_SYSCTL" ]; then - $CMD_SYSCTL -a >> "$d/$p-sysctl" & - fi + if [ "$CMD_SYSCTL" ]; then + $CMD_SYSCTL -a >> "$d/$p-sysctl" & + fi - if [ "$CMD_DMESG" ]; then - local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` - local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') - $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & - fi + if [ "$CMD_DMESG" ]; then + local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` + local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') + $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & + fi - local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) - if [ "$CMD_VMSTAT" ]; then - $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & - $CMD_VMSTAT $OPT_RUN_TIME 2 >> "$d/$p-vmstat-overall" & - fi - if [ "$CMD_IOSTAT" ]; then - $CMD_IOSTAT -dx $OPT_SLEEP_COLLECT $cnt >> "$d/$p-iostat" & - $CMD_IOSTAT -dx $OPT_RUN_TIME 2 >> "$d/$p-iostat-overall" & - fi - if [ "$CMD_MPSTAT" ]; then - $CMD_MPSTAT -P ALL $OPT_SLEEP_COLLECT $cnt >> "$d/$p-mpstat" & - $CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" & - fi + local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) + if [ "$CMD_VMSTAT" ]; then + $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & + $CMD_VMSTAT $OPT_RUN_TIME 2 >> "$d/$p-vmstat-overall" & + fi + if [ "$CMD_IOSTAT" ]; then + $CMD_IOSTAT -dx $OPT_SLEEP_COLLECT $cnt >> "$d/$p-iostat" & + $CMD_IOSTAT -dx $OPT_RUN_TIME 2 >> "$d/$p-iostat-overall" & + fi + if [ "$CMD_MPSTAT" ]; then + $CMD_MPSTAT -P ALL $OPT_SLEEP_COLLECT $cnt >> "$d/$p-mpstat" & + $CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" & + fi - $CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" & - local mysqladmin_pid=$! + $CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" & + local mysqladmin_pid=$! + fi local have_lock_waits_table="" $CMD_MYSQL $EXT_ARGV -e "SHOW TABLES FROM INFORMATION_SCHEMA" \ @@ -915,40 +921,41 @@ collect() { fi while [ $((curr_time - start_time)) -lt $OPT_RUN_TIME ]; do + if [ ! "$OPT_MYSQL_ONLY" ]; then + disk_space $d > $d/$p-disk-space + check_disk_space \ + $d/$p-disk-space \ + "$OPT_DISK_BYTES_FREE" \ + "$OPT_DISK_PCT_FREE" \ + || break - disk_space $d > $d/$p-disk-space - check_disk_space \ - $d/$p-disk-space \ - "$OPT_DISK_BYTES_FREE" \ - "$OPT_DISK_PCT_FREE" \ - || break + sleep $(date +'%s.%N' | awk "{print $OPT_SLEEP_COLLECT - (\$1 % $OPT_SLEEP_COLLECT)}") + local ts="$(date +"TS %s.%N %F %T")" - sleep $(date +'%s.%N' | awk "{print $OPT_SLEEP_COLLECT - (\$1 % $OPT_SLEEP_COLLECT)}") - local ts="$(date +"TS %s.%N %F %T")" - - if [ -d "/proc" ]; then - if [ -f "/proc/diskstats" ]; then - (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & - fi - if [ -f "/proc/stat" ]; then - (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & - fi - if [ -f "/proc/vmstat" ]; then - (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & - fi - if [ -f "/proc/meminfo" ]; then - (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & - fi - if [ -f "/proc/slabinfo" ]; then - (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & - fi - if [ -f "/proc/interrupts" ]; then - (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & + if [ -d "/proc" ]; then + if [ -f "/proc/diskstats" ]; then + (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & + fi + if [ -f "/proc/stat" ]; then + (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & + fi + if [ -f "/proc/vmstat" ]; then + (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & + fi + if [ -f "/proc/meminfo" ]; then + (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & + fi + if [ -f "/proc/slabinfo" ]; then + (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & + fi + if [ -f "/proc/interrupts" ]; then + (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & + fi fi + (echo $ts; df -k) >> "$d/$p-df" & + (echo $ts; netstat -antp) >> "$d/$p-netstat" & + (echo $ts; netstat -s) >> "$d/$p-netstat_s" & fi - (echo $ts; df -k) >> "$d/$p-df" & - (echo $ts; netstat -antp) >> "$d/$p-netstat" & - (echo $ts; netstat -s) >> "$d/$p-netstat_s" & (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ >> "$d/$p-processlist" & if [ "$have_lock_waits_table" ]; then @@ -1414,6 +1421,7 @@ stalk() { # Start collecting, maybe. # ################################################################## log "Collect $ITER triggered" + log "MYSQL_ONLY: $OPT_MYSQL_ONLY" # Send email to whomever that collect has been triggered. if [ "$OPT_NOTIFY_BY_EMAIL" ]; then @@ -1424,7 +1432,6 @@ stalk() { if [ "$OPT_COLLECT" ]; then local prefix="${OPT_PREFIX:-$(date +%F-%T | tr ':-' '_')}" - # Check if we'll have enough disk space to collect. Disk space # is also checked every interval while collecting. local margin="20971520" # default 20M margin, unless: @@ -2093,6 +2100,13 @@ Plugin writers should keep in mind that the file destination prefix currently in use should be accessed through the C<$prefix> variable, rather than C<$OPT_PREFIX>. +=item --mysql-only + +Trigger only MySQL related captures, ignoring all others. The only not MySQL related +value being collected is the disk space, because it is needed to calculate the +available free disk space to write the result files. +This option is useful for RDS instances. + =item --port short form: -P; type: int @@ -2362,7 +2376,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-stalk 3.0.6 +pt-stalk 3.0.7 =cut diff --git a/lib/bash/collect.sh b/lib/bash/collect.sh index ba0ca6a3..92dedae2 100644 --- a/lib/bash/collect.sh +++ b/lib/bash/collect.sh @@ -49,8 +49,11 @@ collect() { local d="$1" # directory to save results in local p="$2" # prefix for each result file + local mysqld_pid="" # Get pidof mysqld. - local mysqld_pid=$(_pidof mysqld | awk '{print $1; exit;}') + if [ ! "$OPT_MYSQL_ONLY" ]; then + mysqld_pid=$(_pidof mysqld | awk '{print $1; exit;}') + fi # Get memory allocation info before anything else. if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then @@ -90,7 +93,7 @@ collect() { fi local tail_error_log_pid="" - if [ "$mysql_error_log" ]; then + if [ "$mysql_error_log" -a ! "$OPT_MYSQL_ONLY" ]; then log "The MySQL error log seems to be $mysql_error_log" tail -f "$mysql_error_log" >"$d/$p-log_error" & tail_error_log_pid=$! @@ -141,44 +144,46 @@ collect() { # Grab a few general things first. Background all of these so we can start # them all up as quickly as possible. - ps -eaF >> "$d/$p-ps" & - top -bn${OPT_RUN_TIME} >> "$d/$p-top" & + if [ ! "$OPT_MYSQL_ONLY" ]; then + ps -eaF >> "$d/$p-ps" & + top -bn${OPT_RUN_TIME} >> "$d/$p-top" & - [ "$mysqld_pid" ] && _lsof $mysqld_pid >> "$d/$p-lsof" & + [ "$mysqld_pid" ] && _lsof $mysqld_pid >> "$d/$p-lsof" & - if [ "$CMD_SYSCTL" ]; then - $CMD_SYSCTL -a >> "$d/$p-sysctl" & - fi + if [ "$CMD_SYSCTL" ]; then + $CMD_SYSCTL -a >> "$d/$p-sysctl" & + fi - # collect dmesg events from 60 seconds ago until present - if [ "$CMD_DMESG" ]; then - local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` - local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') - $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & - fi + # collect dmesg events from 60 seconds ago until present + if [ "$CMD_DMESG" ]; then + local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` + local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') + $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & + fi - local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) - if [ "$CMD_VMSTAT" ]; then - $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & - $CMD_VMSTAT $OPT_RUN_TIME 2 >> "$d/$p-vmstat-overall" & - fi - if [ "$CMD_IOSTAT" ]; then - $CMD_IOSTAT -dx $OPT_SLEEP_COLLECT $cnt >> "$d/$p-iostat" & - $CMD_IOSTAT -dx $OPT_RUN_TIME 2 >> "$d/$p-iostat-overall" & - fi - if [ "$CMD_MPSTAT" ]; then - $CMD_MPSTAT -P ALL $OPT_SLEEP_COLLECT $cnt >> "$d/$p-mpstat" & - $CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" & - fi + local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) + if [ "$CMD_VMSTAT" ]; then + $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & + $CMD_VMSTAT $OPT_RUN_TIME 2 >> "$d/$p-vmstat-overall" & + fi + if [ "$CMD_IOSTAT" ]; then + $CMD_IOSTAT -dx $OPT_SLEEP_COLLECT $cnt >> "$d/$p-iostat" & + $CMD_IOSTAT -dx $OPT_RUN_TIME 2 >> "$d/$p-iostat-overall" & + fi + if [ "$CMD_MPSTAT" ]; then + $CMD_MPSTAT -P ALL $OPT_SLEEP_COLLECT $cnt >> "$d/$p-mpstat" & + $CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" & + fi - # Collect multiple snapshots of the status variables. We use - # mysqladmin -c even though it is buggy and won't stop on its - # own in 5.1 and newer, because there is a chance that we will - # get and keep a connection to the database; in troubled times - # the database tends to exceed max_connections, so reconnecting - # in the loop tends not to work very well. - $CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" & - local mysqladmin_pid=$! + # Collect multiple snapshots of the status variables. We use + # mysqladmin -c even though it is buggy and won't stop on its + # own in 5.1 and newer, because there is a chance that we will + # get and keep a connection to the database; in troubled times + # the database tends to exceed max_connections, so reconnecting + # in the loop tends not to work very well. + $CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" & + local mysqladmin_pid=$! + fi local have_lock_waits_table="" $CMD_MYSQL $EXT_ARGV -e "SHOW TABLES FROM INFORMATION_SCHEMA" \ @@ -200,47 +205,48 @@ collect() { fi while [ $((curr_time - start_time)) -lt $OPT_RUN_TIME ]; do + if [ ! "$OPT_MYSQL_ONLY" ]; then + # We check the disk, but don't exit, because we need to stop jobs if we + # need to exit. + disk_space $d > $d/$p-disk-space + check_disk_space \ + $d/$p-disk-space \ + "$OPT_DISK_BYTES_FREE" \ + "$OPT_DISK_PCT_FREE" \ + || break - # We check the disk, but don't exit, because we need to stop jobs if we - # need to exit. - disk_space $d > $d/$p-disk-space - check_disk_space \ - $d/$p-disk-space \ - "$OPT_DISK_BYTES_FREE" \ - "$OPT_DISK_PCT_FREE" \ - || break + # Sleep between collect cycles. + # Synchronize ourselves onto the clock tick, so the sleeps are 1-second + sleep $(date +'%s.%N' | awk "{print $OPT_SLEEP_COLLECT - (\$1 % $OPT_SLEEP_COLLECT)}") + local ts="$(date +"TS %s.%N %F %T")" - # Sleep between collect cycles. - # Synchronize ourselves onto the clock tick, so the sleeps are 1-second - sleep $(date +'%s.%N' | awk "{print $OPT_SLEEP_COLLECT - (\$1 % $OPT_SLEEP_COLLECT)}") - local ts="$(date +"TS %s.%N %F %T")" - - # ##################################################################### - # Collect data for this cycle. - # ##################################################################### - if [ -d "/proc" ]; then - if [ -f "/proc/diskstats" ]; then - (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & - fi - if [ -f "/proc/stat" ]; then - (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & - fi - if [ -f "/proc/vmstat" ]; then - (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & - fi - if [ -f "/proc/meminfo" ]; then - (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & - fi - if [ -f "/proc/slabinfo" ]; then - (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & - fi - if [ -f "/proc/interrupts" ]; then - (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & + # ##################################################################### + # Collect data for this cycle. + # ##################################################################### + if [ -d "/proc" ]; then + if [ -f "/proc/diskstats" ]; then + (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" & + fi + if [ -f "/proc/stat" ]; then + (echo $ts; cat /proc/stat) >> "$d/$p-procstat" & + fi + if [ -f "/proc/vmstat" ]; then + (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" & + fi + if [ -f "/proc/meminfo" ]; then + (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" & + fi + if [ -f "/proc/slabinfo" ]; then + (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" & + fi + if [ -f "/proc/interrupts" ]; then + (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" & + fi fi + (echo $ts; df -k) >> "$d/$p-df" & + (echo $ts; netstat -antp) >> "$d/$p-netstat" & + (echo $ts; netstat -s) >> "$d/$p-netstat_s" & fi - (echo $ts; df -k) >> "$d/$p-df" & - (echo $ts; netstat -antp) >> "$d/$p-netstat" & - (echo $ts; netstat -s) >> "$d/$p-netstat_s" & (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ >> "$d/$p-processlist" & if [ "$have_lock_waits_table" ]; then