mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-12 14:18:32 +00:00
Compare commits
32 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a0839d78ee | ||
![]() |
89440c1ad1 | ||
![]() |
ec7c62b289 | ||
![]() |
dd921fd657 | ||
![]() |
1dc85c3160 | ||
![]() |
14698e6045 | ||
![]() |
3530c7bccd | ||
![]() |
7002246cd3 | ||
![]() |
1da2cc944b | ||
![]() |
1f62be3279 | ||
![]() |
a91a8decac | ||
![]() |
c9836d5962 | ||
![]() |
b230a9da96 | ||
![]() |
4101d45484 | ||
![]() |
596b62c23b | ||
![]() |
feb79c37c8 | ||
![]() |
1f33cb97e6 | ||
![]() |
40f28d977a | ||
![]() |
b97436f0d5 | ||
![]() |
5efb3bd6f1 | ||
![]() |
55502267d6 | ||
![]() |
8e7113d457 | ||
![]() |
2c866898ee | ||
![]() |
51b2d610a2 | ||
![]() |
9d3485e79f | ||
![]() |
3943cc5767 | ||
![]() |
cebb1a68db | ||
![]() |
9dc874a57d | ||
![]() |
bb1a14658c | ||
![]() |
64d6b61132 | ||
![]() |
c1e6096336 | ||
![]() |
e207d53225 |
11
.travis.yml
11
.travis.yml
@@ -36,6 +36,9 @@ env:
|
|||||||
- MINIO_ENDPOINT: http://localhost:9000/
|
- MINIO_ENDPOINT: http://localhost:9000/
|
||||||
- MINIO_ACCESS_KEY_ID: example00000
|
- MINIO_ACCESS_KEY_ID: example00000
|
||||||
- MINIO_SECRET_ACCESS_KEY: secret00000
|
- MINIO_SECRET_ACCESS_KEY: secret00000
|
||||||
|
# REVIEWDOG_GITHUB_API_TOKEN
|
||||||
|
- secure: "px8XYeNEAFTSTb1hYZuEOxqOXUxvp3EoU+KCtPck/KNozkoS95eBd9klgr3Os4wPKloLdMhrr0VE98lukogUxA/NmnYnos01kegjWgwwM6fkob8JxaN5KK4oUFF1wmirBlrjGlw8vUErPwINmrK4BywKpDbw6Yip6FzxdlWESHI="
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
- MONGODB_IMAGE=mongo:3.0
|
- MONGODB_IMAGE=mongo:3.0
|
||||||
- MONGODB_IMAGE=mongo:3.2
|
- MONGODB_IMAGE=mongo:3.2
|
||||||
@@ -58,8 +61,14 @@ before_install:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
- go get -u github.com/golang/dep/cmd/dep
|
- go get -u github.com/golang/dep/cmd/dep
|
||||||
|
# install reviewdog and golangci-lin
|
||||||
|
- curl https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh| sh -s
|
||||||
|
- curl https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s latest
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
|
# static analyze
|
||||||
|
- bin/golangci-lint run -c=.golangci-required.yml --out-format=line-number | bin/reviewdog -f=golangci-lint -level=error -reporter=github-pr-check
|
||||||
|
- bin/golangci-lint run -c=.golangci.yml --out-format=line-number | bin/reviewdog -f=golangci-lint -level=error -reporter=github-pr-review
|
||||||
# log versions
|
# log versions
|
||||||
- docker --version
|
- docker --version
|
||||||
- docker-compose --version
|
- docker-compose --version
|
||||||
@@ -69,7 +78,7 @@ before_script:
|
|||||||
- dep ensure
|
- dep ensure
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- docker ps
|
- docker ps
|
||||||
- go test -timeout 20m ./src/go/...
|
- go test -timeout 20m ./src/go/...
|
||||||
|
|
||||||
allow_failures:
|
allow_failures:
|
||||||
|
6
Gopkg.lock
generated
6
Gopkg.lock
generated
@@ -188,12 +188,12 @@
|
|||||||
revision = "197f4ad8db8d1b04ff408042119176907c971f0a"
|
revision = "197f4ad8db8d1b04ff408042119176907c971f0a"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:1d7e1867c49a6dd9856598ef7c3123604ea3daabf5b83f303ff457bcbc410b1d"
|
digest = "1:c45802472e0c06928cd997661f2af610accd85217023b1d5f6331bebce0671d3"
|
||||||
name = "github.com/pkg/errors"
|
name = "github.com/pkg/errors"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = ""
|
pruneopts = ""
|
||||||
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
|
revision = "614d223910a179a466c1767a985424175c39b465"
|
||||||
version = "v0.8.1"
|
version = "v0.9.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:55dcddb2ba6ab25098ee6b96f176f39305f1fde7ea3d138e7e10bb64a5bf45be"
|
digest = "1:55dcddb2ba6ab25098ee6b96f176f39305f1fde7ea3d138e7e10bb64a5bf45be"
|
||||||
|
@@ -7696,8 +7696,8 @@ Example:
|
|||||||
|
|
||||||
The file's contents are in the same format used by SELECT INTO OUTFILE, as
|
The file's contents are in the same format used by SELECT INTO OUTFILE, as
|
||||||
documented in the MySQL manual: rows terminated by newlines, columns
|
documented in the MySQL manual: rows terminated by newlines, columns
|
||||||
terminated by tabs, NULL characters are represented by \N, and special
|
terminated by tabs, NULL characters are represented by C<\N>, and special
|
||||||
characters are escaped by \. This lets you reload a file with LOAD DATA
|
characters are escaped by C<\>. This lets you reload a file with LOAD DATA
|
||||||
INFILE's default settings.
|
INFILE's default settings.
|
||||||
|
|
||||||
If you want a column header at the top of the file, see L<"--header">. The file
|
If you want a column header at the top of the file, see L<"--header">. The file
|
||||||
@@ -7856,8 +7856,10 @@ type: string
|
|||||||
Used with L<"--file"> to specify the output format.
|
Used with L<"--file"> to specify the output format.
|
||||||
|
|
||||||
Valid formats are:
|
Valid formats are:
|
||||||
dump: MySQL dump format using tabs as field separator (default)
|
|
||||||
csv : Dump rows using ',' as separator and optionally enclosing fields by '"'.
|
- dump: MySQL dump format using tabs as field separator (default)
|
||||||
|
|
||||||
|
- csv : Dump rows using ',' as separator and optionally enclosing fields by '"'.
|
||||||
This format is equivalent to FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'.
|
This format is equivalent to FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'.
|
||||||
|
|
||||||
=item --password
|
=item --password
|
||||||
@@ -7887,10 +7889,10 @@ Specify the Perl module name of a general-purpose plugin. It is currently used
|
|||||||
only for statistics (see L<"--statistics">) and must have C<new()> and a
|
only for statistics (see L<"--statistics">) and must have C<new()> and a
|
||||||
C<statistics()> method.
|
C<statistics()> method.
|
||||||
|
|
||||||
The C<new( src => $src, dst => $dst, opts => $o )> method gets the source
|
The C<new( src =E<gt> $src, dst =E<gt> $dst, opts =E<gt> $o )> method gets the source
|
||||||
and destination DSNs, and their database connections, just like the
|
and destination DSNs, and their database connections, just like the
|
||||||
connection-specific plugins do. It also gets an OptionParser object (C<$o>) for
|
connection-specific plugins do. It also gets an OptionParser object (C<$o>) for
|
||||||
accessing command-line options (example: C<$o->get('purge');>).
|
accessing command-line options (example: C<$o-E<gt>get('purge');>).
|
||||||
|
|
||||||
The C<statistics(\%stats, $time)> method gets a hashref of the statistics
|
The C<statistics(\%stats, $time)> method gets a hashref of the statistics
|
||||||
collected by the archiving job, and the time the whole job started.
|
collected by the archiving job, and the time the whole job started.
|
||||||
@@ -8230,7 +8232,7 @@ Percona Toolkit. Second, it checks for and warns about versions with known
|
|||||||
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
||||||
as 5.5.25a.
|
as 5.5.25a.
|
||||||
|
|
||||||
A secure connection to Percona’s Version Check database server is done to
|
A secure connection to Percona's Version Check database server is done to
|
||||||
perform these checks. Each request is logged by the server, including software
|
perform these checks. Each request is logged by the server, including software
|
||||||
version numbers and unique ID of the checked system. The ID is generated by the
|
version numbers and unique ID of the checked system. The ID is generated by the
|
||||||
Percona Toolkit installation script or when the Version Check database call is
|
Percona Toolkit installation script or when the Version Check database call is
|
||||||
|
@@ -5747,7 +5747,7 @@ Percona Toolkit. Second, it checks for and warns about versions with known
|
|||||||
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
||||||
as 5.5.25a.
|
as 5.5.25a.
|
||||||
|
|
||||||
A secure connection to Percona’s Version Check database server is done to
|
A secure connection to Percona's Version Check database server is done to
|
||||||
perform these checks. Each request is logged by the server, including software
|
perform these checks. Each request is logged by the server, including software
|
||||||
version numbers and unique ID of the checked system. The ID is generated by the
|
version numbers and unique ID of the checked system. The ID is generated by the
|
||||||
Percona Toolkit installation script or when the Version Check database call is
|
Percona Toolkit installation script or when the Version Check database call is
|
||||||
|
@@ -5532,7 +5532,7 @@ Percona Toolkit. Second, it checks for and warns about versions with known
|
|||||||
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
problems. For example, MySQL 5.5.25 had a critical bug and was re-released
|
||||||
as 5.5.25a.
|
as 5.5.25a.
|
||||||
|
|
||||||
A secure connection to Percona’s Version Check database server is done to
|
A secure connection to Percona's Version Check database server is done to
|
||||||
perform these checks. Each request is logged by the server, including software
|
perform these checks. Each request is logged by the server, including software
|
||||||
version numbers and unique ID of the checked system. The ID is generated by the
|
version numbers and unique ID of the checked system. The ID is generated by the
|
||||||
Percona Toolkit installation script or when the Version Check database call is
|
Percona Toolkit installation script or when the Version Check database call is
|
||||||
|
@@ -6386,19 +6386,6 @@ sub main {
|
|||||||
sleep $next_interval - $time;
|
sleep $next_interval - $time;
|
||||||
PTDEBUG && _d('Woke up at', ts(time));
|
PTDEBUG && _d('Woke up at', ts(time));
|
||||||
|
|
||||||
if ( $o->get('check-read-only') && $o->get('update') ) {
|
|
||||||
my $read_only_interval = $o->get('read-only-interval') || $interval;
|
|
||||||
while (server_is_readonly($dbh)) {
|
|
||||||
PTDEBUG && _d("Server is read only. Sleeping for $read_only_interval seconds...");
|
|
||||||
sleep($read_only_interval);
|
|
||||||
if (
|
|
||||||
-f $sentinel
|
|
||||||
) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Connect or reconnect if necessary.
|
# Connect or reconnect if necessary.
|
||||||
if ( !$dbh->ping() ) {
|
if ( !$dbh->ping() ) {
|
||||||
$dbh = $dp->get_dbh($dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
$dbh = $dp->get_dbh($dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||||
@@ -6409,6 +6396,17 @@ sub main {
|
|||||||
$heartbeat_sth = undef;
|
$heartbeat_sth = undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( $o->get('check-read-only') && $o->get('update') ) {
|
||||||
|
my $read_only_interval = $o->get('read-only-interval') || $interval;
|
||||||
|
while (server_is_readonly($dbh)) {
|
||||||
|
PTDEBUG && _d("Server is read only. Sleeping for $read_only_interval seconds...");
|
||||||
|
sleep($read_only_interval);
|
||||||
|
if (-f $sentinel) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( $o->get('monitor') ) {
|
if ( $o->get('monitor') ) {
|
||||||
$heartbeat_sth ||= $dbh->prepare($heartbeat_sql);
|
$heartbeat_sth ||= $dbh->prepare($heartbeat_sql);
|
||||||
my ($delay) = $get_delay->($heartbeat_sth);
|
my ($delay) = $get_delay->($heartbeat_sth);
|
||||||
|
@@ -8323,9 +8323,9 @@ Print information to STDOUT about what is being done.
|
|||||||
|
|
||||||
These actions are taken for every matching query from all classes.
|
These actions are taken for every matching query from all classes.
|
||||||
The actions are taken in this order: L<"--print">, L<"--execute-command">,
|
The actions are taken in this order: L<"--print">, L<"--execute-command">,
|
||||||
L<"--kill">/L<"--kill-query">. This order allows L<"--execute-command">
|
L<"--kill"> / L<"--kill-query">. This order allows L<"--execute-command">
|
||||||
to see the output of L<"--print"> and the query before
|
to see the output of L<"--print"> and the query before
|
||||||
L<"--kill">/L<"--kill-query">. This may be helpful because pt-kill does
|
L<"--kill"> / L<"--kill-query">. This may be helpful because pt-kill does
|
||||||
not pass any information to L<"--execute-command">.
|
not pass any information to L<"--execute-command">.
|
||||||
|
|
||||||
See also L<"GROUP, MATCH AND KILL">.
|
See also L<"GROUP, MATCH AND KILL">.
|
||||||
|
@@ -5956,6 +5956,7 @@ sub can_nibble {
|
|||||||
my $one_nibble = !defined $args{one_nibble} || $args{one_nibble}
|
my $one_nibble = !defined $args{one_nibble} || $args{one_nibble}
|
||||||
? $row_est <= $chunk_size * $chunk_size_limit
|
? $row_est <= $chunk_size * $chunk_size_limit
|
||||||
: 0;
|
: 0;
|
||||||
|
PTDEBUG && _d('Chunk size limit: '.$chunk_size_limit. ', chunk size: '.$chunk_size. ', row est: '.$row_est);
|
||||||
PTDEBUG && _d('One nibble:', $one_nibble ? 'yes' : 'no');
|
PTDEBUG && _d('One nibble:', $one_nibble ? 'yes' : 'no');
|
||||||
|
|
||||||
if ( $args{resume}
|
if ( $args{resume}
|
||||||
@@ -11918,7 +11919,7 @@ The tool exits with an error if the host is a cluster node and the table
|
|||||||
is MyISAM or is being converted to MyISAM (C<ENGINE=MyISAM>), or if
|
is MyISAM or is being converted to MyISAM (C<ENGINE=MyISAM>), or if
|
||||||
C<wsrep_OSU_method> is not C<TOI>. There is no way to disable these checks.
|
C<wsrep_OSU_method> is not C<TOI>. There is no way to disable these checks.
|
||||||
|
|
||||||
=head1 MySQL 5.7+ Generated columns
|
=head1 MySQL 5.7 + Generated columns
|
||||||
|
|
||||||
The tools ignores MySQL 5.7+ C<GENERATED> columns since the value for those columns
|
The tools ignores MySQL 5.7+ C<GENERATED> columns since the value for those columns
|
||||||
is generated according to the expresion used to compute column values.
|
is generated according to the expresion used to compute column values.
|
||||||
@@ -12123,7 +12124,7 @@ type: string
|
|||||||
Channel name used when connected to a server using replication channels.
|
Channel name used when connected to a server using replication channels.
|
||||||
Suppose you have two masters, master_a at port 12345, master_b at port 1236 and
|
Suppose you have two masters, master_a at port 12345, master_b at port 1236 and
|
||||||
a slave connected to both masters using channels chan_master_a and chan_master_b.
|
a slave connected to both masters using channels chan_master_a and chan_master_b.
|
||||||
If you want to run pt-table-sync to syncronize the slave against master_a, pt-table-sync
|
If you want to run pt-table-sync to synchronize the slave against master_a, pt-table-sync
|
||||||
won't be able to determine what's the correct master since SHOW SLAVE STATUS
|
won't be able to determine what's the correct master since SHOW SLAVE STATUS
|
||||||
will return 2 rows. In this case, you can use --channel=chan_master_a to specify
|
will return 2 rows. In this case, you can use --channel=chan_master_a to specify
|
||||||
the channel name to use in the SHOW SLAVE STATUS command.
|
the channel name to use in the SHOW SLAVE STATUS command.
|
||||||
|
@@ -4602,7 +4602,7 @@ server. Before using this tool, please:
|
|||||||
C<pt-slave-delay> watches a slave and starts and stops its replication SQL
|
C<pt-slave-delay> watches a slave and starts and stops its replication SQL
|
||||||
thread as necessary to hold it at least as far behind the master as you
|
thread as necessary to hold it at least as far behind the master as you
|
||||||
request. In practice, it will typically cause the slave to lag between
|
request. In practice, it will typically cause the slave to lag between
|
||||||
L<"--delay"> and L<"--delay">+L<"--interval"> behind the master.
|
L<"--delay"> and L<"--delay"> + L<"--interval"> behind the master.
|
||||||
|
|
||||||
It bases the delay on binlog positions in the slave's relay logs by default,
|
It bases the delay on binlog positions in the slave's relay logs by default,
|
||||||
so there is no need to connect to the master. This works well if the IO
|
so there is no need to connect to the master. This works well if the IO
|
||||||
|
@@ -1993,7 +1993,7 @@ then compared to L<"--threshold"> as usual. The C<$EXT_ARGV> variable
|
|||||||
contains the MySQL options mentioned in the L<"SYNOPSIS"> above.
|
contains the MySQL options mentioned in the L<"SYNOPSIS"> above.
|
||||||
|
|
||||||
The file should not alter the tool's existing global variables. Prefix any
|
The file should not alter the tool's existing global variables. Prefix any
|
||||||
file-specific global variables with "PLUGIN_" or make them local.
|
file-specific global variables with C<PLUGIN_> or make them local.
|
||||||
|
|
||||||
=item --help
|
=item --help
|
||||||
|
|
||||||
|
@@ -13324,7 +13324,8 @@ first option on the command line.
|
|||||||
|
|
||||||
See the L<"--help"> output for a list of default config files.
|
See the L<"--help"> output for a list of default config files.
|
||||||
|
|
||||||
=item --[no]create-replicate-table
|
=item --create-replicate-table
|
||||||
|
=item --no-create-replicate-table
|
||||||
|
|
||||||
default: yes
|
default: yes
|
||||||
|
|
||||||
@@ -13687,7 +13688,7 @@ structure (MAGIC_create_replicate):
|
|||||||
|
|
||||||
Note: lower_boundary and upper_boundary data type can be BLOB. See L<"--binary-index">.
|
Note: lower_boundary and upper_boundary data type can be BLOB. See L<"--binary-index">.
|
||||||
|
|
||||||
By default, L<"--[no]create-replicate-table"> is true, so the database and
|
By default, L<"--create-replicate-table"> is true, so the database and
|
||||||
the table specified by this option are created automatically if they do not
|
the table specified by this option are created automatically if they do not
|
||||||
exist.
|
exist.
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'Percona Toolkit'
|
project = u'Percona Toolkit'
|
||||||
copyright = u'2017, Percona LLC and/or its affiliates'
|
copyright = u'2020, Percona LLC and/or its affiliates'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
@@ -180,7 +180,7 @@ htmlhelp_basename = 'PerconaToolkitdoc'
|
|||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
('index', 'PerconaToolkit.tex', u'Percona Toolkit Documentation',
|
('index', 'PerconaToolkit.tex', u'Percona Toolkit Documentation',
|
||||||
u'2017, Percona LLC and/or its affiliates', 'manual'),
|
u'2020, Percona LLC and/or its affiliates', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
@@ -214,5 +214,5 @@ latex_toplevel_sectioning = 'part'
|
|||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [
|
man_pages = [
|
||||||
('index', 'perconatoolkit', u'Percona Toolkit Documentation',
|
('index', 'perconatoolkit', u'Percona Toolkit Documentation',
|
||||||
[u'2017, Percona LLC and/or its affiliates'], 1)
|
[u'2020, Percona LLC and/or its affiliates'], 1)
|
||||||
]
|
]
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
===============================
|
===============================
|
||||||
|
|
||||||
Percona Toolkit is a collection of advanced command-line tools
|
Percona Toolkit is a collection of advanced command-line tools
|
||||||
used by `Percona <http://www.percona.com/>`_) support staff
|
used by `Percona <http://www.percona.com/>`_ support staff
|
||||||
to perform a variety of MySQL, MongoDB, and system tasks
|
to perform a variety of MySQL, MongoDB, and system tasks
|
||||||
that are too difficult or complex to perform manually.
|
that are too difficult or complex to perform manually.
|
||||||
|
|
||||||
@@ -59,6 +59,8 @@ Miscellaneous
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
bugs
|
bugs
|
||||||
|
ipv6_support
|
||||||
|
special_option_types
|
||||||
authors
|
authors
|
||||||
copyright_license_and_warranty
|
copyright_license_and_warranty
|
||||||
version
|
version
|
||||||
|
@@ -39,7 +39,7 @@ It is recommended to install Percona software from official repositories:
|
|||||||
|
|
||||||
During the installating process, the percona-toolkit installer records a unique
|
During the installating process, the percona-toolkit installer records a unique
|
||||||
identifier specific to the given percona-toolkit instance. This ID is a the
|
identifier specific to the given percona-toolkit instance. This ID is a the
|
||||||
product UUID stored in |product-uud|. The installer copies the product_uuid to
|
product UUID stored in |product-uuid|. The installer copies the product_uuid to
|
||||||
|toolkit-uuid|.
|
|toolkit-uuid|.
|
||||||
|
|
||||||
This unique identifier is used when collecting statistics about the usage of
|
This unique identifier is used when collecting statistics about the usage of
|
||||||
|
@@ -548,7 +548,7 @@ Many people have contributed code over the years. See each tool's
|
|||||||
|
|
||||||
=head1 COPYRIGHT, LICENSE, AND WARRANTY
|
=head1 COPYRIGHT, LICENSE, AND WARRANTY
|
||||||
|
|
||||||
Percona Toolkit is copyright 2011-2018 Percona LLC and/or its affiliates, et al.
|
Percona Toolkit is copyright 2011-2020 Percona LLC and/or its affiliates, et al.
|
||||||
See each program's documentation for complete copyright notices.
|
See each program's documentation for complete copyright notices.
|
||||||
|
|
||||||
THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
473
docs/pt-pg-summary.rst
Normal file
473
docs/pt-pg-summary.rst
Normal file
@@ -0,0 +1,473 @@
|
|||||||
|
pt-pg-summary
|
||||||
|
=============
|
||||||
|
**pt-pg-summary** collects information about a PostgreSQL cluster.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
``pt-pg-summary [options] [host:[port]]``
|
||||||
|
|
||||||
|
Binaries
|
||||||
|
--------
|
||||||
|
Please check the `releases <https://github.com/percona/toolkit-go/releases>`_ tab to download the binaries.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| Short | Long | Default | Description |
|
||||||
|
+========+=================================+=========+============================================================================+
|
||||||
|
| | ``--help`` | | Show context-sensitive help (also try ``--help-long`` and ``--help-man``). |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--version`` | | Show application version. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--databases=DATABASES`` | | Summarize this comma-separated list of databases. All if not specified. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| ``-h`` | ``--host=HOST`` | | Host to connect to. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| ``-W`` | ``--password=PASSWORD`` | | Password to use when connecting. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| ``-p`` | ``--port=PORT`` | | Port number to use for connection. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--sleep=SLEEP`` | 10 | Seconds to sleep when gathering status counters. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| ``-U`` | ``--username=USERNAME`` | | User for login if not current user. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--disable-ssl`` | true | Disable SSL for the connection. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--verbose`` | false | Show verbose log. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
| | ``--debug`` | false | Show debug information in the logs. |
|
||||||
|
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
.. Currently hidden
|
||||||
|
.. --list-encrypted-tables Include a list of the encrypted tables in all databases
|
||||||
|
.. --ask-pass Prompt for a password when connecting to PostgreSQL
|
||||||
|
.. --config Config file
|
||||||
|
.. --defaults-file Only read PostgreSQL options from the given file
|
||||||
|
.. --read-samples Create a report from the files found in this directory
|
||||||
|
.. --save-samples Save the data files used to generate the summary in this directory
|
||||||
|
|
||||||
|
|
||||||
|
Output
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
The output is grouped into these categories:
|
||||||
|
|
||||||
|
AllDatabases
|
||||||
|
Selects ``datname`` from ``pg_database`` where ``datistemplate`` is false.
|
||||||
|
|
||||||
|
ClusterInfo
|
||||||
|
Selects cluster information from ``pg_stat_activity``.
|
||||||
|
|
||||||
|
ConnectedClients
|
||||||
|
Counts the connected clients by selecting from ``pg_stat_activity``.
|
||||||
|
|
||||||
|
Connections
|
||||||
|
Selects ``state`` from ``pg_stat_activity`` and counts them.
|
||||||
|
|
||||||
|
Counters
|
||||||
|
Selects various counter values from ``pg_stat_database``.
|
||||||
|
|
||||||
|
DatabaseWaitEvents
|
||||||
|
Shows database wait events from ``pg_locks``, ``pg_stat_database``, ``pg_class``, and ``pg_stat_activity``.
|
||||||
|
|
||||||
|
Databases
|
||||||
|
Shows the name and size of databases from ``pg_stat_database``.
|
||||||
|
|
||||||
|
GlobalWaitEvents
|
||||||
|
Shows global wait evens from ``pg_stat_activity``.
|
||||||
|
|
||||||
|
IndexCacheHitRatio
|
||||||
|
Shows index hit ratios from ``pg_statio_user_indexes``.
|
||||||
|
|
||||||
|
PortAndDatadir
|
||||||
|
Shows port and data directory name from ``pg_settings``.
|
||||||
|
|
||||||
|
ServerVersion
|
||||||
|
Shows the value of ``server_version_num``.
|
||||||
|
|
||||||
|
Setting
|
||||||
|
Selects ``name`` and ``setting`` from ``pg_settings``.
|
||||||
|
|
||||||
|
SlaveHosts10
|
||||||
|
Selects information for PostgreSQL version 10.
|
||||||
|
|
||||||
|
SlaveHosts96
|
||||||
|
Selects information for PostgreSQL version 9.6.
|
||||||
|
|
||||||
|
TableAccess
|
||||||
|
Shows table access information by selecting from ``pg_locks``, ``pg_stat_database`` and ``pg_class``.
|
||||||
|
|
||||||
|
TableCacheHitRatio
|
||||||
|
Shows table cache hit ratio information from ``pg_statio_user_tables``.
|
||||||
|
|
||||||
|
Tablespaces
|
||||||
|
Show owner and location from ``pg_catalog.pg_tablespace``.
|
||||||
|
|
||||||
|
|
||||||
|
Output example
|
||||||
|
""""""""""""""
|
||||||
|
|
||||||
|
.. code-block:: html
|
||||||
|
|
||||||
|
##### --- Database Port and Data_Directory --- ####
|
||||||
|
+----------------------+----------------------------------------------------+
|
||||||
|
| Name | Setting |
|
||||||
|
+----------------------+----------------------------------------------------+
|
||||||
|
| data_directory | /var/lib/postgresql/data |
|
||||||
|
+----------------------+----------------------------------------------------+
|
||||||
|
|
||||||
|
##### --- List of Tablespaces ---- ######
|
||||||
|
+----------------------+----------------------+----------------------------------------------------+
|
||||||
|
| Name | Owner | Location |
|
||||||
|
+----------------------+----------------------+----------------------------------------------------+
|
||||||
|
| pg_default | postgres | |
|
||||||
|
| pg_global | postgres | |
|
||||||
|
+----------------------+----------------------+----------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
##### --- Cluster Information --- ####
|
||||||
|
+------------------------------------------------------------------------------------------------------+
|
||||||
|
Usename : postgres
|
||||||
|
Time : 2020-04-21 13:38:22.770077 +0000 UTC
|
||||||
|
Client Address : 172.19.0.1
|
||||||
|
Client Hostname:
|
||||||
|
Version : PostgreSQL 9.6.17 on x86_64-pc-linux-gnu (Debian 9.6.17-2.pgdg90+1), compiled by
|
||||||
|
Started : 2020-04-21 13:36:59.909175 +0000 UTC
|
||||||
|
Is Slave : false
|
||||||
|
+------------------------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
##### --- Databases --- ####
|
||||||
|
+----------------------+------------+
|
||||||
|
| Dat Name | Size |
|
||||||
|
+----------------------+------------+
|
||||||
|
| postgres | 7071 kB |
|
||||||
|
| template1 | 6961 kB |
|
||||||
|
| template0 | 6961 kB |
|
||||||
|
+----------------------+------------+
|
||||||
|
|
||||||
|
##### --- Index Cache Hit Ratios --- ####
|
||||||
|
|
||||||
|
Database: postgres
|
||||||
|
+----------------------+------------+
|
||||||
|
| Index Name | Ratio |
|
||||||
|
+----------------------+------------+
|
||||||
|
| index hit rate | 0.00 |
|
||||||
|
+----------------------+------------+
|
||||||
|
|
||||||
|
##### --- Table Cache Hit Ratios --- ####
|
||||||
|
Database: postgres
|
||||||
|
+----------------------+------------+
|
||||||
|
| Index Name | Ratio |
|
||||||
|
+----------------------+------------+
|
||||||
|
| cache hit rate | 0.00 |
|
||||||
|
+----------------------+------------+
|
||||||
|
|
||||||
|
##### --- List of Wait_events for the entire Cluster - all-databases --- ####
|
||||||
|
No stats available
|
||||||
|
|
||||||
|
##### --- List of users and client_addr or client_hostname connected to --all-databases --- ####
|
||||||
|
+----------------------+------------+---------+----------------------+---------+
|
||||||
|
| Wait Event Type | Client | State | Count |
|
||||||
|
+----------------------+------------+---------+----------------------+---------+
|
||||||
|
| postgres | 172.19.0.1/32 | active | 1 |
|
||||||
|
+----------------------+------------+---------+----------------------+---------+
|
||||||
|
|
||||||
|
##### --- Counters diff after 10 seconds --- ####
|
||||||
|
|
||||||
|
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||||
|
| Database | Numbackends | XactCommit | XactRollback | BlksRead | BlksHit | TupReturned | TupFetched | TupInserted | TupUpdated | TupDeleted | Conflicts | TempFiles | TempBytes | Deadlocks |
|
||||||
|
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||||
|
| postgres | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||||
|
| template0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||||
|
| template1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||||
|
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||||
|
|
||||||
|
##### --- Table access per database --- ####
|
||||||
|
Database: postgres
|
||||||
|
+----------------------------------------------------+------+--------------------------------+---------+
|
||||||
|
| Relname | Kind | Datname | Count |
|
||||||
|
+----------------------------------------------------+------+--------------------------------+---------+
|
||||||
|
| pg_class | r | postgres | 1 |
|
||||||
|
| pg_stat_database | v | postgres | 1 |
|
||||||
|
| pg_locks | v | postgres | 1 |
|
||||||
|
| pg_class_tblspc_relfilenode_index | i | postgres | 1 |
|
||||||
|
| pg_class_relname_nsp_index | i | postgres | 1 |
|
||||||
|
| pg_class_oid_index | i | postgres | 1 |
|
||||||
|
+----------------------------------------------------+------+--------------------------------+---------+
|
||||||
|
|
||||||
|
##### --- Instance settings --- ####
|
||||||
|
Setting Value
|
||||||
|
allow_system_table_mods : off
|
||||||
|
application_name :
|
||||||
|
archive_command : (disabled)
|
||||||
|
archive_mode : off
|
||||||
|
archive_timeout : 0
|
||||||
|
array_nulls : on
|
||||||
|
authentication_timeout : 60
|
||||||
|
autovacuum : on
|
||||||
|
autovacuum_analyze_scale_factor : 0.1
|
||||||
|
autovacuum_analyze_threshold : 50
|
||||||
|
autovacuum_freeze_max_age : 200000000
|
||||||
|
autovacuum_max_workers : 3
|
||||||
|
autovacuum_multixact_freeze_max_age : 400000000
|
||||||
|
autovacuum_naptime : 60
|
||||||
|
autovacuum_vacuum_cost_delay : 20
|
||||||
|
autovacuum_vacuum_cost_limit : -1
|
||||||
|
autovacuum_vacuum_scale_factor : 0.2
|
||||||
|
autovacuum_vacuum_threshold : 50
|
||||||
|
autovacuum_work_mem : -1
|
||||||
|
backend_flush_after : 0
|
||||||
|
backslash_quote : safe_encoding
|
||||||
|
bgwriter_delay : 200
|
||||||
|
bgwriter_flush_after : 64
|
||||||
|
bgwriter_lru_maxpages : 100
|
||||||
|
bgwriter_lru_multiplier : 2
|
||||||
|
block_size : 8192
|
||||||
|
bonjour : off
|
||||||
|
bonjour_name :
|
||||||
|
bytea_output : hex
|
||||||
|
check_function_bodies : on
|
||||||
|
checkpoint_completion_target : 0.5
|
||||||
|
checkpoint_flush_after : 32
|
||||||
|
checkpoint_timeout : 300
|
||||||
|
checkpoint_warning : 30
|
||||||
|
client_encoding : UTF8
|
||||||
|
client_min_messages : notice
|
||||||
|
cluster_name :
|
||||||
|
commit_delay : 0
|
||||||
|
commit_siblings : 5
|
||||||
|
config_file : /var/lib/postgresql/data/postgresql.conf
|
||||||
|
constraint_exclusion : partition
|
||||||
|
cpu_index_tuple_cost : 0.005
|
||||||
|
cpu_operator_cost : 0.0025
|
||||||
|
cpu_tuple_cost : 0.01
|
||||||
|
cursor_tuple_fraction : 0.1
|
||||||
|
data_checksums : off
|
||||||
|
data_directory : /var/lib/postgresql/data
|
||||||
|
data_sync_retry : off
|
||||||
|
DateStyle : ISO, MDY
|
||||||
|
db_user_namespace : off
|
||||||
|
deadlock_timeout : 1000
|
||||||
|
debug_assertions : off
|
||||||
|
debug_pretty_print : on
|
||||||
|
debug_print_parse : off
|
||||||
|
debug_print_plan : off
|
||||||
|
debug_print_rewritten : off
|
||||||
|
default_statistics_target : 100
|
||||||
|
default_tablespace :
|
||||||
|
default_text_search_config : pg_catalog.english
|
||||||
|
default_transaction_deferrable : off
|
||||||
|
default_transaction_isolation : read committed
|
||||||
|
default_transaction_read_only : off
|
||||||
|
default_with_oids : off
|
||||||
|
dynamic_library_path : $libdir
|
||||||
|
dynamic_shared_memory_type : posix
|
||||||
|
effective_cache_size : 524288
|
||||||
|
effective_io_concurrency : 1
|
||||||
|
enable_bitmapscan : on
|
||||||
|
enable_hashagg : on
|
||||||
|
enable_hashjoin : on
|
||||||
|
enable_indexonlyscan : on
|
||||||
|
enable_indexscan : on
|
||||||
|
enable_material : on
|
||||||
|
enable_mergejoin : on
|
||||||
|
enable_nestloop : on
|
||||||
|
enable_seqscan : on
|
||||||
|
enable_sort : on
|
||||||
|
enable_tidscan : on
|
||||||
|
escape_string_warning : on
|
||||||
|
event_source : PostgreSQL
|
||||||
|
exit_on_error : off
|
||||||
|
external_pid_file :
|
||||||
|
extra_float_digits : 2
|
||||||
|
force_parallel_mode : off
|
||||||
|
from_collapse_limit : 8
|
||||||
|
fsync : on
|
||||||
|
full_page_writes : on
|
||||||
|
geqo : on
|
||||||
|
geqo_effort : 5
|
||||||
|
geqo_generations : 0
|
||||||
|
geqo_pool_size : 0
|
||||||
|
geqo_seed : 0
|
||||||
|
geqo_selection_bias : 2
|
||||||
|
geqo_threshold : 12
|
||||||
|
gin_fuzzy_search_limit : 0
|
||||||
|
gin_pending_list_limit : 4096
|
||||||
|
hba_file : /var/lib/postgresql/data/pg_hba.conf
|
||||||
|
hot_standby : off
|
||||||
|
hot_standby_feedback : off
|
||||||
|
huge_pages : try
|
||||||
|
ident_file : /var/lib/postgresql/data/pg_ident.conf
|
||||||
|
idle_in_transaction_session_timeout : 0
|
||||||
|
ignore_checksum_failure : off
|
||||||
|
ignore_system_indexes : off
|
||||||
|
integer_datetimes : on
|
||||||
|
IntervalStyle : postgres
|
||||||
|
join_collapse_limit : 8
|
||||||
|
krb_caseins_users : off
|
||||||
|
krb_server_keyfile : FILE:/etc/postgresql-common/krb5.keytab
|
||||||
|
lc_collate : en_US.utf8
|
||||||
|
lc_ctype : en_US.utf8
|
||||||
|
lc_messages : en_US.utf8
|
||||||
|
lc_monetary : en_US.utf8
|
||||||
|
lc_numeric : en_US.utf8
|
||||||
|
lc_time : en_US.utf8
|
||||||
|
listen_addresses : *
|
||||||
|
lo_compat_privileges : off
|
||||||
|
local_preload_libraries :
|
||||||
|
lock_timeout : 0
|
||||||
|
log_autovacuum_min_duration : -1
|
||||||
|
log_checkpoints : off
|
||||||
|
log_connections : off
|
||||||
|
log_destination : stderr
|
||||||
|
log_directory : pg_log
|
||||||
|
log_disconnections : off
|
||||||
|
log_duration : off
|
||||||
|
log_error_verbosity : default
|
||||||
|
log_executor_stats : off
|
||||||
|
log_file_mode : 0600
|
||||||
|
log_filename : postgresql-%Y-%m-%d_%H%M%S.log
|
||||||
|
log_hostname : off
|
||||||
|
log_line_prefix :
|
||||||
|
log_lock_waits : off
|
||||||
|
log_min_duration_statement : -1
|
||||||
|
log_min_error_statement : error
|
||||||
|
log_min_messages : warning
|
||||||
|
log_parser_stats : off
|
||||||
|
log_planner_stats : off
|
||||||
|
log_replication_commands : off
|
||||||
|
log_rotation_age : 1440
|
||||||
|
log_rotation_size : 10240
|
||||||
|
log_statement : none
|
||||||
|
log_statement_stats : off
|
||||||
|
log_temp_files : -1
|
||||||
|
log_timezone : Etc/UTC
|
||||||
|
log_truncate_on_rotation : off
|
||||||
|
logging_collector : off
|
||||||
|
maintenance_work_mem : 65536
|
||||||
|
max_connections : 100
|
||||||
|
max_files_per_process : 1000
|
||||||
|
max_function_args : 100
|
||||||
|
max_identifier_length : 63
|
||||||
|
max_index_keys : 32
|
||||||
|
max_locks_per_transaction : 64
|
||||||
|
max_parallel_workers_per_gather : 0
|
||||||
|
max_pred_locks_per_transaction : 64
|
||||||
|
max_prepared_transactions : 0
|
||||||
|
max_replication_slots : 0
|
||||||
|
max_stack_depth : 2048
|
||||||
|
max_standby_archive_delay : 30000
|
||||||
|
max_standby_streaming_delay : 30000
|
||||||
|
max_wal_senders : 0
|
||||||
|
max_wal_size : 64
|
||||||
|
max_worker_processes : 8
|
||||||
|
min_parallel_relation_size : 1024
|
||||||
|
min_wal_size : 5
|
||||||
|
old_snapshot_threshold : -1
|
||||||
|
operator_precedence_warning : off
|
||||||
|
parallel_setup_cost : 1000
|
||||||
|
parallel_tuple_cost : 0.1
|
||||||
|
password_encryption : on
|
||||||
|
port : 5432
|
||||||
|
post_auth_delay : 0
|
||||||
|
pre_auth_delay : 0
|
||||||
|
quote_all_identifiers : off
|
||||||
|
random_page_cost : 4
|
||||||
|
replacement_sort_tuples : 150000
|
||||||
|
restart_after_crash : on
|
||||||
|
row_security : on
|
||||||
|
search_path : "$user", public
|
||||||
|
segment_size : 131072
|
||||||
|
seq_page_cost : 1
|
||||||
|
server_encoding : UTF8
|
||||||
|
server_version : 9.6.17
|
||||||
|
server_version_num : 90617
|
||||||
|
session_preload_libraries :
|
||||||
|
session_replication_role : origin
|
||||||
|
shared_buffers : 16384
|
||||||
|
shared_preload_libraries :
|
||||||
|
sql_inheritance : on
|
||||||
|
ssl : off
|
||||||
|
ssl_ca_file :
|
||||||
|
ssl_cert_file : server.crt
|
||||||
|
ssl_ciphers : HIGH:MEDIUM:+3DES:!aNULL
|
||||||
|
ssl_crl_file :
|
||||||
|
ssl_ecdh_curve : prime256v1
|
||||||
|
ssl_key_file : server.key
|
||||||
|
ssl_prefer_server_ciphers : on
|
||||||
|
standard_conforming_strings : on
|
||||||
|
statement_timeout : 0
|
||||||
|
stats_temp_directory : pg_stat_tmp
|
||||||
|
superuser_reserved_connections : 3
|
||||||
|
synchronize_seqscans : on
|
||||||
|
synchronous_commit : on
|
||||||
|
synchronous_standby_names :
|
||||||
|
syslog_facility : local0
|
||||||
|
syslog_ident : postgres
|
||||||
|
syslog_sequence_numbers : on
|
||||||
|
syslog_split_messages : on
|
||||||
|
tcp_keepalives_count : 9
|
||||||
|
tcp_keepalives_idle : 7200
|
||||||
|
tcp_keepalives_interval : 75
|
||||||
|
temp_buffers : 1024
|
||||||
|
temp_file_limit : -1
|
||||||
|
temp_tablespaces :
|
||||||
|
TimeZone : Etc/UTC
|
||||||
|
timezone_abbreviations : Default
|
||||||
|
trace_notify : off
|
||||||
|
trace_recovery_messages : log
|
||||||
|
trace_sort : off
|
||||||
|
track_activities : on
|
||||||
|
track_activity_query_size : 1024
|
||||||
|
track_commit_timestamp : off
|
||||||
|
track_counts : on
|
||||||
|
track_functions : none
|
||||||
|
track_io_timing : off
|
||||||
|
transaction_deferrable : off
|
||||||
|
transaction_isolation : read committed
|
||||||
|
transaction_read_only : off
|
||||||
|
transform_null_equals : off
|
||||||
|
unix_socket_directories : /var/run/postgresql
|
||||||
|
unix_socket_group :
|
||||||
|
unix_socket_permissions : 0777
|
||||||
|
update_process_title : on
|
||||||
|
vacuum_cost_delay : 0
|
||||||
|
vacuum_cost_limit : 200
|
||||||
|
vacuum_cost_page_dirty : 20
|
||||||
|
vacuum_cost_page_hit : 1
|
||||||
|
vacuum_cost_page_miss : 10
|
||||||
|
vacuum_defer_cleanup_age : 0
|
||||||
|
vacuum_freeze_min_age : 50000000
|
||||||
|
vacuum_freeze_table_age : 150000000
|
||||||
|
vacuum_multixact_freeze_min_age : 5000000
|
||||||
|
vacuum_multixact_freeze_table_age : 150000000
|
||||||
|
wal_block_size : 8192
|
||||||
|
wal_buffers : 512
|
||||||
|
wal_compression : off
|
||||||
|
wal_keep_segments : 0
|
||||||
|
wal_level : minimal
|
||||||
|
wal_log_hints : off
|
||||||
|
wal_receiver_status_interval : 10
|
||||||
|
wal_receiver_timeout : 60000
|
||||||
|
wal_retrieve_retry_interval : 5000
|
||||||
|
wal_segment_size : 2048
|
||||||
|
wal_sender_timeout : 60000
|
||||||
|
wal_sync_method : fdatasync
|
||||||
|
wal_writer_delay : 200
|
||||||
|
wal_writer_flush_after : 128
|
||||||
|
work_mem : 4096
|
||||||
|
xmlbinary : base64
|
||||||
|
xmloption : content
|
||||||
|
zero_damaged_pages : off
|
||||||
|
|
||||||
|
##### --- Processes start up command --- ####
|
||||||
|
No postgres process found
|
||||||
|
|
||||||
|
Minimum auth role
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This program needs to run some commands like ``getShardMap`` and to be able to run those commands
|
||||||
|
it needs to run under a user with the ``clusterAdmin`` or ``root`` built-in roles.
|
@@ -1,6 +1,65 @@
|
|||||||
Percona Toolkit
|
Percona Toolkit
|
||||||
***************
|
***************
|
||||||
|
|
||||||
|
v3.2.0 released 2020-04-23
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Improvements:
|
||||||
|
|
||||||
|
* :jirabug:`PT-1773`: Don't make the foreign key check in ``pt-online-schema-change`` if not needed.
|
||||||
|
* :jirabug:`PT-1757`: ``pt-table-checksum`` can now handle small tables as a single chunk.
|
||||||
|
* :jirabug:`PT-1813`: MariaDB 10.4 is now supported.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* :jirabug:`PT-1782`: ``pt-online-schema-change`` declined to handle tables because of foreign keys even when there were no foreign keys with some MariaDB 10.2 and MySQL 8 versions.
|
||||||
|
* :jirabug:`PT-1759`: ``pt-stalk`` with ``--mysql-only`` option didn't collect MySQL Status variables.
|
||||||
|
* :jirabug:`PT-1802`: ``pt-online-schema-change`` didn't handle self-referencing foreign keys properly which caused an unnecessarily high resource consumption.
|
||||||
|
* :jirabug:`PT-1766`: ``pt-table-checksum`` ``DIFF_ROWS`` was not computed correctly.
|
||||||
|
* :jirabug:`PT-1760`: ``pt-online-schema-change`` regression caused it to hang for a stopped replica when using replication channels on the slave.
|
||||||
|
* :jirabug:`PT-1707`: A number of the Percona Toolkit tools failed to operate in the IPv6 environment if the host address specified as a parameter was not enclosed in square brackets.
|
||||||
|
* :jirabug:`PT-1502`: ``pt-online-schema-change`` was not recognizing the slave with multi-source replication active.
|
||||||
|
* :jirabug:`PT-1824`: ``pt-online-schema-change`` allowed the name of a constraint to exceed 64 characters when ``--alter-foreign-keys-method=rebuild_constraints`` was used. (Thank you, Iwo Panowicz.)
|
||||||
|
* :jirabug:`PT-1765`: Documentation for ``DIFF_ROWS`` doesn't exist.
|
||||||
|
* :jirabug:`PT-297`: ``pt-online-schema-change`` could break replication.
|
||||||
|
* :jirabug:`PT-1768`: Source code for ``src/go/pt-mongodb-query-digest/pt-mongodb-query-digest`` was missing in the official source tar ball.
|
||||||
|
* :jirabug:`PT-1576`: ``pt-stalk` with ``--mysql-only`` option was not adding MySQL ``processlist`` information to the output file.
|
||||||
|
* :jirabug:`PT-1793`: ``pt-query-digest`` was unable to handle the year 2020 because of wrong ``tcpdump`` parsing. (Thank you, Kei Tsuchiya.)
|
||||||
|
|
||||||
|
|
||||||
|
v3.1.0 released 2019-09-12
|
||||||
|
==========================
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
* :jirabug:`PT-1663`: Implement retention by bytes for pt-stalk
|
||||||
|
|
||||||
|
Improvements:
|
||||||
|
|
||||||
|
* :jirabug:`PT-1705`: Make pt-online-schema-change exit with different codes depending on the status
|
||||||
|
* :jirabug:`PT-1761`: Prevent pt-osc to run under MySQL 8.0.14+ & 8.0.17
|
||||||
|
* :jirabug:`PT-1746`: diskstats not working for kernel 4.18+
|
||||||
|
|
||||||
|
Bugs Fixed:
|
||||||
|
|
||||||
|
* :jirabug:`PT-1736`: pt-kill ignores --busy-time and --kill-busy-commands=Query when there is a process with Command=Execute
|
||||||
|
* :jirabug:`PT-1575`: pt-mysql-summary does not print PXC section for PXC 5.6 and 5.7
|
||||||
|
* :jirabug:`PT-1728`: Pt-table-checksum failing to scan small tables that get wiped out often
|
||||||
|
* :jirabug:`PT-1720`: pt-pmp parses configuration files that lead to errors
|
||||||
|
* :jirabug:`PT-1114`: LP #1182180: pt-table-checksum fails when table is empty
|
||||||
|
* :jirabug:`PT-1715`: pt-upgrade documentation doesn't have the type tcpdump
|
||||||
|
* :jirabug:`PT-1344`: LP #1580428: pt-online-schema-change: Use of uninitialized value $host in string
|
||||||
|
* :jirabug:`PT-1492`: pt-kill in version 3.0.7 seems not to respect busy-time any longer
|
||||||
|
* :jirabug:`PT-1798`: CLONE - yum repos do not contain 3.1.1 of percona toolkit
|
||||||
|
* :jirabug:`PT-1797`: yum repos do not contain 3.1.1 of percona toolkit
|
||||||
|
* :jirabug:`PT-1633`: pt-config-diff doesn't handle innodb_temp_data_file_path correctly
|
||||||
|
* :jirabug:`PT-1630`: pt-table-checksum not working with galera cluster anymore since 3.0.11
|
||||||
|
* :jirabug:`PT-1734`: Tailing log_error in pt-stalk doesn't work
|
||||||
|
* :jirabug:`PT-1732`: Typo in link on percona.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
v3.0.13 released 2019-01-03
|
v3.0.13 released 2019-01-03
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
@@ -51,8 +110,7 @@ New features
|
|||||||
|
|
||||||
* :jirabug:`PT-1571`: Improved hostname recognition in ``pt-secure-collect``
|
* :jirabug:`PT-1571`: Improved hostname recognition in ``pt-secure-collect``
|
||||||
* :jirabug:`PT-1569`: Disabled ``--alter-foreign-keys-method=drop_swap`` in ``pt-online-schema-change``
|
* :jirabug:`PT-1569`: Disabled ``--alter-foreign-keys-method=drop_swap`` in ``pt-online-schema-change``
|
||||||
* :jirabug:`PT-242`: (``pt-stalk``) Include ``SHOW SLAVE STATUS`` on MySQL 5.7 (Thanks `Marcelo Altmann <https://www.p
|
* :jirabug:`PT-242`: (``pt-stalk``) Include ``SHOW SLAVE STATUS`` on MySQL 5.7 (Thanks `Marcelo Altmann <https://www.percona.com/blog/author/marcelo-altmann/>`_)
|
||||||
ercona.com/blog/author/marcelo-altmann/>`_)
|
|
||||||
|
|
||||||
Fixed bugs
|
Fixed bugs
|
||||||
|
|
||||||
@@ -541,7 +599,7 @@ Bug Fixes:
|
|||||||
|
|
||||||
* Bug 1336734: ``pt-online-schema-change`` has implemented new ``--null-to-non-null`` flag which can be used to convert ``NULL`` columns to ``NOT NULL``.
|
* Bug 1336734: ``pt-online-schema-change`` has implemented new ``--null-to-non-null`` flag which can be used to convert ``NULL`` columns to ``NOT NULL``.
|
||||||
|
|
||||||
* Bug 1362942: ``pt-slave-restart`` would fail to run on |MariaDB| 10.0.13 due to a different implementation of ``GTID``.
|
* Bug 1362942: ``pt-slave-restart`` would fail to run on MariaDB 10.0.13 due to a different implementation of ``GTID``.
|
||||||
|
|
||||||
* Bug 1389041: ``pt-table-checksum`` had a high likelihood to skip a table when row count was around ``chunk-size`` * ``chunk-size-limit``. To address this issue a new ``--slave-skip-tolerance`` option has been implemented.
|
* Bug 1389041: ``pt-table-checksum`` had a high likelihood to skip a table when row count was around ``chunk-size`` * ``chunk-size-limit``. To address this issue a new ``--slave-skip-tolerance`` option has been implemented.
|
||||||
|
|
||||||
@@ -1079,17 +1137,17 @@ pt-query-digest --output json includes query examples as of v2.2.3. Some people
|
|||||||
When using drop swap with pt-online-schema-change there is some production impact. This impact can be measured because tool outputs the current timestamp on lines for operations that may take awhile.
|
When using drop swap with pt-online-schema-change there is some production impact. This impact can be measured because tool outputs the current timestamp on lines for operations that may take awhile.
|
||||||
|
|
||||||
* Fixed bug #1163735: pt-table-checksum fails if explicit_defaults_for_timestamp is enabled in 5.6
|
* Fixed bug #1163735: pt-table-checksum fails if explicit_defaults_for_timestamp is enabled in 5.6
|
||||||
pt-table-checksum would fail if variable explicit_defaults_for_timestamp was enabled in MySQL 5.6.
|
pt-table-checksum would fail if variable explicit_defaults_for_timestamp was enabled in MySQL 5.6.
|
||||||
|
|
||||||
* Fixed bug #1182856: Zero values causes "Invalid --set-vars value: var=0"
|
* Fixed bug #1182856: Zero values causes "Invalid --set-vars value: var=0"
|
||||||
Trying to assign 0 to any variable by using --set-vars option would cause “Invalid --set-vars value” message.
|
Trying to assign 0 to any variable by using --set-vars option would cause “Invalid --set-vars value” message.
|
||||||
|
|
||||||
* Fixed bug #1188264: pt-online-schema-change error copying rows: Undefined subroutine &pt_online_schema_change::get
|
* Fixed bug #1188264: pt-online-schema-change error copying rows: Undefined subroutine &pt_online_schema_change::get
|
||||||
|
|
||||||
* Fixed the typo in the pt-online-schema-change code that could lead to a tool crash when copying the rows.
|
* Fixed the typo in the pt-online-schema-change code that could lead to a tool crash when copying the rows.
|
||||||
|
|
||||||
* Fixed bug #1199591: pt-table-checksum doesn't use non-unique index with highest cardinality
|
* Fixed bug #1199591: pt-table-checksum doesn't use non-unique index with highest cardinality
|
||||||
pt-table-checksum was using the first non-unique index instead of the one with the highest cardinality due to a sorting bug.
|
pt-table-checksum was using the first non-unique index instead of the one with the highest cardinality due to a sorting bug.
|
||||||
|
|
||||||
Percona Toolkit packages can be downloaded from
|
Percona Toolkit packages can be downloaded from
|
||||||
http://www.percona.com/downloads/percona-toolkit/ or the Percona Software
|
http://www.percona.com/downloads/percona-toolkit/ or the Percona Software
|
||||||
|
44
docs/rn.3-1-0.txt
Normal file
44
docs/rn.3-1-0.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
.. _PT-3.1.0:
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
*Percona Toolkit* 3.1.0
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
:Date: September 12, 2019
|
||||||
|
:Installation: `Installing Percona Toolkit <https://www.percona.com/doc/percona-toolkit/LATEST/installation.html>`_
|
||||||
|
|
||||||
|
New Features
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* :jirabug:`PT-1663`: Implement retention by bytes for pt-stalk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Improvements
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* :jirabug:`PT-1705`: Make pt-online-schema-change exit with different codes depending on the status
|
||||||
|
* :jirabug:`PT-1761`: Prevent pt-osc to run under MySQL 8.0.14+ & 8.0.17
|
||||||
|
* :jirabug:`PT-1746`: diskstats not working for kernel 4.18+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Bugs Fixed
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* :jirabug:`PT-1736`: pt-kill ignores --busy-time and --kill-busy-commands=Query when there is a process with Command=Execute
|
||||||
|
* :jirabug:`PT-1575`: pt-mysql-summary does not print PXC section for PXC 5.6 and 5.7
|
||||||
|
* :jirabug:`PT-1728`: Pt-table-checksum failing to scan small tables that get wiped out often
|
||||||
|
* :jirabug:`PT-1720`: pt-pmp parses configuration files that lead to errors
|
||||||
|
* :jirabug:`PT-1114`: LP #1182180: pt-table-checksum fails when table is empty
|
||||||
|
* :jirabug:`PT-1715`: pt-upgrade documentation doesn't have the type tcpdump
|
||||||
|
* :jirabug:`PT-1344`: LP #1580428: pt-online-schema-change: Use of uninitialized value $host in string
|
||||||
|
* :jirabug:`PT-1492`: pt-kill in version 3.0.7 seems not to respect busy-time any longer
|
||||||
|
* :jirabug:`PT-1798`: CLONE - yum repos do not contain 3.1.1 of percona toolkit
|
||||||
|
* :jirabug:`PT-1797`: yum repos do not contain 3.1.1 of percona toolkit
|
||||||
|
* :jirabug:`PT-1633`: pt-config-diff doesn't handle innodb_temp_data_file_path correctly
|
||||||
|
* :jirabug:`PT-1630`: pt-table-checksum not working with galera cluster anymore since 3.0.11
|
||||||
|
* :jirabug:`PT-1734`: Tailing log_error in pt-stalk doesn't work
|
||||||
|
* :jirabug:`PT-1732`: Typo in link on percona.com
|
||||||
|
|
||||||
|
|
37
docs/rn.3-2-0.txt
Normal file
37
docs/rn.3-2-0.txt
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
.. _PT-3.2.0:
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
*Percona Toolkit* 3.2.0
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
:Date: April 23, 2020
|
||||||
|
|
||||||
|
:Installation: `Installing Percona Toolkit <https://www.percona.com/doc/percona-toolkit/3.0/installation.html>`_
|
||||||
|
|
||||||
|
Improvements
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* :jirabug:`PT-1773`: Don't make the foreign key check in ``pt-online-schema-change`` if not needed.
|
||||||
|
* :jirabug:`PT-1757`: ``pt-table-checksum`` can now handle small tables as a single chunk.
|
||||||
|
* :jirabug:`PT-1813`: MariaDB 10.4 is now supported.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Bugs Fixed
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* :jirabug:`PT-1782`: ``pt-online-schema-change`` declined to handle tables because of foreign keys even when there were no foreign keys with some MariaDB 10.2 and MySQL 8 versions.
|
||||||
|
* :jirabug:`PT-1759`: ``pt-stalk`` with ``--mysql-only`` option didn't collect MySQL Status variables.
|
||||||
|
* :jirabug:`PT-1802`: ``pt-online-schema-change`` didn't handle self-referencing foreign keys properly which caused an unnecessarily high resource consumption.
|
||||||
|
* :jirabug:`PT-1766`: ``pt-table-checksum`` ``DIFF_ROWS`` was not computed correctly.
|
||||||
|
* :jirabug:`PT-1760`: ``pt-online-schema-change`` regression caused it to hang for a stopped replica when using replication channels on the slave.
|
||||||
|
* :jirabug:`PT-1707`: A number of the Percona Toolkit tools failed to operate in the IPv6 environment if the host address specified as a parameter was not enclosed in square brackets.
|
||||||
|
* :jirabug:`PT-1502`: ``pt-online-schema-change`` was not recognizing the slave with multi-source replication active.
|
||||||
|
* :jirabug:`PT-1824`: ``pt-online-schema-change`` allowed the name of a constraint to exceed 64 characters when ``--alter-foreign-keys-method=rebuild_constraints`` was used. (Thank you, Iwo Panowicz.)
|
||||||
|
* :jirabug:`PT-1765`: Documentation for ``DIFF_ROWS`` doesn't exist.
|
||||||
|
* :jirabug:`PT-297`: ``pt-online-schema-change`` could break replication.
|
||||||
|
* :jirabug:`PT-1768`: Source code for ``src/go/pt-mongodb-query-digest/pt-mongodb-query-digest`` was missing in the official source tar ball.
|
||||||
|
* :jirabug:`PT-1576`: ``pt-stalk` with ``--mysql-only`` option was not adding MySQL ``processlist`` information to the output file.
|
||||||
|
* :jirabug:`PT-1793`: ``pt-query-digest`` was unable to handle the year 2020 because of wrong ``tcpdump`` parsing. (Thank you, Kei Tsuchiya.)
|
||||||
|
|
||||||
|
|
@@ -99,7 +99,7 @@ of environments running Percona Software and it is good choice for majority of
|
|||||||
the users.
|
the users.
|
||||||
|
|
||||||
Why not rely on Operating System's built in functionality for software updates?
|
Why not rely on Operating System's built in functionality for software updates?
|
||||||
-----------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
In many environments the Operating Systems repositories may not carry the
|
In many environments the Operating Systems repositories may not carry the
|
||||||
latest version of software and newer versions of software often installed
|
latest version of software and newer versions of software often installed
|
||||||
|
@@ -18,7 +18,7 @@ BIN_DIR=$(shell git rev-parse --show-toplevel)/bin
|
|||||||
SRC_DIR=$(shell git rev-parse --show-toplevel)/src/go
|
SRC_DIR=$(shell git rev-parse --show-toplevel)/src/go
|
||||||
LDFLAGS="-X main.Version=${VERSION} -X main.Build=${BUILD} -X main.GoVersion=${GOVERSION} -X main.Commit=${COMMIT} -s -w"
|
LDFLAGS="-X main.Version=${VERSION} -X main.Build=${BUILD} -X main.GoVersion=${GOVERSION} -X main.Commit=${COMMIT} -s -w"
|
||||||
|
|
||||||
TEST_PSMDB_VERSION?=3.6
|
TEST_PSMDB_VERSION?=4.0
|
||||||
TEST_MONGODB_FLAVOR?=percona/percona-server-mongodb
|
TEST_MONGODB_FLAVOR?=percona/percona-server-mongodb
|
||||||
TEST_MONGODB_ADMIN_USERNAME?=admin
|
TEST_MONGODB_ADMIN_USERNAME?=admin
|
||||||
TEST_MONGODB_ADMIN_PASSWORD?=admin123456
|
TEST_MONGODB_ADMIN_PASSWORD?=admin123456
|
||||||
|
@@ -4,13 +4,10 @@ services:
|
|||||||
standalone:
|
standalone:
|
||||||
network_mode: host
|
network_mode: host
|
||||||
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
|
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
|
||||||
|
environment:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: ${TEST_MONGODB_ADMIN_USERNAME}
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: ${TEST_MONGODB_ADMIN_PASSWORD}
|
||||||
command: --port=27017
|
command: --port=27017
|
||||||
volumes:
|
|
||||||
- ./docker/test/entrypoint-mongod.sh:/entrypoint.sh:ro
|
|
||||||
- ./docker/test/entrypoint-mongod.sh:/usr/local/bin/docker-entrypoint.sh:ro
|
|
||||||
- ./docker/test/mongod.key:/mongod.key:ro
|
|
||||||
- ./docker/test/ssl/rootCA.crt:/rootCA.crt:ro
|
|
||||||
- ./docker/test/ssl/mongodb.pem:/mongod.pem:ro
|
|
||||||
s1-mongo1:
|
s1-mongo1:
|
||||||
network_mode: host
|
network_mode: host
|
||||||
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
|
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
|
||||||
|
@@ -30,6 +30,8 @@ const (
|
|||||||
envMongoDBConfigsvr3Port = "TEST_MONGODB_CONFIGSVR3_PORT"
|
envMongoDBConfigsvr3Port = "TEST_MONGODB_CONFIGSVR3_PORT"
|
||||||
//
|
//
|
||||||
envMongoDBMongosPort = "TEST_MONGODB_MONGOS_PORT"
|
envMongoDBMongosPort = "TEST_MONGODB_MONGOS_PORT"
|
||||||
|
|
||||||
|
envMongoDBStandalonePort = "TEST_MONGODB_STANDALONE_PORT"
|
||||||
//
|
//
|
||||||
envMongoDBUser = "TEST_MONGODB_ADMIN_USERNAME"
|
envMongoDBUser = "TEST_MONGODB_ADMIN_USERNAME"
|
||||||
envMongoDBPassword = "TEST_MONGODB_ADMIN_PASSWORD"
|
envMongoDBPassword = "TEST_MONGODB_ADMIN_PASSWORD"
|
||||||
@@ -39,6 +41,9 @@ var (
|
|||||||
// MongoDBHost is the hostname. Since it runs locally, it is localhost
|
// MongoDBHost is the hostname. Since it runs locally, it is localhost
|
||||||
MongoDBHost = "127.0.0.1"
|
MongoDBHost = "127.0.0.1"
|
||||||
|
|
||||||
|
// Port for standalone instance
|
||||||
|
MongoDBStandalonePort = os.Getenv(envMongoDBStandalonePort)
|
||||||
|
|
||||||
// MongoDBShard1ReplsetName Replicaset name for shard 1
|
// MongoDBShard1ReplsetName Replicaset name for shard 1
|
||||||
MongoDBShard1ReplsetName = os.Getenv(envMongoDBShard1ReplsetName)
|
MongoDBShard1ReplsetName = os.Getenv(envMongoDBShard1ReplsetName)
|
||||||
// MongoDBShard1PrimaryPort is the port for the primary instance of shard 1
|
// MongoDBShard1PrimaryPort is the port for the primary instance of shard 1
|
||||||
|
@@ -2,7 +2,6 @@ package util
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -13,8 +12,13 @@ import (
|
|||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
shardingNotEnabledErrorCode = 203
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
CANNOT_GET_QUERY_ERROR = errors.New("cannot get query field from the profile document (it is not a map)")
|
CannotGetQueryError = errors.New("cannot get query field from the profile document (it is not a map)")
|
||||||
|
ShardingNotEnabledError = errors.New("sharding not enabled")
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOptions) ([]proto.Members, error) {
|
func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOptions) ([]proto.Members, error) {
|
||||||
@@ -92,7 +96,7 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
|
|||||||
membersMap[m.Name] = m
|
membersMap[m.Name] = m
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Disconnect(ctx)
|
client.Disconnect(ctx) //nolint
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, member := range membersMap {
|
for _, member := range membersMap {
|
||||||
@@ -119,6 +123,9 @@ func GetHostnames(ctx context.Context, client *mongo.Client) ([]string, error) {
|
|||||||
var shardsMap proto.ShardsMap
|
var shardsMap proto.ShardsMap
|
||||||
smRes := client.Database("admin").RunCommand(ctx, primitive.M{"getShardMap": 1})
|
smRes := client.Database("admin").RunCommand(ctx, primitive.M{"getShardMap": 1})
|
||||||
if smRes.Err() != nil {
|
if smRes.Err() != nil {
|
||||||
|
if e, ok := smRes.Err().(mongo.CommandError); ok && e.Code == shardingNotEnabledErrorCode {
|
||||||
|
return nil, ShardingNotEnabledError // standalone instance
|
||||||
|
}
|
||||||
return nil, errors.Wrap(smRes.Err(), "cannot getShardMap for GetHostnames")
|
return nil, errors.Wrap(smRes.Err(), "cannot getShardMap for GetHostnames")
|
||||||
}
|
}
|
||||||
if err := smRes.Decode(&shardsMap); err != nil {
|
if err := smRes.Decode(&shardsMap); err != nil {
|
||||||
@@ -134,7 +141,8 @@ func GetHostnames(ctx context.Context, client *mongo.Client) ([]string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("cannot get shards map")
|
// Some MongoDB servers won't return ShardingNotEnabledError for stand alone instances.
|
||||||
|
return nil, nil // standalone instance
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildHostsListFromReplStatus(replStatus proto.ReplicaSetStatus) []string {
|
func buildHostsListFromReplStatus(replStatus proto.ReplicaSetStatus) []string {
|
||||||
@@ -265,7 +273,7 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
|
|||||||
if ssquery, ok := squery.(primitive.M); ok {
|
if ssquery, ok := squery.(primitive.M); ok {
|
||||||
return ssquery, nil
|
return ssquery, nil
|
||||||
}
|
}
|
||||||
return nil, CANNOT_GET_QUERY_ERROR
|
return nil, CannotGetQueryError
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -301,7 +309,7 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
|
|||||||
if ssquery, ok := squery.(primitive.M); ok {
|
if ssquery, ok := squery.(primitive.M); ok {
|
||||||
return ssquery, nil
|
return ssquery, nil
|
||||||
}
|
}
|
||||||
return nil, CANNOT_GET_QUERY_ERROR
|
return nil, CannotGetQueryError
|
||||||
}
|
}
|
||||||
|
|
||||||
// "query" in MongoDB 3.2+ is better structured and always has a "filter" subkey:
|
// "query" in MongoDB 3.2+ is better structured and always has a "filter" subkey:
|
||||||
@@ -309,7 +317,7 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
|
|||||||
if ssquery, ok := squery.(primitive.M); ok {
|
if ssquery, ok := squery.(primitive.M); ok {
|
||||||
return ssquery, nil
|
return ssquery, nil
|
||||||
}
|
}
|
||||||
return nil, CANNOT_GET_QUERY_ERROR
|
return nil, CannotGetQueryError
|
||||||
}
|
}
|
||||||
|
|
||||||
// {"ns":"test.system.js","op":"query","query":{"find":"system.js"}}
|
// {"ns":"test.system.js","op":"query","query":{"find":"system.js"}}
|
||||||
|
@@ -14,24 +14,34 @@ import (
|
|||||||
|
|
||||||
func TestGetHostnames(t *testing.T) {
|
func TestGetHostnames(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
uri string
|
uri string
|
||||||
want []string
|
want []string
|
||||||
|
wantError bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "from_mongos",
|
name: "from_mongos",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBMongosPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBMongosPort),
|
||||||
want: []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17004", "127.0.0.1:17005", "127.0.0.1:17007"},
|
want: []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17004", "127.0.0.1:17005", "127.0.0.1:17007"},
|
||||||
|
wantError: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "from_mongod",
|
name: "from_mongod",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard1PrimaryPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard1PrimaryPort),
|
||||||
want: []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17003"},
|
want: []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17003"},
|
||||||
|
wantError: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "from_non_sharded",
|
name: "from_non_sharded",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard3PrimaryPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard3PrimaryPort),
|
||||||
want: []string{"127.0.0.1:17021", "127.0.0.1:17022", "127.0.0.1:17023"},
|
want: []string{"127.0.0.1:17021", "127.0.0.1:17022", "127.0.0.1:17023"},
|
||||||
|
wantError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "from_standalone",
|
||||||
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBStandalonePort),
|
||||||
|
want: nil,
|
||||||
|
wantError: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,12 +59,12 @@ func TestGetHostnames(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hostnames, err := GetHostnames(ctx, client)
|
hostnames, err := GetHostnames(ctx, client)
|
||||||
if err != nil {
|
if err != nil && !test.wantError {
|
||||||
t.Errorf("getHostnames: %v", err)
|
t.Errorf("Expecting error=nil, got: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !reflect.DeepEqual(hostnames, test.want) {
|
if !reflect.DeepEqual(hostnames, test.want) {
|
||||||
t.Errorf("Invalid hostnames from mongos. Got: %+v, want %+v", hostnames, test.want)
|
t.Errorf("Invalid hostnames. Got: %+v, want %+v", hostnames, test.want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -81,24 +91,34 @@ func TestGetServerStatus(t *testing.T) {
|
|||||||
|
|
||||||
func TestGetReplicasetMembers(t *testing.T) {
|
func TestGetReplicasetMembers(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
uri string
|
uri string
|
||||||
want int
|
want int
|
||||||
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "from_mongos",
|
name: "from_mongos",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBMongosPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBMongosPort),
|
||||||
want: 7,
|
want: 7,
|
||||||
|
wantErr: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "from_mongod",
|
name: "from_mongod",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard1PrimaryPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard1PrimaryPort),
|
||||||
want: 3,
|
want: 3,
|
||||||
|
wantErr: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "from_non_sharded",
|
name: "from_non_sharded",
|
||||||
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard3PrimaryPort),
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard3PrimaryPort),
|
||||||
want: 3,
|
want: 3,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "from_standalone",
|
||||||
|
uri: fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBStandalonePort),
|
||||||
|
want: 0,
|
||||||
|
wantErr: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +129,7 @@ func TestGetReplicasetMembers(t *testing.T) {
|
|||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
rsm, err := GetReplicasetMembers(ctx, clientOptions)
|
rsm, err := GetReplicasetMembers(ctx, clientOptions)
|
||||||
if err != nil {
|
if err != nil && !test.wantErr {
|
||||||
t.Errorf("Got an error while getting replicaset members: %s", err)
|
t.Errorf("Got an error while getting replicaset members: %s", err)
|
||||||
}
|
}
|
||||||
if len(rsm) != test.want {
|
if len(rsm) != test.want {
|
||||||
@@ -146,7 +166,7 @@ func TestGetShardedHosts(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for i, test := range testCases {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
clientOptions := options.Client().ApplyURI(test.uri)
|
clientOptions := options.Client().ApplyURI(test.uri)
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
|
||||||
@@ -156,6 +176,10 @@ func TestGetShardedHosts(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Cannot get a new client for host %s: %s", test.uri, err)
|
t.Errorf("Cannot get a new client for host %s: %s", test.uri, err)
|
||||||
}
|
}
|
||||||
|
if client == nil {
|
||||||
|
t.Fatalf("mongodb client is nil i: %d, uri: %s\n", i, test.uri)
|
||||||
|
}
|
||||||
|
|
||||||
if err := client.Connect(ctx); err != nil {
|
if err := client.Connect(ctx); err != nil {
|
||||||
t.Errorf("Cannot connect to host %s: %s", test.uri, err)
|
t.Errorf("Cannot connect to host %s: %s", test.uri, err)
|
||||||
}
|
}
|
@@ -38,13 +38,19 @@ const (
|
|||||||
DefaultRunningOpsSamples = 5
|
DefaultRunningOpsSamples = 5
|
||||||
DefaultOutputFormat = "text"
|
DefaultOutputFormat = "text"
|
||||||
typeMongos = "mongos"
|
typeMongos = "mongos"
|
||||||
|
|
||||||
|
// Exit Codes
|
||||||
|
cannotFormatResults = 1
|
||||||
|
cannotParseCommandLineParameters = 2
|
||||||
|
cannotGetHostInfo = 3
|
||||||
|
cannotGetReplicasetMembers = 4
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Build string = "2020-04-23" // nolint
|
Build string = "2020-04-23" // nolint
|
||||||
GoVersion string = "1.14.1" // nolint
|
GoVersion string = "1.14.1" // nolint
|
||||||
Version string = "3.2.0" // nolint
|
Version string = "3.2.0"
|
||||||
Commit string // nolint
|
Commit string
|
||||||
)
|
)
|
||||||
|
|
||||||
type TimedStats struct {
|
type TimedStats struct {
|
||||||
@@ -158,7 +164,7 @@ func main() {
|
|||||||
opts, err := parseFlags()
|
opts, err := parseFlags()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("cannot get parameters: %s", err.Error())
|
log.Errorf("cannot get parameters: %s", err.Error())
|
||||||
os.Exit(2)
|
os.Exit(cannotParseCommandLineParameters)
|
||||||
}
|
}
|
||||||
if opts == nil && err == nil {
|
if opts == nil && err == nil {
|
||||||
return
|
return
|
||||||
@@ -206,7 +212,7 @@ func main() {
|
|||||||
defer client.Disconnect(ctx) // nolint
|
defer client.Disconnect(ctx) // nolint
|
||||||
|
|
||||||
hostnames, err := util.GetHostnames(ctx, client)
|
hostnames, err := util.GetHostnames(ctx, client)
|
||||||
if err != nil {
|
if err != nil && errors.Is(err, util.ShardingNotEnabledError) {
|
||||||
log.Errorf("Cannot get hostnames: %s", err)
|
log.Errorf("Cannot get hostnames: %s", err)
|
||||||
}
|
}
|
||||||
log.Debugf("hostnames: %v", hostnames)
|
log.Debugf("hostnames: %v", hostnames)
|
||||||
@@ -217,12 +223,11 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
message := fmt.Sprintf("Cannot get host info for %q: %s", opts.Host, err.Error())
|
message := fmt.Sprintf("Cannot get host info for %q: %s", opts.Host, err.Error())
|
||||||
log.Errorf(message)
|
log.Errorf(message)
|
||||||
os.Exit(2)
|
os.Exit(cannotGetHostInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ci.ReplicaMembers, err = util.GetReplicasetMembers(ctx, clientOptions); err != nil {
|
if ci.ReplicaMembers, err = util.GetReplicasetMembers(ctx, clientOptions); err != nil {
|
||||||
log.Warnf("[Error] cannot get replicaset members: %v\n", err)
|
log.Warnf("[Error] cannot get replicaset members: %v\n", err)
|
||||||
os.Exit(2)
|
|
||||||
}
|
}
|
||||||
log.Debugf("replicaMembers:\n%+v\n", ci.ReplicaMembers)
|
log.Debugf("replicaMembers:\n%+v\n", ci.ReplicaMembers)
|
||||||
|
|
||||||
@@ -270,10 +275,9 @@ func main() {
|
|||||||
out, err := formatResults(ci, opts.OutputFormat)
|
out, err := formatResults(ci, opts.OutputFormat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Cannot format the results: %s", err.Error())
|
log.Errorf("Cannot format the results: %s", err.Error())
|
||||||
os.Exit(1)
|
os.Exit(cannotFormatResults)
|
||||||
}
|
}
|
||||||
fmt.Println(string(out))
|
fmt.Println(string(out))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatResults(ci *collectedInfo, format string) ([]byte, error) {
|
func formatResults(ci *collectedInfo, format string) ([]byte, error) {
|
||||||
|
Reference in New Issue
Block a user