Merge pt-ms-pt-stalk-standard-mysql-options.

This commit is contained in:
Daniel Nichter
2013-03-09 11:57:41 -07:00
10 changed files with 347 additions and 48 deletions

View File

@@ -347,14 +347,14 @@ _parse_command_line() {
if [ "$next_opt_is_val" ]; then if [ "$next_opt_is_val" ]; then
next_opt_is_val="" next_opt_is_val=""
if [ $# -eq 0 ] || [ $(expr "$opt" : "-") -eq 1 ]; then if [ $# -eq 0 ] || [ $(expr "$opt" : "\-") -eq 1 ]; then
option_error "$real_opt requires a $required_arg argument" option_error "$real_opt requires a $required_arg argument"
continue continue
fi fi
val="$opt" val="$opt"
opt_is_ok=1 opt_is_ok=1
else else
if [ $(expr "$opt" : "-") -eq 0 ]; then if [ $(expr "$opt" : "\-") -eq 0 ]; then
if [ -z "$ARGV" ]; then if [ -z "$ARGV" ]; then
ARGV="$opt" ARGV="$opt"
else else
@@ -450,6 +450,61 @@ size_to_bytes() {
# End parse_options package # End parse_options package
# ########################################################################### # ###########################################################################
# ###########################################################################
# mysql_options package
# This package is a copy without comments from the original. The original
# with comments and its test file can be found in the Bazaar repository at,
# lib/bash/mysql_options.sh
# t/lib/bash/mysql_options.sh
# See https://launchpad.net/percona-toolkit for more information.
# ###########################################################################
set -u
mysql_options() {
local MYSQL_ARGS=""
if [ -n "$OPT_DEFAULTS_FILE" ]; then
MYSQL_ARGS="--defaults-file=$OPT_DEFAULTS_FILE"
fi
if [ -n "$OPT_PORT" ]; then
MYSQL_ARGS="$MYSQL_ARGS --port=$OPT_PORT"
fi
if [ -n "$OPT_SOCKET" ]; then
MYSQL_ARGS="$MYSQL_ARGS --socket=$OPT_SOCKET"
fi
if [ -n "$OPT_HOST" ]; then
MYSQL_ARGS="$MYSQL_ARGS --host=$OPT_HOST"
fi
if [ -n "$OPT_USER" ]; then
MYSQL_ARGS="$MYSQL_ARGS --user=$OPT_USER"
fi
if [ -n "$OPT_PASSWORD" ]; then
MYSQL_ARGS="$MYSQL_ARGS --password=$OPT_PASSWORD"
fi
echo $MYSQL_ARGS
}
arrange_mysql_options() {
local opts="$1"
local rearranged=""
for opt in $opts; do
if [ "$(echo $opt | awk -F= '{print $1}')" = "--defaults-file" ]; then
rearranged="$opt $rearranged"
else
rearranged="$rearranged $opt"
fi
done
echo "$rearranged"
}
# ###########################################################################
# End mysql_options package
# ###########################################################################
# ########################################################################### # ###########################################################################
# tmpdir package # tmpdir package
# This package is a copy without comments from the original. The original # This package is a copy without comments from the original. The original
@@ -788,7 +843,6 @@ collect_mysqld_instances () {
echo "internal::oom_of_$pid $oom" >> "$variables_file" echo "internal::oom_of_$pid $oom" >> "$variables_file"
done done
pids="$pids"
pids="$(echo $pids | sed -e 's/ /,/g')" pids="$(echo $pids | sed -e 's/ /,/g')"
ps ww -p "$pids" 2>/dev/null ps ww -p "$pids" 2>/dev/null
else else
@@ -930,8 +984,13 @@ get_mysqldump_args () {
collect_mysqld_executables () { collect_mysqld_executables () {
local mysqld_instances="$1" local mysqld_instances="$1"
local ps_opt="cmd="
if [ "$(uname -s)" = "Darwin" ]; then
ps_opt="command="
fi
for pid in $( grep '/mysqld' "$mysqld_instances" | awk '/^.*[0-9]/{print $1}' ); do for pid in $( grep '/mysqld' "$mysqld_instances" | awk '/^.*[0-9]/{print $1}' ); do
ps -o cmd -p $pid | sed -e 's/^\(.*mysqld\) .*/\1/' | grep -v '^CMD$' ps -o $ps_opt -p $pid | sed -e 's/^\(.*mysqld\) .*/\1/'
done | sort -u done | sort -u
} }
@@ -2320,6 +2379,7 @@ report_mysql_summary () {
section "Configuration File" section "Configuration File"
local cnf_file="$(get_var "pt-summary-internal-Config_File_path" "$dir/mysql-variables")" local cnf_file="$(get_var "pt-summary-internal-Config_File_path" "$dir/mysql-variables")"
if [ -n "${cnf_file}" ]; then if [ -n "${cnf_file}" ]; then
name_val "Config File" "${cnf_file}" name_val "Config File" "${cnf_file}"
pretty_print_cnf_file "$dir/mysql-config-file" pretty_print_cnf_file "$dir/mysql-config-file"
@@ -2376,6 +2436,14 @@ main() {
# Prepending SIG to these doesn't work with NetBSD's sh # Prepending SIG to these doesn't work with NetBSD's sh
trap sigtrap HUP INT TERM trap sigtrap HUP INT TERM
local MYSQL_ARGS="$(mysql_options)"
EXT_ARGV="$(arrange_mysql_options "$EXT_ARGV $MYSQL_ARGS")"
# Check if mysql and mysqldump are there, otherwise bail out early.
# But don't if they passed in --read-samples, since we don't need
# a connection then.
[ "$OPT_READ_SAMPLES" ] || check_mysql
local RAN_WITH="--sleep=$OPT_SLEEP --databases=$OPT_DATABASES --save-samples=$OPT_SAVE_SAMPLES" local RAN_WITH="--sleep=$OPT_SLEEP --databases=$OPT_DATABASES --save-samples=$OPT_SAVE_SAMPLES"
_d "Starting $0 $RAN_WITH" _d "Starting $0 $RAN_WITH"
@@ -2442,11 +2510,6 @@ if [ "${0##*/}" = "$TOOL" ] \
exit 0 exit 0
fi fi
# Check if mysql and mysqldump are there, otherwise bail out early.
# But don't if they passed in --read-samples, since we don't need
# a connection then.
[ "$OPT_READ_SAMPLES" ] || check_mysql
main "${@:-""}" main "${@:-""}"
fi fi
@@ -2462,7 +2525,7 @@ pt-mysql-summary - Summarize MySQL information nicely.
=head1 SYNOPSIS =head1 SYNOPSIS
Usage: pt-mysql-summary [OPTIONS] [-- MYSQL OPTIONS] Usage: pt-mysql-summary [OPTIONS]
pt-mysql-summary conveniently summarizes the status and configuration of a pt-mysql-summary conveniently summarizes the status and configuration of a
MySQL database server so that you can learn about it at a glance. It is not MySQL database server so that you can learn about it at a glance. It is not
@@ -2498,7 +2561,7 @@ and other scripting languages.
To use, simply execute it. Optionally add a double dash and then the same To use, simply execute it. Optionally add a double dash and then the same
command-line options you would use to connect to MySQL, such as the following: command-line options you would use to connect to MySQL, such as the following:
pt-mysql-summary -- --user=root pt-mysql-summary --user=root
The tool interacts minimally with the server upon which it runs. It assumes The tool interacts minimally with the server upon which it runs. It assumes
that you'll run it on the same server you're inspecting, and therefore it that you'll run it on the same server you're inspecting, and therefore it
@@ -2889,22 +2952,6 @@ type: string
Read this comma-separated list of config files. If specified, this must be the Read this comma-separated list of config files. If specified, this must be the
first option on the command line. first option on the command line.
=item --help
Print help and exit.
=item --save-samples
type: string
Save the data files used to generate the summary in this directory.
=item --read-samples
type: string
Create a report from the files found in this directory.
=item --databases =item --databases
type: string type: string
@@ -2913,12 +2960,65 @@ Names of databases to summarize. If you want all of them, you can use the value
C<--all-databases>; you can also pass in a comma-separated list of database C<--all-databases>; you can also pass in a comma-separated list of database
names. If not provided, the program will ask you for manual input. names. If not provided, the program will ask you for manual input.
=item --defaults-file
short form: -F; type: string
Only read mysql options from the given file. You must give an absolute
pathname.
=item --help
Print help and exit.
=item --host
short form: -h; type: string
Host to connect to.
=item --password
short form: -p; type: string
Password to use when connecting.
=item --port
short form: -P; type: int
Port number to use for connection.
=item --read-samples
type: string
Create a report from the files found in this directory.
=item --save-samples
type: string
Save the data files used to generate the summary in this directory.
=item --sleep =item --sleep
type: int; default: 10 type: int; default: 10
Seconds to sleep when gathering status counters. Seconds to sleep when gathering status counters.
=item --socket
short form: -S; type: string
Socket file to use for connection.
=item --user
short form: -u; type: string
User for login if not current user.
=item --version =item --version
Print tool's version and exit. Print tool's version and exit.

View File

@@ -399,14 +399,14 @@ _parse_command_line() {
if [ "$next_opt_is_val" ]; then if [ "$next_opt_is_val" ]; then
next_opt_is_val="" next_opt_is_val=""
if [ $# -eq 0 ] || [ $(expr "$opt" : "-") -eq 1 ]; then if [ $# -eq 0 ] || [ $(expr "$opt" : "\-") -eq 1 ]; then
option_error "$real_opt requires a $required_arg argument" option_error "$real_opt requires a $required_arg argument"
continue continue
fi fi
val="$opt" val="$opt"
opt_is_ok=1 opt_is_ok=1
else else
if [ $(expr "$opt" : "-") -eq 0 ]; then if [ $(expr "$opt" : "\-") -eq 0 ]; then
if [ -z "$ARGV" ]; then if [ -z "$ARGV" ]; then
ARGV="$opt" ARGV="$opt"
else else
@@ -502,6 +502,61 @@ size_to_bytes() {
# End parse_options package # End parse_options package
# ########################################################################### # ###########################################################################
# ###########################################################################
# mysql_options package
# This package is a copy without comments from the original. The original
# with comments and its test file can be found in the Bazaar repository at,
# lib/bash/mysql_options.sh
# t/lib/bash/mysql_options.sh
# See https://launchpad.net/percona-toolkit for more information.
# ###########################################################################
set -u
mysql_options() {
local MYSQL_ARGS=""
if [ -n "$OPT_DEFAULTS_FILE" ]; then
MYSQL_ARGS="--defaults-file=$OPT_DEFAULTS_FILE"
fi
if [ -n "$OPT_PORT" ]; then
MYSQL_ARGS="$MYSQL_ARGS --port=$OPT_PORT"
fi
if [ -n "$OPT_SOCKET" ]; then
MYSQL_ARGS="$MYSQL_ARGS --socket=$OPT_SOCKET"
fi
if [ -n "$OPT_HOST" ]; then
MYSQL_ARGS="$MYSQL_ARGS --host=$OPT_HOST"
fi
if [ -n "$OPT_USER" ]; then
MYSQL_ARGS="$MYSQL_ARGS --user=$OPT_USER"
fi
if [ -n "$OPT_PASSWORD" ]; then
MYSQL_ARGS="$MYSQL_ARGS --password=$OPT_PASSWORD"
fi
echo $MYSQL_ARGS
}
arrange_mysql_options() {
local opts="$1"
local rearranged=""
for opt in $opts; do
if [ "$(echo $opt | awk -F= '{print $1}')" = "--defaults-file" ]; then
rearranged="$opt $rearranged"
else
rearranged="$rearranged $opt"
fi
done
echo "$rearranged"
}
# ###########################################################################
# End mysql_options package
# ###########################################################################
# ########################################################################### # ###########################################################################
# tmpdir package # tmpdir package
# This package is a copy without comments from the original. The original # This package is a copy without comments from the original. The original
@@ -1370,6 +1425,9 @@ if [ "${0##*/}" = "$TOOL" ] \
exit 0 exit 0
fi fi
MYSQL_ARGS="$(mysql_options)"
EXT_ARGV="$(arrange_mysql_options "$EXT_ARGV $MYSQL_ARGS")"
# Check that mysql and mysqladmin are in PATH. If not, we're # Check that mysql and mysqladmin are in PATH. If not, we're
# already dead in the water, so don't bother with cmd line opts, # already dead in the water, so don't bother with cmd line opts,
# just error and exit. # just error and exit.
@@ -1439,7 +1497,7 @@ pt-stalk - Collect forensic data about MySQL when problems occur.
=head1 SYNOPSIS =head1 SYNOPSIS
Usage: pt-stalk [OPTIONS] [-- MYSQL OPTIONS] Usage: pt-stalk [OPTIONS]
pt-stalk waits for a trigger condition to occur, then collects data pt-stalk waits for a trigger condition to occur, then collects data
to help diagnose problems. The tool is designed to run as a daemon with root to help diagnose problems. The tool is designed to run as a daemon with root
@@ -1633,6 +1691,13 @@ the trigger condition less likely to fire when the problem recovers quickly.
Daemonize the tool. This causes the tool to fork into the background and log Daemonize the tool. This causes the tool to fork into the background and log
its output as specified in --log. its output as specified in --log.
=item --defaults-file
short form: -F; type: string
Only read mysql options from the given file. You must give an absolute
pathname.
=item --dest =item --dest
type: string; default: /var/lib/pt-stalk type: string; default: /var/lib/pt-stalk
@@ -1730,6 +1795,12 @@ file-specific global variables with "PLUGIN_" or make them local.
Print help and exit. Print help and exit.
=item --host
short form: -h; type: string
Host to connect to.
=item --interval =item --interval
type: int; default: 1 type: int; default: 1
@@ -1765,6 +1836,12 @@ type: string
Send an email to these addresses for every L<"--collect">. Send an email to these addresses for every L<"--collect">.
=item --password
short form: -p; type: string
Password to use when connecting.
=item --pid =item --pid
type: string; default: /var/run/pt-stalk.pid type: string; default: /var/run/pt-stalk.pid
@@ -1839,6 +1916,12 @@ Plugins can stop the tool by setting the global variable C<OKTORUN>
to C<1>. In this case, the global variable C<EXIT_REASON> should also to C<1>. In this case, the global variable C<EXIT_REASON> should also
be set to indicate why the tool was stopped. be set to indicate why the tool was stopped.
=item --port
short form: -P; type: int
Port number to use for connection.
=item --prefix =item --prefix
type: string type: string
@@ -1886,6 +1969,12 @@ from triggering continuously, which might be a problem if the collection process
It also prevents filling up the disk or gathering too much data to analyze It also prevents filling up the disk or gathering too much data to analyze
reasonably. reasonably.
=item --socket
short form: -S; type: string
Socket file to use for connection.
=item --stalk =item --stalk
default: yes; negatable: yes default: yes; negatable: yes
@@ -1915,6 +2004,12 @@ threshold to check for a L<"--variable"> value that is too low.
See also L<"--function">. See also L<"--function">.
=item --user
short form: -u; type: string
User for login if not current user.
=item --variable =item --variable
type: string; default: Threads_running type: string; default: Threads_running
@@ -2050,7 +2145,7 @@ Replace C<TOOL> with the name of any tool.
=head1 AUTHORS =head1 AUTHORS
Baron Schwartz, Justin Swanhart, Fernando Ipar, Daniel Nichter, Baron Schwartz, Justin Swanhart, Fernando Ipar, Daniel Nichter,
and Brian Fraser. and Brian Fraser
=head1 ABOUT PERCONA TOOLKIT =head1 ABOUT PERCONA TOOLKIT

View File

@@ -354,14 +354,14 @@ _parse_command_line() {
if [ "$next_opt_is_val" ]; then if [ "$next_opt_is_val" ]; then
next_opt_is_val="" next_opt_is_val=""
if [ $# -eq 0 ] || [ $(expr "$opt" : "-") -eq 1 ]; then if [ $# -eq 0 ] || [ $(expr "$opt" : "\-") -eq 1 ]; then
option_error "$real_opt requires a $required_arg argument" option_error "$real_opt requires a $required_arg argument"
continue continue
fi fi
val="$opt" val="$opt"
opt_is_ok=1 opt_is_ok=1
else else
if [ $(expr "$opt" : "-") -eq 0 ]; then if [ $(expr "$opt" : "\-") -eq 0 ]; then
if [ -z "$ARGV" ]; then if [ -z "$ARGV" ]; then
ARGV="$opt" ARGV="$opt"
else else

View File

@@ -43,7 +43,6 @@ collect_mysqld_instances () {
echo "internal::oom_of_$pid $oom" >> "$variables_file" echo "internal::oom_of_$pid $oom" >> "$variables_file"
done done
pids="$pids"
pids="$(echo $pids | sed -e 's/ /,/g')" pids="$(echo $pids | sed -e 's/ /,/g')"
ps ww -p "$pids" 2>/dev/null ps ww -p "$pids" 2>/dev/null
else else
@@ -201,8 +200,13 @@ get_mysqldump_args () {
collect_mysqld_executables () { collect_mysqld_executables () {
local mysqld_instances="$1" local mysqld_instances="$1"
local ps_opt="cmd="
if [ "$(uname -s)" = "Darwin" ]; then
ps_opt="command="
fi
for pid in $( grep '/mysqld' "$mysqld_instances" | awk '/^.*[0-9]/{print $1}' ); do for pid in $( grep '/mysqld' "$mysqld_instances" | awk '/^.*[0-9]/{print $1}' ); do
ps -o cmd -p $pid | sed -e 's/^\(.*mysqld\) .*/\1/' | grep -v '^CMD$' ps -o $ps_opt -p $pid | sed -e 's/^\(.*mysqld\) .*/\1/'
done | sort -u done | sort -u
} }

68
lib/bash/mysql_options.sh Normal file
View File

@@ -0,0 +1,68 @@
# This program is copyright 2011 Percona Inc.
# Feedback and improvements are welcome.
#
# THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, version 2; OR the Perl Artistic License. On UNIX and similar
# systems, you can issue `man perlgpl' or `man perlartistic' to read these
# licenses.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA.
# ###########################################################################
# mysql_options package
# ###########################################################################
# Package: mysql_options
# Handle --defaults-file & related options
set -u
mysql_options() {
local MYSQL_ARGS=""
if [ -n "$OPT_DEFAULTS_FILE" ]; then
MYSQL_ARGS="--defaults-file=$OPT_DEFAULTS_FILE"
fi
if [ -n "$OPT_PORT" ]; then
MYSQL_ARGS="$MYSQL_ARGS --port=$OPT_PORT"
fi
if [ -n "$OPT_SOCKET" ]; then
MYSQL_ARGS="$MYSQL_ARGS --socket=$OPT_SOCKET"
fi
if [ -n "$OPT_HOST" ]; then
MYSQL_ARGS="$MYSQL_ARGS --host=$OPT_HOST"
fi
if [ -n "$OPT_USER" ]; then
MYSQL_ARGS="$MYSQL_ARGS --user=$OPT_USER"
fi
if [ -n "$OPT_PASSWORD" ]; then
MYSQL_ARGS="$MYSQL_ARGS --password=$OPT_PASSWORD"
fi
echo $MYSQL_ARGS
}
# This basically makes sure that --defaults-file comes first
arrange_mysql_options() {
local opts="$1"
local rearranged=""
for opt in $opts; do
if [ "$(echo $opt | awk -F= '{print $1}')" = "--defaults-file" ]; then
rearranged="$opt $rearranged"
else
rearranged="$rearranged $opt"
fi
done
echo "$rearranged"
}
# ###########################################################################
# End mysql_options package
# ###########################################################################

View File

@@ -398,7 +398,7 @@ _parse_command_line() {
if [ "$next_opt_is_val" ]; then if [ "$next_opt_is_val" ]; then
next_opt_is_val="" next_opt_is_val=""
if [ $# -eq 0 ] || [ $(expr "$opt" : "-") -eq 1 ]; then if [ $# -eq 0 ] || [ $(expr "$opt" : "\-") -eq 1 ]; then
option_error "$real_opt requires a $required_arg argument" option_error "$real_opt requires a $required_arg argument"
continue continue
fi fi
@@ -406,7 +406,7 @@ _parse_command_line() {
opt_is_ok=1 opt_is_ok=1
else else
# If option does not begin with a hyphen (-), it's a filename, etc. # If option does not begin with a hyphen (-), it's a filename, etc.
if [ $(expr "$opt" : "-") -eq 0 ]; then if [ $(expr "$opt" : "\-") -eq 0 ]; then
if [ -z "$ARGV" ]; then if [ -z "$ARGV" ]; then
ARGV="$opt" ARGV="$opt"
else else

View File

@@ -1489,6 +1489,7 @@ report_mysql_summary () {
# ######################################################################## # ########################################################################
section "Configuration File" section "Configuration File"
local cnf_file="$(get_var "pt-summary-internal-Config_File_path" "$dir/mysql-variables")" local cnf_file="$(get_var "pt-summary-internal-Config_File_path" "$dir/mysql-variables")"
if [ -n "${cnf_file}" ]; then if [ -n "${cnf_file}" ]; then
name_val "Config File" "${cnf_file}" name_val "Config File" "${cnf_file}"
pretty_print_cnf_file "$dir/mysql-config-file" pretty_print_cnf_file "$dir/mysql-config-file"

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
plan 3
TMPFILE="$TEST_PT_TMPDIR/parse-opts-output"
TOOL="pt-mysql-summary"
PT_TMPDIR="$TEST_PT_TMPDIR"
source "$LIB_DIR/log_warn_die.sh"
source "$LIB_DIR/parse_options.sh"
source "$LIB_DIR/mysql_options.sh"
cnf="/tmp/12345/my.sandbox.cnf"
parse_options "$PERCONA_TOOLKIT_BRANCH/bin/pt-mysql-summary" --defaults-file $cnf
is "$OPT_DEFAULTS_FILE" "$cnf" "--defaults-file works"
# ############################################################################
# Short forms work
# ############################################################################
parse_options "$PERCONA_TOOLKIT_BRANCH/bin/pt-mysql-summary" -F $cnf
is "$OPT_DEFAULTS_FILE" "$cnf" "-F works"
parse_options "$PERCONA_TOOLKIT_BRANCH/bin/pt-mysql-summary" -u msandbox
is "$OPT_USER" "msandbox" "-u works"
# ############################################################################
# Done
# ############################################################################

1
t/lib/bash/mysql_options.t Symbolic link
View File

@@ -0,0 +1 @@
../../../util/test-bash-functions

View File

@@ -144,7 +144,7 @@ like(
cleanup(); cleanup();
$retval = system("$trunk/bin/pt-stalk --daemonize --pid $pid_file --log $log_file --dest $dest --verbose 3 -- --defaults-file=$cnf"); $retval = system("$trunk/bin/pt-stalk --daemonize --pid $pid_file --log $log_file --variable Threads_running --dest $dest --verbose 3 -- --defaults-file=$cnf");
PerconaTest::wait_for_files($pid_file, $log_file); PerconaTest::wait_for_files($pid_file, $log_file);
PerconaTest::wait_for_sh("grep -q 'Check results' $log_file >/dev/null"); PerconaTest::wait_for_sh("grep -q 'Check results' $log_file >/dev/null");
@@ -155,7 +155,7 @@ like(
$output, $output,
qr/Check results: Threads_running=\d+, matched=no, cycles_true=0/, qr/Check results: Threads_running=\d+, matched=no, cycles_true=0/,
"Matching results logged with --verbose 3" "Matching results logged with --verbose 3"
) or diag(`cat $log_file 2>/dev/null`, `cat $dest/*-output 2>/dev/null`); ) or diag(`cat $dest/*-output 2>/dev/null`);
# ############################################################################# # #############################################################################
# --verbose 1 (just errors and warnings) # --verbose 1 (just errors and warnings)