Compare commits

..

58 Commits

Author SHA1 Message Date
Paul Jacobs
e207d53225 Release notes for 3.2.0 2020-04-22 19:39:41 +03:00
Alexey Palazhchenko
e20e3c879b Relax github.com/pkg/errors dependency.
That way pmm-agent can use 0.9.1 without breaking other users.
2020-04-21 14:09:04 +03:00
Carlos Salguero
834df307ca Merge pull request #440 from impimp/PT-1824
PT-1824: Name of a constraint can exceed 64 when --alter-foreign-keys…
2020-04-16 16:13:11 -03:00
IP
76cffde87e PT-1824: Name of a constraint can exceed 64 when --alter-foreign-keys-method=rebuild_constraints used
The maxium possible length of a constraint name is 64. When --alter-foreign-keys-method=rebuild_constraints used,
pt-online-schema-change just adds `_`-character. This commit forces the maximum length of constraint name to 64 characters.
2020-04-10 11:46:10 +02:00
Carlos Salguero
f80c098614 Merge branch '3.0' of percona.github.com:percona/percona-toolkit into 3.0 2020-04-01 15:39:45 -03:00
Carlos Salguero
45522dea28 Renamed dubious tests 2020-04-01 15:39:16 -03:00
Carlos Salguero
b5a593dc16 Updated TableNibbler 2020-03-31 13:19:26 -03:00
Carlos Salguero
fc631efb32 Fixed long_fk_constraints.t 2020-03-31 11:27:04 -03:00
Carlos Salguero
2f07f776b5 Updated DNSParser in all programs 2020-03-31 10:11:48 -03:00
Nurlan Moldomurov
384b841ea2 Merge pull request #438 from percona/PT-1810
PT-1810 Update UUID package
2020-03-31 00:04:48 +03:00
Carlos Salguero
a3ab87b12e Fixed pt-archiver tests 2020-03-30 14:57:02 -03:00
Carlos Salguero
fa4bb014ec PT-1810 Adding container name in docker-compose 2020-03-30 13:44:14 -03:00
Carlos Salguero
25b8421447 PT-1810 Adding container name in docker-compose 2020-03-30 13:29:19 -03:00
Carlos Salguero
06a60c906a PT-1810 debug in travis 2020-03-30 13:02:28 -03:00
Carlos Salguero
55f719fa79 PT-1810 Fixex travis 2020-03-30 12:51:01 -03:00
Carlos Salguero
7e7eecc68f PT-1810 Updated travis & compose to include postgres 2020-03-30 12:17:24 -03:00
Carlos Salguero
1b7d526722 PT-1810 test 2020-03-30 10:42:00 -03:00
Carlos Salguero
d531164921 PT-1810 Updated testing MongoDB certs 2020-03-30 08:35:57 -03:00
Carlos Salguero
f0ee14d479 WIP 2020-03-30 08:21:05 -03:00
Carlos Salguero
670dd962a9 Merged 3.0 branch 2020-03-26 08:41:25 -03:00
Carlos Salguero
6f75eb1877 PT-1810 Updated deps for google/uuid 2020-03-25 15:06:32 -03:00
Carlos Salguero
9e856562af PT-1810 Use of Google's UUID pkg 2020-03-25 15:04:44 -03:00
Carlos Salguero
a7ec40383f PT-1810 Updated deps 2020-03-17 22:45:31 -03:00
Artem Gavrilov
8abdc07050 PMM-5192 Update Go version to 1.13 2020-02-19 22:20:39 +03:00
Carlos Salguero
f79e153d9d PT-1793 Updated changelog 2020-01-15 17:53:56 -03:00
Carlos Salguero
f6ea741467 Merge pull request #434 from kei500/feature/pt-query-digest-year-2020-problem
workaround for year 2020 problem
2020-01-15 17:52:09 -03:00
Kei Tsuchiya
d623201275 fix TcpdumpParser.pm and embed into pt-query-digest and pt-upgrade 2020-01-11 04:11:34 +09:00
Kei Tsuchiya
e9becc267c workaround for year 2020 problem 2020-01-10 01:16:17 +09:00
Carlos Salguero
ed8eb16569 Merge pull request #433 from percona/PT-1766
PT-1766 Fixed DIFF_ROWS calculation
2019-12-23 08:44:30 -03:00
Carlos Salguero
2821b847b3 PT-1766 Fixed DIFF_ROWS calculation
- Fixed DIFF_ROWS calculation
- Removed unused param --force-concat-enums
2019-12-23 08:42:38 -03:00
Carlos Salguero
68dc98c2ba PMM-4010 Updated travis.yml (#432) 2019-12-19 15:19:01 +03:00
Carlos Salguero
11ae9b5b64 Removed debug code 2019-12-10 15:00:44 -03:00
Carlos Salguero
25b637d4bd Merge pull request #427 from percona/PT-1747
PT-1747 Improved FK rebuild constraints
2019-12-10 14:57:11 -03:00
Carlos Salguero
bd32e51ec5 PT-1747 Updated doc 2019-12-10 14:56:36 -03:00
Carlos Salguero
38c169031e Merge pull request #430 from percona/PT-1707_update_master_slave_pm
PT-1707 Updated MasterSlave in all scripts
2019-11-26 10:25:29 -03:00
Carlos Salguero
a2159c259d PT-1707 Updated MasterSlave in all scripts 2019-11-26 10:11:26 -03:00
Carlos Salguero
e97d80cde0 PT-1747 Updated MySQL version check 2019-11-26 10:04:56 -03:00
Carlos Salguero
3d78e61e1d Merge pull request #428 from percona/PMM-2605
PMM-2605 Removed go 1.9.x from .travis.yml
2019-11-11 11:06:40 -03:00
Carlos Salguero
3caa8c4a25 PMM-2605 Removed go 1.9.x from .travis.yml
Also updated Makefile to run all the tests
2019-11-11 10:46:57 -03:00
Carlos Salguero
2f36e5816a PT-1747 Improved FK rebuild constraints
If we cannot rebuild constraints due to metadata lock, now the tool
won't delete the new table nor the triggers so the old table and the new
table will have the same data and since the triggers are still in place,
new_table will keep getting the updates.
Also, the tool will show the commands that the user need to run manually
to complete the process
2019-11-08 10:33:51 -03:00
Carlos Salguero
2c1861f239 lkkk 2019-11-07 14:17:23 -03:00
Carlos Salguero
061e6bb5c1 Merge pull request #395 from percona/PT-1707
PT-1707 IPV6 support for recursion method processlist
2019-10-29 09:15:53 -03:00
Carlos Salguero
53213e0582 Merge branch '3.0' into PT-1707 2019-10-29 08:57:38 -03:00
Carlos Salguero
e656274493 PT-1707 Updated DSNParser in all apps 2019-10-29 08:53:26 -03:00
Carlos Salguero
81b5e5940c Merge pull request #423 from percona/IPv6_doc
Updated doc for IPv6 support
2019-10-16 09:34:04 -03:00
Carlos Salguero
9dd0b1eaab Updated doc for IPv6 support 2019-10-16 09:27:52 -03:00
Carlos Salguero
0c50d8f708 Merge pull request #420 from percona/PT-1760
PT-1760 regression on slave with replication channels
2019-10-15 19:02:36 -03:00
Carlos Salguero
2b3217a77a PT-1760 MasterSlave fix for rep channels 2019-10-15 18:45:43 -03:00
Carlos Salguero
1b2a4bdf4a Merge pull request #419 from wonko/wonko-add-only-same-schema-fks
Restrict the FK check if needed
2019-10-14 15:08:16 -03:00
Carlos Salguero
d45d393d8a Merge pull request #422 from percona/PT-1757_nibble_small_tables
PT-1757 Implemented fallback to nibble in NibbleIterator
2019-10-14 14:45:43 -03:00
Carlos Salguero
ed0b883eda Merge pull request #421 from vorsel/PT-1768_remove_binary_from_repo
PT-1768 remove pt-mongodb-query-digest binary from repo
2019-10-13 14:14:01 -03:00
Oleksandr Miroshnychenko
4f5f37e6d6 PT-1768 remove pt-mongodb-query-digest binary from repo 2019-10-07 16:40:21 +03:00
Carlos Salguero
605b97959c PT-1760 DSN parser overrides values if F= was specified 2019-10-01 11:20:18 -03:00
Carlos Salguero
522f8c5821 PT-1760 Updated DSNParser module 2019-10-01 08:26:42 -03:00
Bernard Grymonpon
99d3de8297 Restrict the FK check if needed
The find_child_tables is a heavy call if there are a lot of tables. This should honor the `only-same-schema-fks` option.
2019-09-25 12:10:22 +02:00
Carlos Salguero
4fc3d9fd1f WIP testing a patch 2019-09-19 08:25:00 -03:00
Carlos Salguero
636123bded WIP 2019-09-18 09:20:56 -03:00
Carlos Salguero
a97e24be71 PT-1707 IPV6 support for recursion method processlist 2019-04-11 17:44:17 -03:00
68 changed files with 2694 additions and 867 deletions

2
.env
View File

@@ -1,4 +1,4 @@
GOLANG_DOCKERHUB_TAG=1.10-stretch
GOLANG_DOCKERHUB_TAG=1.13.7-stretch
TEST_MONGODB_ADMIN_USERNAME=admin
TEST_MONGODB_ADMIN_PASSWORD=admin123456
TEST_MONGODB_USERNAME=test

1
.gitignore vendored
View File

@@ -20,6 +20,7 @@ src/go/pt-mongodb-summary/vendor/
vendor/
*.bak
src/go/*.bak
src/go/.env
config/deb/control.bak
config/rpm/percona-toolkit.spec.bak
config/sphinx-build/percona-theme/*

View File

@@ -1,9 +1,7 @@
language: go
go:
- 1.9.x
- 1.10.x
- 1.12.x
- 1.13.x
services:
- docker
@@ -46,6 +44,13 @@ env:
- MONGODB_IMAGE=percona/percona-server-mongodb:3.2
- MONGODB_IMAGE=percona/percona-server-mongodb:3.4
# skip non-trunk PMM-XXXX branch builds, but still build pull requests
branches:
except:
- /^PMM\-\d{4}/
go_import_path: github.com/percona/percona-toolkit
before_install:
- sudo apt-get update
- sudo apt-get install -o Dpkg::Options::="--force-confold" --force-yes -y docker-ce
@@ -64,7 +69,8 @@ before_script:
- dep ensure
script:
- go test -timeout 20m ./src/...
- docker ps
- go test -timeout 20m ./src/go/...
allow_failures:
- tip

View File

@@ -1,6 +1,7 @@
Changelog for Percona Toolkit
* Fixed bug PT-1759: pt-stalk not collecting processlist and variables
* Fixed bug PT-1793: Protocol parser cannot handle year 2020 (Thanks Kei Tsuchiya)
v3.1.0 release 2019-09-12
@@ -99,7 +100,7 @@ v3.0.6 released 2017-12-20
v3.0.5 released 2017-11-20
* Improvement PMM-1590: Improve MongoDB Profiler for PMM and PT
* Improvement PT-216: mongodb-query digest improved support for v<3.2 fixed incorrect output (Thanks MATSUU Takuto)
* Improvement PT-216: mongodb-query digest improved support for v<3.2 fixed incorrect output (Thanks MATSUU Takuto)
* Fixed bug PT-211: pt-mext fails on Rsa_public_key line
* Fixed bug PT-212: pt-mongodb-query-digest shows NaNs
* Fixed bug PT-202: pt-online-schema-change fails with virtual columns
@@ -141,7 +142,7 @@ v3.0.4 released 2017-08-02
v3.0.3 released 2017-05-19
* Fixed bug PT-133 : Sandbox won't start correctly if autocommit=0 in my.cnf
* Fixed bug PT-132 : pt-online-schema-change should imply --no-drop-new-table
* Fixed bug PT-132 : pt-online-schema-change should imply --no-drop-new-table
* Fixed bug PT-130 : Fixed pt-mext not working with not empty Rsa_public_key
* Fixed bug PT-128 : pt-stalk ps include memory usage outputs
* Fixed bug PT-126 : Recognize comments in ALTER
@@ -175,25 +176,25 @@ v3.0 released 2017-02-03
* Fixed bug 1402776: Improved fix (protocol parser fix): error when parsing tcpdump capture with pt-query-digest
* Fixed bug 1632522: pt-osc: Fails with duplicate key in table for self-referencing (Thanks Amiel Marqeta)
* Fixed bug 1654668: pt-summary exists with an error (Thanks Marcelo Altmann)
* New tool : pt-mongodb-summary
* New tool : pt-mongodb-summary
* New tool : pt-mongodb-query-digest
v2.2.20 released 2016-12-09
* Fixed bug 1362942: pt-slave-restart fails on MariaDB 10.0.13 (gtid_mode confusion)
* Fixed bug 1566556: pt-show-grants fails against MariaDB10+
* Fixed bug 1566556: pt-show-grants fails against MariaDB10+
* Feature 1604834: pt-query-digest numbers in table or column names converted to question marks (--preserve-embedded-numbers)
* Fixed bug 1613915: pt-online-schema-change misses data. Fixed sort order for ENUM fields
* Fixed bug 1613915: pt-online-schema-change misses data. Fixed sort order for ENUM fields
* Fixed bug 1625005: pt-online-schema-change doesn't apply underscores to foreign keys individually
* Fixed bug 1634900: pt-upgrade fails with SELECT INTO
* Fixed bug 1635734: pt-slave-restart --config does not recognize = as separator
* Fixed bug 1634900: pt-upgrade fails with SELECT INTO
* Fixed bug 1635734: pt-slave-restart --config does not recognize = as separator
* Feature 1636068: Added pause to NibbleIterator
* Feature 1638293: --data-dir parameter in order to create the table on a different partition
* Feature 1639052: with pt-table-checksum automatically exclude checking schemas named percona, percona_schema
* Feature 1639052: with pt-table-checksum automatically exclude checking schemas named percona, percona_schema
* Feature 1642364: pt-online-schema-change Added --remove-data-dir feature
* Feature 1643914: Fixed several typos in the doc (Thanks Dario Minnucci)
* Feature 1643940: Add Transparent huge pages info to pt-summary
* Feature 1643941: Add Memory management library to pt-mysql-summary
* Feature 1643941: Add Memory management library to pt-mysql-summary
v2.2.19 released 2016-08-15
@@ -299,19 +300,19 @@ v2.2.14 released 2015-04-14
v2.2.13 released 2015-01-26
* Feature 1391240: pt-kill added query fingerprint hash to output
* Fixed bug 1402668: pt-mysql-summary fails on cluster in Donor/Desynced status
* Fixed bug 1396870: pt-online-schema-change CTRL+C leaves terminal in inconsistent state
* Feature 1391240: pt-kill added query fingerprint hash to output
* Fixed bug 1402668: pt-mysql-summary fails on cluster in Donor/Desynced status
* Fixed bug 1396870: pt-online-schema-change CTRL+C leaves terminal in inconsistent state
* Fixed bug 1396868: pt-online-schema-change --ask-pass option error
* Fixed bug 1266869: pt-stalk fails to start if $HOME environment variable is not set
* Fixed bug 1266869: pt-stalk fails to start if $HOME environment variable is not set
* Fixed bug 1019479: pt-table-checksum does not work with sql_mode ONLY_FULL_GROUP_BY
* Fixed bug 1394934: pt-table-checksum error in debug mode
* Fixed bug 1321297: pt-table-checksum reports diffs on timestamp columns in 5.5 vs 5.6
* Fixed bug 1321297: pt-table-checksum reports diffs on timestamp columns in 5.5 vs 5.6
* Fixed bug 1399789: pt-table-checksum fails to find pxc nodes when wsrep_node_incoming_address is set to AUTO
* Fixed bug 1388870: pt-table-checksum has some errors with different time zones
* Fixed bug 1408375: vulnerable to MITM attack which would allow exfiltration of MySQL configuration information via --version-check
* Fixed bug 1404298: missing MySQL5.7 test files for pt-table-checksum
* Fixed bug 1403900: added sandbox and fixed sakila test db for 5.7
* Fixed bug 1404298: missing MySQL5.7 test files for pt-table-checksum
* Fixed bug 1403900: added sandbox and fixed sakila test db for 5.7
v2.2.12 released 2014-11-14
@@ -321,7 +322,7 @@ v2.2.12 released 2014-11-14
* Fixed bug 1217466: pt-table-checksum refuses to run on PXC if server_id is the same on all nodes
* Fixed bug 1373937: pt-table-checksum requires recursion when working with and XtraDB Cluster node
* Fixed bug 1377888: pt-query-digest manual for --type binlog is ambiguous
* Fixed bug 1349086: pt-stalk should also gather dmesg output
* Fixed bug 1349086: pt-stalk should also gather dmesg output
* Fixed bug 1361293: Some scripts fail when no-version-check option is put in global config file
v2.2.11 released 2014-09-26
@@ -336,20 +337,20 @@ v2.2.11 released 2014-09-26
v2.2.10 released 2014-08-06
* Fixed bug 1287253: pt-table-checksum deadlock
* Fixed bug 1287253: pt-table-checksum deadlock
* Fixed bug 1299387: 5.6 slow query log Thead_id becomes Id
* Fixed bug 1311654: pt-table-checksum + PXC inconsistent results upon --resume
* Fixed bug 1340728: pt-online-schema-change doesn't work with HASH indexes
* Fixed bug 1253872: pt-table-checksum max load 20% rounds down
* Fixed bug 1340364: some shell tools output error when queried for --version
* Fixed bug 1340364: some shell tools output error when queried for --version
v2.2.9 released 2014-07-08
* Fixed bug 1258135: pt-deadlock-logger introduces a noise to MySQL
* Fixed bug 1329422: pt-online-schema-change foreign-keys-method=none breaks constraints
* Fixed bug 1315130: pt-online-schema-change not properly detecting foreign keys
* Fixed bug 1329422: pt-online-schema-change foreign-keys-method=none breaks constraints
* Fixed bug 1315130: pt-online-schema-change not properly detecting foreign keys
* Fixed bug 1335960: pt-query-digest cannot parse binlogs from 5.6
* Fixed bug 1335322: pt-stalk fails when variable or threshold is non-integer
* Fixed bug 1335322: pt-stalk fails when variable or threshold is non-integer
v2.2.8 released 2014-06-04
@@ -633,7 +634,7 @@ v2.1.3 released 2012-08-03
* Fixed bug 954990: pt-stalk --nostalk does not work
* Fixed bug 977226: pt-summary doesn't detect LSI RAID control
* Fixed bug 1030031: pt-table-checksum reports wrong number of DIFFS
* Fixed bug 916168: pt-table-checksum privilege check fails on MySQL 5.5
* Fixed bug 916168: pt-table-checksum privilege check fails on MySQL 5.5
* Fixed bug 950294: pt-table-checksum should always create schema and tables with IF NOT EXISTS
* Fixed bug 953141: pt-table-checksum ignores its default and explicit --recursion-method
* Fixed bug 1030975: pt-table-sync crashes if sql_mode includes ANSI_QUOTES

18
Gopkg.lock generated
View File

@@ -95,6 +95,14 @@
pruneopts = ""
revision = "ff6b7dc882cf4cfba7ee0b9f7dcc1ac096c554aa"
[[projects]]
digest = "1:ad92aa49f34cbc3546063c7eb2cabb55ee2278b72842eda80e2a20a8a06a8d73"
name = "github.com/google/uuid"
packages = ["."]
pruneopts = ""
revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4"
version = "v1.1.1"
[[projects]]
branch = "master"
digest = "1:4fbfcfe715329e2f09ea644657aa791b81e73a0c835a4f79b9a0dfff0513e2b8"
@@ -187,14 +195,6 @@
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
version = "v0.8.1"
[[projects]]
digest = "1:7f569d906bdd20d906b606415b7d794f798f91a62fcfb6a4daa6d50690fb7a3f"
name = "github.com/satori/go.uuid"
packages = ["."]
pruneopts = ""
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
version = "v1.2.0"
[[projects]]
digest = "1:55dcddb2ba6ab25098ee6b96f176f39305f1fde7ea3d138e7e10bb64a5bf45be"
name = "github.com/shirou/gopsutil"
@@ -334,6 +334,7 @@
"github.com/alecthomas/kingpin",
"github.com/go-ini/ini",
"github.com/golang/mock/gomock",
"github.com/google/uuid",
"github.com/hashicorp/go-version",
"github.com/howeyc/gopass",
"github.com/kr/pretty",
@@ -343,7 +344,6 @@
"github.com/pborman/getopt",
"github.com/percona/go-mysql/query",
"github.com/pkg/errors",
"github.com/satori/go.uuid",
"github.com/shirou/gopsutil/process",
"github.com/sirupsen/logrus",
"go.mongodb.org/mongo-driver/bson",

View File

@@ -1,25 +1,3 @@
# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
[[constraint]]
name = "github.com/Masterminds/semver"
version = "1.4.0"
@@ -44,20 +22,6 @@
branch = "master"
name = "github.com/pborman/getopt"
[[constraint]]
name = "github.com/pkg/errors"
version = "0.8.0"
[[constraint]]
name = "github.com/satori/go.uuid"
version = "1.1.0"
[[constraint]]
name = "github.com/shirou/gopsutil"
version = "2.17.11"
[[constraint]]
name = "github.com/sirupsen/logrus"
[[constraint]]
name = "go.mongodb.org/mongo-driver"

View File

@@ -45,7 +45,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -2379,7 +2379,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2546,6 +2546,7 @@ sub get_dbh {
if ( $cxn_string =~ m/mysql/i ) {
my $sql;
if ( my ($charset) = $cxn_string =~ m/charset=([\w]+)/ ) {
$sql = qq{/*!40101 SET NAMES "$charset"*/};
PTDEBUG && _d($dbh, $sql);
@@ -2586,6 +2587,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -3197,7 +3220,7 @@ sub generate_cmp_where {
push @clause, "($val IS NULL OR $quo $type $val)";
}
elsif ( $type =~ m/>/ ) {
push @clause, "(($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
push @clause, "($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
}
else { # If $type =~ m/</ ) {
push @clauses, "(($val IS NOT NULL AND $quo IS NULL) OR ($quo $cmp $val))";
@@ -3211,7 +3234,7 @@ sub generate_cmp_where {
push @clause, ($type =~ m/=/ && $end ? "$quo $type $val" : "$quo $cmp $val");
}
push @clauses, '(' . join(' AND ', @clause) . ')';
push @clauses, '(' . join(' AND ', @clause) . ')' if @clause;
}
my $result = '(' . join(' OR ', @clauses) . ')';
my $where = {
@@ -3740,7 +3763,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -3748,13 +3777,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -3893,13 +3924,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -3912,6 +3950,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

View File

@@ -43,7 +43,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -1945,7 +1945,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2153,6 +2153,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -42,7 +42,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -2289,7 +2289,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2497,6 +2497,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -38,7 +38,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';

View File

@@ -39,7 +39,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -766,7 +766,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -974,6 +974,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -35,7 +35,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -177,7 +177,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -385,6 +385,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -37,7 +37,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -1441,7 +1441,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -1649,6 +1649,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -44,7 +44,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -312,7 +312,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -320,13 +326,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -465,13 +473,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -484,6 +499,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
@@ -2743,7 +2761,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2883,7 +2901,7 @@ sub get_dbh {
my $dbh;
my $tries = 2;
while ( !$dbh && $tries-- ) {
PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
join(', ', map { "$_=>$defaults->{$_}" } keys %$defaults ));
$dbh = eval { DBI->connect($cxn_string, $user, $pass, $defaults) };
@@ -2951,6 +2969,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -3059,7 +3099,7 @@ sub set_vars {
}
}
return;
return;
}
sub _d {

View File

@@ -45,7 +45,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -187,7 +187,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -395,6 +395,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -47,7 +47,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -1949,7 +1949,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2157,6 +2157,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -4018,7 +4040,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -4026,13 +4054,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -4171,13 +4201,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -4190,6 +4227,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

File diff suppressed because it is too large Load Diff

View File

@@ -64,7 +64,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -855,7 +855,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -1063,6 +1063,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -3640,6 +3662,7 @@ sub parse_event {
$pos_in_log -= 1 if $pos_in_log;
$raw_packet =~ s/\n20\Z//;
$raw_packet = "20$raw_packet" if $raw_packet =~ /\A20-\d\d-\d\d/; # workaround for year 2020 problem
$raw_packet = "20$raw_packet" unless $raw_packet =~ m/\A20/;
$raw_packet =~ s/0x0000:.+?(450.) /0x0000: $1 /;
@@ -10666,7 +10689,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -10674,13 +10703,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -10819,13 +10850,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -10838,6 +10876,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

View File

@@ -1221,7 +1221,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -1361,7 +1361,7 @@ sub get_dbh {
my $dbh;
my $tries = 2;
while ( !$dbh && $tries-- ) {
PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
join(', ', map { "$_=>$defaults->{$_}" } keys %$defaults ));
$dbh = eval { DBI->connect($cxn_string, $user, $pass, $defaults) };
@@ -1429,6 +1429,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -1537,7 +1559,7 @@ sub set_vars {
}
}
return;
return;
}
sub _d {

View File

@@ -40,7 +40,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -1942,7 +1942,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2150,6 +2150,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -1877,7 +1877,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2085,6 +2085,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -2426,7 +2448,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -2434,13 +2462,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -2579,13 +2609,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -2598,6 +2635,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

View File

@@ -41,7 +41,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -2288,7 +2288,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2496,6 +2496,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -2837,7 +2859,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -2845,13 +2873,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -2990,13 +3020,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -3009,6 +3046,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

File diff suppressed because it is too large Load Diff

View File

@@ -55,7 +55,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -2110,7 +2110,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2137,7 +2137,6 @@ sub parse {
}
}
$self->{dsn_props} = \%final_props;
return \%final_props;
}
@@ -2319,18 +2318,26 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
if ($self->{dsn_props}->{D} && $self->{dsn_props}->{t}) {
PTDEBUG && _d("DSN has a schema and table: $self->{dsn_props}->{D}.$self->{dsn_props}->{t}");
PTDEBUG && _d("Trying to set the default charset for the connection");
my (undef, $create_table) = eval { $dbh->selectrow_array("SHOW CREATE TABLE $self->{dsn_props}->{D}.$self->{dsn_props}->{t}") };
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($create_table && $create_table =~ m/DEFAULT CHARSET=(\S+)\s*/) {
PTDEBUG && _d("Detected table's character set: $1");
PTDEBUG && _d("Executing: SET NAMES '$1'");
$dbh->do("SET NAMES '$1'");
} else {
PTDEBUG && _d("Cannot get the default character set for the table");
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
@@ -6498,7 +6505,7 @@ sub generate_cmp_where {
push @clause, "($val IS NULL OR $quo $type $val)";
}
elsif ( $type =~ m/>/ ) {
push @clause, "(($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
push @clause, "($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
}
else { # If $type =~ m/</ ) {
push @clauses, "(($val IS NOT NULL AND $quo IS NULL) OR ($quo $cmp $val))";
@@ -6512,7 +6519,7 @@ sub generate_cmp_where {
push @clause, ($type =~ m/=/ && $end ? "$quo $type $val" : "$quo $cmp $val");
}
push @clauses, '(' . join(' AND ', @clause) . ')';
push @clauses, '(' . join(' AND ', @clause) . ')' if @clause;
}
my $result = '(' . join(' OR ', @clauses) . ')';
my $where = {
@@ -6839,7 +6846,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -6847,13 +6860,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -6992,13 +7007,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -7011,6 +7033,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

View File

@@ -129,7 +129,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -337,6 +337,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -61,7 +61,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -852,7 +852,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -1060,6 +1060,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,
@@ -7698,6 +7720,7 @@ sub parse_event {
$pos_in_log -= 1 if $pos_in_log;
$raw_packet =~ s/\n20\Z//;
$raw_packet = "20$raw_packet" if $raw_packet =~ /\A20-\d\d-\d\d/; # workaround for year 2020 problem
$raw_packet = "20$raw_packet" unless $raw_packet =~ m/\A20/;
$raw_packet =~ s/0x0000:.+?(450.) /0x0000: $1 /;

View File

@@ -44,7 +44,7 @@ BEGIN {
{
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';
@@ -1946,7 +1946,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2154,6 +2154,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -1894,7 +1894,7 @@ sub parse {
foreach my $key ( keys %$opts ) {
PTDEBUG && _d('Finding value for', $key);
$final_props{$key} = $given_props{$key};
if ( !defined $final_props{$key}
if ( !defined $final_props{$key}
&& defined $prev->{$key} && $opts->{$key}->{copy} )
{
$final_props{$key} = $prev->{$key};
@@ -2102,6 +2102,28 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,

View File

@@ -143,6 +143,34 @@ services:
- configsvr1
# - configsvr2
# - configsvr3
postgres9:
image: ${POSTGRE_IMAGE:-postgres:9.6}
container_name: go_postgres9_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_96_PORT:-6432}:5432
environment:
- POSTGRES_PASSWORD=root
postgres10:
image: ${POSTGRE_IMAGE:-postgres:10.7}
container_name: go_postgres10_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_10_PORT:-6433}:5432
environment:
- POSTGRES_PASSWORD=root
postgres11:
image: ${POSTGRE_IMAGE:-postgres:11}
container_name: go_postgres11_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_11_PORT:-6434}:5432
environment:
- POSTGRES_PASSWORD=root
postgres12:
image: ${POSTGRE_IMAGE:-postgres:12}
container_name: go_postgres12_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_12_PORT:-6435}:5432
environment:
- POSTGRES_PASSWORD=root
init:
network_mode: host
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
@@ -166,6 +194,10 @@ services:
- s3-mongo2
- s3-mongo3
- standalone
- postgres9
- postgres10
- postgres11
- postgres12
test:
build:
dockerfile: docker/test/Dockerfile

View File

@@ -489,6 +489,13 @@ Percona Toolkit officially supports and is tested on many popular Linux
distributions and MySQL 5.0 through 5.6; see http://goo.gl/srHm7 for the
list of supported platforms and versions.
=head1 IPv6 support
In order to support IPv6 addresses to connect to MySQL, Perl DBD::MySQL driver v4.033_01 is
required. Also, as stated in RFC 3986 L<https://www.ietf.org/rfc/rfc3986.txt> section 3.2.2
brackes must be used to distinguish host and port.
Examples: L<https://metacpan.org/pod/DBD::mysql#port>
=head1 BUGS
Please report bugs at L<https://jira.percona.com>.

View File

@@ -1,6 +1,29 @@
Percona Toolkit
***************
v3.2.0 released 2019-04-20
==========================
Improvements:
* :jirabug:`PT-1765`: Added documentation for ``DIFF_ROWS`` in ``pt-table-checksum``.
* :jirabug:`PT-1757`: ``pt-table-checksum``: Improved handling of Small Tables.
* :jirabug:`PT-1707`: Added support for IPv6 addresses.
Bug fixes:
* :jirabug:`PT-1824`: Added 64-character constraint name limit. (Thank you Iwo Panowicz).
* :jirabug:`PT-1793`: Protocol parser now handles the year 2020. (Thank you Kei Tsuchiya).
* :jirabug:`PT-1782`: ``pt-online-schema-change``: No longer FK warning if no foreign keys.
* :jirabug:`PT-1773`: ``pt-online-schema-change``: FK check restricted if needed.
* :jirabug:`PT-1766`: ``pt-table-checksum``: ``DIFF_ROWS`` now computed correctly.
* :jirabug:`PT-1760`: ``pt-online-schema-change`` no longer stalls for stopped replica when slave is active.
* :jirabug:`PT-1759`: ``pt-stalk`` now collecting ``processlist`` and variables.
* :jirabug:`PT-1576`: ``pt-stalk mysql-only`` now working as expected.
* :jirabug:`PT-1502`: ``pt-online-schema-change`` now working with multi-source replication.
* :jirabug:`PT-297` : ``pt-online-schema-change`` doesn't break replication.
v3.0.13 released 2019-01-03
===========================

View File

@@ -230,7 +230,7 @@ sub name {
sub description {
my ($self) = @_;
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h}, $self->{dsn}->{P} || 'socket');
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h} || 'localhost' , $self->{dsn}->{P} || 'socket');
}
# This returns the server_id.

View File

@@ -263,7 +263,13 @@ sub find_slave_hosts {
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @connected_slaves = $self->get_connected_slaves($dbh);
my @slaves = $self->_process_slaves_list($dsn_parser, $dsn, \@connected_slaves);
return @slaves;
}
sub _process_slaves_list {
my ($self, $dsn_parser, $dsn, $connected_slaves) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
@@ -271,13 +277,15 @@ sub _find_slaves_by_processlist {
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
$host ||= $_->{host};
my ( $host ) = $_->{host} =~ m/^(.*):\d+$/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
if ($host =~ m/::/) {
$host = '['.$host.']';
}
$host;
} $self->get_connected_slaves($dbh);
} @$connected_slaves;
return @slaves;
}
@@ -449,13 +457,20 @@ sub get_slave_status {
if (!$self->{channel}) {
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
}
my $slave_use_channels;
for my $row (@$sss_rows) {
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
if ($row->{channel_name}) {
$slave_use_channels = 1;
}
if ($row->{channel_name} eq $self->{channel}) {
$ss = $row;
last;
}
}
if (!$ss && $slave_use_channels) {
die 'This server is using replication channels but "channel" was not specified on the command line';
}
} else {
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
die 'This server is using replication channels but "channel" was not specified on the command line';
@@ -468,6 +483,9 @@ sub get_slave_status {
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
return $ss;
}
if (!$ss && $self->{channel}) {
die "Specified channel name is invalid";
}
}
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');

View File

@@ -18,7 +18,7 @@
# ###########################################################################
package Percona::Toolkit;
our $VERSION = '3.1.0';
our $VERSION = '3.0.14-dev';
use strict;
use warnings FATAL => 'all';

View File

@@ -197,7 +197,7 @@ sub generate_cmp_where {
push @clause, "($val IS NULL OR $quo $type $val)";
}
elsif ( $type =~ m/>/ ) {
push @clause, "(($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
push @clause, "($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val)";
}
else { # If $type =~ m/</ ) {
push @clauses, "(($val IS NOT NULL AND $quo IS NULL) OR ($quo $cmp $val))";
@@ -212,7 +212,7 @@ sub generate_cmp_where {
}
# Add the clause to the larger WHERE clause.
push @clauses, '(' . join(' AND ', @clause) . ')';
push @clauses, '(' . join(' AND ', @clause) . ')' if @clause;
}
my $result = '(' . join(' OR ', @clauses) . ')';
my $where = {

View File

@@ -88,6 +88,7 @@ sub parse_event {
# Remove the separator from the packet, and restore it to the front if
# necessary.
$raw_packet =~ s/\n20\Z//;
$raw_packet = "20$raw_packet" if $raw_packet =~ /\A20-\d\d-\d\d/; # workaround for year 2020 problem
$raw_packet = "20$raw_packet" unless $raw_packet =~ m/\A20/;
# Remove special headers (e.g. vlan) before the IPv4 header.

15
run-tests.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
BRANCH=$(git rev-parse --abbrev-ref HEAD)
MYSQL_VERSION=$(mysql -ss -e "SHOW VARIABLES LIKE 'version'" | cut -f2)
LOG_FILE=~/${BRANCH}-${MYSQL_VERSION}.log
truncate --size=0 ${LOG_FILE}
echo "Logging to $LOG_FILE"
for dir in t/*
do
echo "$dir"
sandbox/test-env restart
prove -vw --trap --timer "$dir" | tee -a $LOG_FILE
done

13
runtests.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
MYSQL_VERSION=$(mysql -ss -e "SELECT VERSION()")
LOGFILE=${HOME}/pt-tests-$(git rev-parse --abbrev-ref HEAD)-mysql-${MYSQL_VERSION}.log
echo "" > ${LOGFILE}
export PERCONA_TOOLKIT_SANDBOX=${HOME}/mysql/my-5.7
for d in $(ls -d t/*)
do
sandbox/test-env restart
prove -vw $d | tee -a ${LOGFILE}
done

Binary file not shown.

View File

@@ -0,0 +1,29 @@
[client]
user = msandbox
password = msandbox
port = PORT
socket = /tmp/PORT/mysql_sandboxPORT.sock
[mysqld]
port = PORT
socket = /tmp/PORT/mysql_sandboxPORT.sock
pid-file = /tmp/PORT/data/mysql_sandboxPORT.pid
basedir = PERCONA_TOOLKIT_SANDBOX
datadir = /tmp/PORT/data
key_buffer_size = 16M
innodb_buffer_pool_size = 16M
innodb_data_home_dir = /tmp/PORT/data
innodb_log_group_home_dir = /tmp/PORT/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_file_size = 64M
log-bin = mysql-bin
relay_log = mysql-relay-bin
log_slave_updates
server-id = PORT
report-host = 127.0.0.1
report-port = PORT
log-error = /tmp/PORT/data/mysqld.log
innodb_lock_wait_timeout = 3
general_log
general_log_file = genlog
performance_schema = ON

View File

@@ -0,0 +1,627 @@
USE `mysql`;
-- MySQL dump 10.16 Distrib 10.1.21-MariaDB, for Linux (x86_64)
--
-- Host: localhost Database: localhost
-- ------------------------------------------------------
-- Server version 10.1.21-MariaDB
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `column_stats`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `column_stats` (
`db_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`column_name` varchar(64) COLLATE utf8_bin NOT NULL,
`min_value` varbinary(255) DEFAULT NULL,
`max_value` varbinary(255) DEFAULT NULL,
`nulls_ratio` decimal(12,4) DEFAULT NULL,
`avg_length` decimal(12,4) DEFAULT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
`hist_size` tinyint(3) unsigned DEFAULT NULL,
`hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8_bin DEFAULT NULL,
`histogram` varbinary(255) DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Statistics on Columns';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `columns_priv`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `columns_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `db`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `db` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
PRIMARY KEY (`Host`,`Db`,`User`),
KEY `User` (`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `event`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `event` (
`db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`name` char(64) NOT NULL DEFAULT '',
`body` longblob NOT NULL,
`definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`execute_at` datetime DEFAULT NULL,
`interval_value` int(11) DEFAULT NULL,
`interval_field` enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_executed` datetime DEFAULT NULL,
`starts` datetime DEFAULT NULL,
`ends` datetime DEFAULT NULL,
`status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
`on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
`comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`originator` int(10) unsigned NOT NULL,
`time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
`character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`body_utf8` longblob,
PRIMARY KEY (`db`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `func`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `func` (
`name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`ret` tinyint(1) NOT NULL DEFAULT '0',
`dl` char(128) COLLATE utf8_bin NOT NULL DEFAULT '',
`type` enum('function','aggregate') CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User defined functions';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `gtid_slave_pos`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `gtid_slave_pos` (
`domain_id` int(10) unsigned NOT NULL,
`sub_id` bigint(20) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`seq_no` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`domain_id`,`sub_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Replication slave GTID position';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `help_category`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `help_category` (
`help_category_id` smallint(5) unsigned NOT NULL,
`name` char(64) NOT NULL,
`parent_category_id` smallint(5) unsigned DEFAULT NULL,
`url` text NOT NULL,
PRIMARY KEY (`help_category_id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help categories';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `help_keyword`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `help_keyword` (
`help_keyword_id` int(10) unsigned NOT NULL,
`name` char(64) NOT NULL,
PRIMARY KEY (`help_keyword_id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help keywords';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `help_relation`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `help_relation` (
`help_topic_id` int(10) unsigned NOT NULL,
`help_keyword_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`help_keyword_id`,`help_topic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='keyword-topic relation';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `help_topic`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `help_topic` (
`help_topic_id` int(10) unsigned NOT NULL,
`name` char(64) NOT NULL,
`help_category_id` smallint(5) unsigned NOT NULL,
`description` text NOT NULL,
`example` text NOT NULL,
`url` text NOT NULL,
PRIMARY KEY (`help_topic_id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='help topics';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `host`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `host` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
PRIMARY KEY (`Host`,`Db`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Host privileges; Merged with database privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `index_stats`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `index_stats` (
`db_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`index_name` varchar(64) COLLATE utf8_bin NOT NULL,
`prefix_arity` int(11) unsigned NOT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`index_name`,`prefix_arity`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Statistics on Indexes';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `innodb_index_stats`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `innodb_index_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`index_name` varchar(64) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
`stat_value` bigint(20) unsigned NOT NULL,
`sample_size` bigint(20) unsigned DEFAULT NULL,
`stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `innodb_table_stats`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `innodb_table_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`n_rows` bigint(20) unsigned NOT NULL,
`clustered_index_size` bigint(20) unsigned NOT NULL,
`sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `plugin`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `plugin` (
`name` varchar(64) NOT NULL DEFAULT '',
`dl` varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL plugins';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `proc`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `proc` (
`db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`name` char(64) NOT NULL DEFAULT '',
`type` enum('FUNCTION','PROCEDURE') NOT NULL,
`specific_name` char(64) NOT NULL DEFAULT '',
`language` enum('SQL') NOT NULL DEFAULT 'SQL',
`sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL',
`is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO',
`security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER',
`param_list` blob NOT NULL,
`returns` longblob NOT NULL,
`body` longblob NOT NULL,
`definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
`comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`body_utf8` longblob,
PRIMARY KEY (`db`,`name`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `procs_priv`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `procs_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Routine_name` char(64) CHARACTER SET utf8 NOT NULL DEFAULT '',
`Routine_type` enum('FUNCTION','PROCEDURE') COLLATE utf8_bin NOT NULL,
`Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '',
`Proc_priv` set('Execute','Alter Routine','Grant') CHARACTER SET utf8 NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`Host`,`Db`,`User`,`Routine_name`,`Routine_type`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Procedure privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `proxies_priv`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `proxies_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Proxied_host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Proxied_user` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`With_grant` tinyint(1) NOT NULL DEFAULT '0',
`Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`Host`,`User`,`Proxied_host`,`Proxied_user`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User proxy privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `roles_mapping`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `roles_mapping` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Role` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Admin_option` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
UNIQUE KEY `Host` (`Host`,`User`,`Role`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Granted roles';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `servers`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `servers` (
`Server_name` char(64) NOT NULL DEFAULT '',
`Host` char(64) NOT NULL DEFAULT '',
`Db` char(64) NOT NULL DEFAULT '',
`Username` char(80) NOT NULL DEFAULT '',
`Password` char(64) NOT NULL DEFAULT '',
`Port` int(4) NOT NULL DEFAULT '0',
`Socket` char(64) NOT NULL DEFAULT '',
`Wrapper` char(64) NOT NULL DEFAULT '',
`Owner` char(64) NOT NULL DEFAULT '',
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `table_stats`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `table_stats` (
`db_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`cardinality` bigint(21) unsigned DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Statistics on Tables';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `tables_priv`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `tables_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `time_zone`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `time_zone` (
`Time_zone_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Use_leap_seconds` enum('Y','N') NOT NULL DEFAULT 'N',
PRIMARY KEY (`Time_zone_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zones';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `time_zone_leap_second`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `time_zone_leap_second` (
`Transition_time` bigint(20) NOT NULL,
`Correction` int(11) NOT NULL,
PRIMARY KEY (`Transition_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Leap seconds information for time zones';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `time_zone_name`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `time_zone_name` (
`Name` char(64) NOT NULL,
`Time_zone_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`Name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone names';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `time_zone_transition`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `time_zone_transition` (
`Time_zone_id` int(10) unsigned NOT NULL,
`Transition_time` bigint(20) NOT NULL,
`Transition_type_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`Time_zone_id`,`Transition_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transitions';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `time_zone_transition_type`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `time_zone_transition_type` (
`Time_zone_id` int(10) unsigned NOT NULL,
`Transition_type_id` int(10) unsigned NOT NULL,
`Offset` int(11) NOT NULL DEFAULT '0',
`Is_DST` tinyint(3) unsigned NOT NULL DEFAULT '0',
`Abbreviation` char(8) NOT NULL DEFAULT '',
PRIMARY KEY (`Time_zone_id`,`Transition_type_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zone transition types';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `user`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int(11) unsigned NOT NULL DEFAULT '0',
`max_updates` int(11) unsigned NOT NULL DEFAULT '0',
`max_connections` int(11) unsigned NOT NULL DEFAULT '0',
`max_user_connections` int(11) NOT NULL DEFAULT '0',
`plugin` char(64) CHARACTER SET latin1 NOT NULL DEFAULT '',
`authentication_string` text COLLATE utf8_bin NOT NULL,
`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`is_role` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`default_role` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
`max_statement_time` decimal(12,6) NOT NULL DEFAULT '0.000000',
PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `general_log`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `slow_log`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`rows_affected` int(11) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-03-10 19:49:04

View File

@@ -8,8 +8,8 @@ SET @@GLOBAL.GTID_MODE = ON;
CHANGE MASTER TO master_host='127.0.0.1', master_port=12345, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan1';
CHANGE MASTER TO master_host='127.0.0.1', master_port=12346, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan2';
-- CHANGE MASTER TO master_host='127.0.0.1', master_port=12346, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan2';
START SLAVE for channel 'masterchan1';
START SLAVE for channel 'masterchan2';
-- START SLAVE for channel 'masterchan2';

View File

@@ -1,26 +0,0 @@
GOCACHE=
GOLANG_DOCKERHUB_TAG=1.10-stretch
TEST_MONGODB_ADMIN_USERNAME=admin
TEST_MONGODB_ADMIN_PASSWORD=admin123456
TEST_MONGODB_USERNAME=test
TEST_MONGODB_PASSWORD=123456
TEST_MONGODB_S1_RS=rs1
TEST_MONGODB_STANDALONE_PORT=27017
TEST_MONGODB_S1_PRIMARY_PORT=17001
TEST_MONGODB_S1_SECONDARY1_PORT=17002
TEST_MONGODB_S1_SECONDARY2_PORT=17003
TEST_MONGODB_S2_RS=rs2
TEST_MONGODB_S2_PRIMARY_PORT=17004
TEST_MONGODB_S2_SECONDARY1_PORT=17005
TEST_MONGODB_S2_SECONDARY2_PORT=17006
TEST_MONGODB_S3_RS=rs3
TEST_MONGODB_S3_PRIMARY_PORT=17021
TEST_MONGODB_S3_SECONDARY1_PORT=17022
TEST_MONGODB_S3_SECONDARY2_PORT=17023
TEST_MONGODB_CONFIGSVR_RS=csReplSet
TEST_MONGODB_CONFIGSVR1_PORT=17007
TEST_MONGODB_CONFIGSVR2_PORT=17008
TEST_MONGODB_CONFIGSVR3_PORT=17009
TEST_MONGODB_MONGOS_PORT=17000
TEST_PSMDB_VERSION=3.6
TEST_MONGODB_FLAVOR=percona/percona-server-mongodb

View File

@@ -1,10 +1,16 @@
help: ## Display this help message.
@echo "Please use \`make <target>\` where <target> is one of:"
@grep '^[a-zA-Z]' $(MAKEFILE_LIST) | \
awk -F ':.*?## ' 'NF==2 {printf " %-26s%s\n", $$1, $$2}'
GO := go
pkgs = $(shell find . -type d -name "pt-*" -exec basename {} \;)
pkgs = $(shell find . -type d -name "pt-*" -exec basename {} \;)
VERSION=$(shell git describe --abbrev=0 --tags)
BUILD=$(shell date +%FT%T%z)
GOVERSION=$(shell go version | cut --delimiter=" " -f3)
COMMIT=$(shell git rev-list -1 HEAD)
GOUTILSDIR ?= $(GOPATH)/bin
FILES = $(shell find . -type f -name '*.go' -not -path "./vendor/*")
PREFIX=$(shell pwd)
TOP_DIR=$(shell git rev-parse --show-toplevel)
@@ -91,7 +97,7 @@ endef
env:
@echo $(TEST_ENV) | tr ' ' '\n' >.env
test-cluster: env
env-up: env ## Start MongoDB docker containers cluster
TEST_PSMDB_VERSION=$(TEST_PSMDB_VERSION) \
docker-compose up \
--detach \
@@ -101,40 +107,41 @@ test-cluster: env
init
docker/test/init-cluster-wait.sh
test-cluster-clean: env
env-down: env ## Clean-up MongoDB docker containers cluster
docker-compose down -v
rm .env
linux-amd64:
linux-amd64: ## Build Mongo tools for linux-amd64
@echo "Building linux/amd64 binaries in ${BIN_DIR}"
@cd ${TOP_DIR} && dep ensure
@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
@$(foreach pkg,$(pkgs),GOOS=linux GOARCH=amd64 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
linux-386:
linux-386: ## Build Mongo tools for linux-386
@echo "Building linux/386 binaries in ${BIN_DIR}"
@cd ${TOP_DIR} && dep ensure
@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
@$(foreach pkg,$(pkgs),GOOS=linux GOARCH=386 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
darwin-amd64:
darwin-amd64: ## Build Mongo tools for darwin-amd64 (MacOS)
@echo "Building darwin/amd64 binaries in ${BIN_DIR}"
@cd ${TOP_DIR} && dep ensure
@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
@$(foreach pkg,$(pkgs),GOOS=darwin GOARCH=amd64 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
style:
style: ## Check code style
@echo ">> checking code style"
@! gofmt -d $(shell find . -path ./vendor -prune -o -name '*.go' -print) | grep '^'
test:
test: ## Run tests
@echo ">> running tests"
@./runtests.sh
format:
@echo ">> formatting code"
@$(GO) fmt $(pkgs)
format: ## Format source code.
gofmt -w -s $(FILES)
goimports -local github.com/percona/pmm-managed -l -w $(FILES)
vet:
vet: ## Run vet on Go code
@echo ">> vetting code"
@$(GO) vet $(pkgs)
@$(foreach pkg,$(pkgs), cd $(TOP_DIR)/src/go/$(pkg); go vet ./... ;)

View File

@@ -143,6 +143,34 @@ services:
- configsvr1
# - configsvr2
# - configsvr3
postgres9:
image: ${MYSQL_IMAGE:-postgres:9.6}
container_name: go_postgres9_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_96_PORT:-6432}:5432
environment:
- POSTGRES_PASSWORD=root
postgres10:
image: ${POSTGRE_IMAGE:-postgres:10.7}
container_name: go_postgres10_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_10_PORT:-6433}:5432
environment:
- POSTGRES_PASSWORD=root
postgres11:
image: ${POSTGRE_IMAGE:-postgres:11}
container_name: go_postgres11_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_11_PORT:-6434}:5432
environment:
- POSTGRES_PASSWORD=root
postgres12:
image: ${POSTGRE_IMAGE:-postgres:12}
container_name: go_postgres12_1
ports:
- ${POSTGRE_HOST:-127.0.0.1}:${POSTGRE_12_PORT:-6435}:5432
environment:
- POSTGRES_PASSWORD=root
init:
network_mode: host
image: ${TEST_MONGODB_FLAVOR}:${TEST_PSMDB_VERSION}
@@ -166,6 +194,10 @@ services:
- s3-mongo2
- s3-mongo3
- standalone
- postgres9
- postgres10
- postgres11
- postgres12
test:
build:
dockerfile: docker/test/Dockerfile

View File

@@ -1,52 +1,88 @@
-----BEGIN CERTIFICATE-----
MIIESjCCAjKgAwIBAgIRAKG/1k+fiFpnx/pdBHp0Hc8wDQYJKoZIhvcNAQELBQAw
ETEPMA0GA1UEAxMGcm9vdENBMB4XDTE4MDkwNjExMDQzNloXDTIwMDMwNjExMDQz
M1owFDESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAl+Qnlg3dSlyYi34yF2D35g9PhU6o5gm3qN22pEdDTOrTEihnF6lq
XqieDAaTTYehilqSsBjdZN8uTeJQ5Dsr/g8n43y8KCQFIcpNJLldV+pNEZydCK3R
sPr4+GgWGdpmA5Za8VlRgilYNVzSmABz9LZoa33YIjMSQ0BftAFnFl6N0ikDwPuN
L1A40EaE121QeEQgUTbcWcrJ1vJkJgcSGK6blVOy1dmHL4ABoD+n1+abDsoKM1Yz
XOgci8rbNUTS6P/2j4VW+MZRnM6rFCbo7wW11IUYSyShhTJoWFMdtc7zmQdTVBlo
RhKU0Ok1QDVr6vO+3PKriUcWY0cLFRcsGwIDAQABo4GZMIGWMA4GA1UdDwEB/wQE
AwIDuDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFAaP
Vu/GKnWUUjNznMkpU7t1V8V3MB8GA1UdIwQYMBaAFNVjkwWn6aryJsRlIsOr4gFM
ISnFMCUGA1UdEQQeMByCCWxvY2FsaG9zdIIJMTI3LjAuMC4xhwR/AAABMA0GCSqG
SIb3DQEBCwUAA4ICAQCYl8SMZJlaBOyUM0VAOZDks+OICJn8PUdu5XqvFA5ATnXE
MRGP1h34R/6Vkl/jwB/+2+9zEgT1z4hZ55blyOmZFB/j/jPrlqEIkUMHK1CVC6jI
f8ubNp4MNHVoV2Cw6wLw8E/GMZIcZ4t0G9Z7kFjHh0qS5PN00zbBCj927Q2FoBc2
oybS4KVgFeD9fklYCMoETp+WWaM7dec0OBdKWyCEP3JmMHITKTipro5yf6RZDvAB
TvoGcZIsIdKnoAknMYwG4ibcyI0z6XIF6/Hy/E6XdbsnmCHGIBHbRMMvqNXz3XJa
1s/vA4MHkUF9N14MRVI8cepFMsYBZkztNylYw159b9qiHzbeUm3BrSaJzQjefqkD
cMFLJ0jcZDg8N+pyMi3vvr41HfONw8iyqis3ZAjftZ56fwoj6ap4QZI8P+M7R//X
A4r11+ldDRsJRnLi6kCJK/ta2pKGuUvFeVqDDc/wNfBUMkmUeyZ9AcNoxFNDMmZT
sEhj6mTHcKlo+BcVdYMO4FrrgXkuRS0gY82qZucHRGQh3G1QPs4di7pVCopXuWjQ
8foI+SSRFqfcdPS5ljVyLV1g+RVBJnGYQiCM/JAPokRZpimZherxsmdnAW1A/XR1
/LXHw/5upwkouzsjFTEM8g1WDwtfp3HGFnHUxVHSe2lXI/2o+DZBU/ILEpxrgQ==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGhjCCBG6gAwIBAgIUA8DTDskAzhfsbrJkErEqsxyeRLcwDQYJKoZIhvcNAQEL
BQAwgZwxCzAJBgNVBAYTAkFSMSEwHwYDVQQIDBhUZXN0Q2VydGlmaWNhdGVTdGF0
ZU5hbWUxJDAiBgNVBAcMG1Rlc3RDZXJ0aWZpY2F0ZUxvY2FsaXR5TmFtZTEfMB0G
A1UECgwWVGVzdENlcnRpZmljYXRlT3JnTmFtZTEjMCEGA1UECwwaVGVzdENlcnRp
ZmljYXRlT3JnVW5pdE5hbWUwHhcNMjAwMzI0MjEzNzQ2WhcNMjEwMzI0MjEzNzQ2
WjCBpDELMAkGA1UEBhMCQVIxIzAhBgNVBAgMGlRlc3RDbGllbnRDZXJ0aWZpY2F0
ZVN0YXRlMSYwJAYDVQQHDB1UZXN0Q2xpZW50Q2VydGlmaWNhdGVMb2NhbGl0eTEh
MB8GA1UECgwYVGVzdENsaWVudENlcnRpZmljYXRlT3JnMSUwIwYDVQQLDBxUZXN0
Q2xpZW50Q2VydGlmaWNhdGVPcmdVbml0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAqRso1A6DaTW05bFRbThZAy6seMwjcGZYk0JUFHenYPoCf0qZwi3y
JThS2KoYJBK1TzagbqWLc4R2JGBL7sr7KDq4jFGVRcxIW1AZ4z7fhH3Khk8iPoaA
JX4Q8iwVJ/3sPiUJ02d6w26c6QIfChh5iTArAHX1oXX7nhDeV74KnlMv3HssOFnX
3ZZhikdvsGXCpH9vt23AnCcNiCOPZUtxl1i8bhoehw3PwwiLAxn/VDLG4hOWlSIa
UAqrmNrGHurGSQHM7zk3RCumapg+R4R6+aTzJPNQtY5MXWr3p9w3oOtNeKvsz+kc
gxoU7sm/jPQSitmqQF3gm6iP//TNlGVvAy4HziQ7+C/WiqPpUOD1wtG4Cts0FWvv
VynP4BF/4VthpgB8cdmdkCBgPX9PA06RhHGlQXEXluxRBHfPsVy/cC3tMFy2YoK6
Rl4rLjAAKOWIkO8Z2Q2lVu5JkRNiWzLbRpJMN+yvTMBn2CEtaWWGyBgqKVRhpfA0
kbAb78+LhNnsbaNMhp87Ve5c8sUMzr00vgV73RGTNex3GG9WXeufgaxlxmF3yQYH
p7Mraj++RZUwi3nWCiEz3SQUHdvt3jMs9GGabRUY18oxWqnCB7CCnrJtaC0iyXIc
i2VxV7wIBuUDEcllCkWDO5GKPs4HuUhhF5CQhHEHoYG33B5NKJQ2/NsCAwEAAaOB
tTCBsjAdBgNVHQ4EFgQU3NfuC45IyCKP7cc5JrKsBAypKPIwCQYDVR0TBAIwADAO
BgNVHQ8BAf8EBAMCBaAwVwYJYIZIAYb4QgENBEoWSE9wZW5TU0wgR2VuZXJhdGVk
IENlcnRpZmljYXRlIGZvciBURVNUSU5HIG9ubHkuICBOT1QgRk9SIFBST0RVQ1RJ
T04gVVNFLjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcN
AQELBQADggIBADN25Ne2BW16E7HJHblInBdeivN4RjYsckRL56V5Vs2b8G6cjPLZ
4qz0uFBMpwO+y8cCccGWUD8uSsNvyjFq2umyaqFEVQmGyo1sDBV6WQtY82xCEVcI
C+alZymANtLanf6T5EhTC9GttaHSxisGP/kHm2AKUzCi49fe/la9EqJRLgPsjsiw
YSmTZKyF+v+VaruCiIJj4rPYHDSk15STxuAS63fhCNW4kCw02vdMhHVz2GIMDwWF
Ulaao6yAO4t+1hAEQDZvH/ve8Kwj6y199Hna0zyhGSmCYkEmT0LfgTwcGhYinCUe
eUqqHcyPyGRSvc06dKvFBP89vD7gDzQbKgn7LGfEvseDml0WBpG0QbqhflQgWDb+
qi9d7Zw2yonhfb79zad9YF8VhDRQ25zXID22n+PLxwFCjNrCQFlGLclQYXmoZhlR
EOPs3HMAGp5mFaHDPMQygMd80M6e5RjjUh4d2AhBqDmsSB1vwaH6c1Qi+MSt1CfQ
duCZBU1/bA26J6U+zxsPNzVf1xR2lfk/kThK5VWTVmUSX6niIALEh6BNTff81uko
ruBw369tfdPNVcv6BE7LayK0RtNMGArONlww1NJ8D/rWTdI+GrfYQUlcZHBkvqCY
NIcueRuYCfTZK0fes3sl71Cg9ZMHNgRmIRxsCa65xxni2L2Bgq/hyK0S
-----END CERTIFICATE-----

View File

@@ -0,0 +1,89 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgIUT1Tut/IJvQu47l3mJ1+pBEXKK04wDQYJKoZIhvcNAQEL
BQAwgZAxITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRlTmFtZTEkMCIGA1UE
BwwbVGVzdENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYDVQQKDBZUZXN0Q2Vy
dGlmaWNhdGVPcmdOYW1lMSQwIgYDVQQLDBtUZXN0Q2VydGlmaWNhdGVPcmdVbml0
TmFtZTIwHhcNMjAwMzI0MjAxMTI4WhcNMjEwMzI0MjAxMTI4WjCBpDELMAkGA1UE
BhMCQVIxIzAhBgNVBAgMGlRlc3RTZXJ2ZXJDZXJ0aWZpY2F0ZVN0YXRlMSYwJAYD
VQQHDB1UZXN0U2VydmVyQ2VydGlmaWNhdGVMb2NhbGl0eTEhMB8GA1UECgwYVGVz
dFNlcnZlckNlcnRpZmljYXRlT3JnMSUwIwYDVQQLDBxUZXN0U2VydmVyQ2VydGlm
aWNhdGVPcmdVbml0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnEhd
lUJr348iYseh18NTZFyfWvZy83jmkMBtRdr2O3KxbaVG0g2QwAEnnW9t+W3lwjUg
hTPdG6i6duRsHrqJAbt4augmSH/u2smhH2367nVhbK+eg1wfFzsJZ9NHfrcLS4NT
RwLFLRt7P0QYwYZIYuSYWBLfX7B1539UBz1R61T2uV6jcW1U5lZDTDaEhLkUg1Dk
CdAGzmM04U53YPejsk6OLCVGwkLpG0rUHVzAcuM8Hx+1jJ/zZJuWU4kfeNcyHpbH
hN4K0WoDVECadRNhc9nT4OyqChE6UCFQ0WYBD3XHwbAo1eaox38tgLC5/SncCAgI
h5jarmUBBsqePkksm3cxjmQ5oBwB3HU7JTSLlRQqbMAQYHQyt6Up4Xbp0IPKHKoH
93K7LZCTEdI87jjWRrscEPOydYI3atBrGpLrcpC6uVa6ZwIVYHyilrY6oP1BbPsU
rL96z384HLtj3tAOxHMK6rxSbr+8TpXgsv4EYNGqjjZ977yh9Qy3zXn06KOjGs9C
dkHODdbH01LRC9qCZLbbm33STG5Sfedlp0v3cRxZzRrKIvm2V3Oct21VmFpuUqL1
pai5RuQZxbR8GEtPnb+V+M6JtprtLgpHsCx9z96tVvqUytWvkjfQ/Tk7wK215KqM
jbl81mlq23bxlkaE/W7lQJFxRM5y9ls4HvD9DDsCAwEAAaOB2DCB1TAdBgNVHQ4E
FgQUvqV8Vw4CxcPgrcvQc4XxmmvZ1SswCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMC
BaAwVwYJYIZIAYb4QgENBEoWSE9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl
IGZvciBURVNUSU5HIG9ubHkuICBOT1QgRk9SIFBST0RVQ1RJT04gVVNFLjAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwIQYDVR0RBBowGIIHMS4xLjEuMYIH
OC44LjguOIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAgEAOWK0fdKV6dnzPKhuLtfi
03BrewclMAHfg4nbosyvWPyd41JIqVFxka8xyF7unVPmS1GvZXONgRUgBkTiBW4n
x8BorrSP3u9+rxBNt58Y8DCH83YAlGSmU8TsmPGXmJH1AxGZWeo78aDEmssigbBN
qxe5J+FXC2HsVaw3MZnw88gsmN4z+k8x9hImGCsppgLMEzJppESrN39l1sHT5XAP
Fm2w7OB+E956ljIqZXSXj67sgUuQEM1sLQXOiDR7AYFBln2plCwygIosWlSz7O1A
3jRxuhQ/vI/+ScWQKQ6fcNu/7gPU/pxDSbtLTyn2Emg7WFEC9HCwJB3fMiCa/+0x
oxPZpwzMdztY5Bi654MLOfxxNpF02HNaym/iLZv7aJcxt3rFtPqsZfDqL0v89GCD
006pQUT6Sxvvz/n+sQ3lMXcNeq2SvAg+vRQOiRJ2wf/pSMXwbNlOgVxL5NcDJnpF
hfurBro++RyqlIkc0ouokWIKa0SUANzXGU0FkUA4223rQRvgrKs9utYJw2NuG6kM
QnNwceC+myoIwW7JBjCzPatZgIdY08BUaTHVefI2ntKP5fvDXLJFnSO/8TYkWK4a
nv2Unn4nbUuuAN3Y2TEVJAtHL4io8w2xB4W5Vy/i1iEHWnME5qXIHNgRzl57k+EO
EgxUDXWZVQZJg0alm4o0TJY=
-----END CERTIFICATE-----

View File

@@ -1,52 +1,89 @@
-----BEGIN CERTIFICATE-----
MIIESjCCAjKgAwIBAgIRAKG/1k+fiFpnx/pdBHp0Hc8wDQYJKoZIhvcNAQELBQAw
ETEPMA0GA1UEAxMGcm9vdENBMB4XDTE4MDkwNjExMDQzNloXDTIwMDMwNjExMDQz
M1owFDESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAl+Qnlg3dSlyYi34yF2D35g9PhU6o5gm3qN22pEdDTOrTEihnF6lq
XqieDAaTTYehilqSsBjdZN8uTeJQ5Dsr/g8n43y8KCQFIcpNJLldV+pNEZydCK3R
sPr4+GgWGdpmA5Za8VlRgilYNVzSmABz9LZoa33YIjMSQ0BftAFnFl6N0ikDwPuN
L1A40EaE121QeEQgUTbcWcrJ1vJkJgcSGK6blVOy1dmHL4ABoD+n1+abDsoKM1Yz
XOgci8rbNUTS6P/2j4VW+MZRnM6rFCbo7wW11IUYSyShhTJoWFMdtc7zmQdTVBlo
RhKU0Ok1QDVr6vO+3PKriUcWY0cLFRcsGwIDAQABo4GZMIGWMA4GA1UdDwEB/wQE
AwIDuDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFAaP
Vu/GKnWUUjNznMkpU7t1V8V3MB8GA1UdIwQYMBaAFNVjkwWn6aryJsRlIsOr4gFM
ISnFMCUGA1UdEQQeMByCCWxvY2FsaG9zdIIJMTI3LjAuMC4xhwR/AAABMA0GCSqG
SIb3DQEBCwUAA4ICAQCYl8SMZJlaBOyUM0VAOZDks+OICJn8PUdu5XqvFA5ATnXE
MRGP1h34R/6Vkl/jwB/+2+9zEgT1z4hZ55blyOmZFB/j/jPrlqEIkUMHK1CVC6jI
f8ubNp4MNHVoV2Cw6wLw8E/GMZIcZ4t0G9Z7kFjHh0qS5PN00zbBCj927Q2FoBc2
oybS4KVgFeD9fklYCMoETp+WWaM7dec0OBdKWyCEP3JmMHITKTipro5yf6RZDvAB
TvoGcZIsIdKnoAknMYwG4ibcyI0z6XIF6/Hy/E6XdbsnmCHGIBHbRMMvqNXz3XJa
1s/vA4MHkUF9N14MRVI8cepFMsYBZkztNylYw159b9qiHzbeUm3BrSaJzQjefqkD
cMFLJ0jcZDg8N+pyMi3vvr41HfONw8iyqis3ZAjftZ56fwoj6ap4QZI8P+M7R//X
A4r11+ldDRsJRnLi6kCJK/ta2pKGuUvFeVqDDc/wNfBUMkmUeyZ9AcNoxFNDMmZT
sEhj6mTHcKlo+BcVdYMO4FrrgXkuRS0gY82qZucHRGQh3G1QPs4di7pVCopXuWjQ
8foI+SSRFqfcdPS5ljVyLV1g+RVBJnGYQiCM/JAPokRZpimZherxsmdnAW1A/XR1
/LXHw/5upwkouzsjFTEM8g1WDwtfp3HGFnHUxVHSe2lXI/2o+DZBU/ILEpxrgQ==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGojCCBIqgAwIBAgIUA8DTDskAzhfsbrJkErEqsxyeRLYwDQYJKoZIhvcNAQEL
BQAwgZwxCzAJBgNVBAYTAkFSMSEwHwYDVQQIDBhUZXN0Q2VydGlmaWNhdGVTdGF0
ZU5hbWUxJDAiBgNVBAcMG1Rlc3RDZXJ0aWZpY2F0ZUxvY2FsaXR5TmFtZTEfMB0G
A1UECgwWVGVzdENlcnRpZmljYXRlT3JnTmFtZTEjMCEGA1UECwwaVGVzdENlcnRp
ZmljYXRlT3JnVW5pdE5hbWUwHhcNMjAwMzI0MjEzNzQzWhcNMjEwMzI0MjEzNzQz
WjCBpDELMAkGA1UEBhMCQVIxIzAhBgNVBAgMGlRlc3RTZXJ2ZXJDZXJ0aWZpY2F0
ZVN0YXRlMSYwJAYDVQQHDB1UZXN0U2VydmVyQ2VydGlmaWNhdGVMb2NhbGl0eTEh
MB8GA1UECgwYVGVzdFNlcnZlckNlcnRpZmljYXRlT3JnMSUwIwYDVQQLDBxUZXN0
U2VydmVyQ2VydGlmaWNhdGVPcmdVbml0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAw6UzR/6YmJVu6FT9W3ZuzIYIHSNzkYHHbxNe3xj5GprZ9Bs4FiRd
nt7jFfX1SVQQc94BDxD97PZYm9EFmqS0K8wGB+54FQxAFyXg0Ydt9fKNHayUhJ+0
Gh/agu5xF/1k6dtXg7lm3BOGxf75bH275JRtbSsVhP71RmmHWBy4vNWDB5SfTDN/
oMR4OhOGGyh0dS6KjvKu0iMXs5rDgM0xXtbMgt9yrp7nxT0R+3B4oUUi1NRSEVlo
8x7NYwLuq32VK+rT0IyvzHa4eWjDpIqSft4Nw56pJRQXCmpFLGarduKr9lrKmUVS
c9OmG1jJ/p0hxu/3DPpH/FMRye6dXeeot0JLOxfhJJ1uyNdV9FyvKu+QUOXCMEp2
pWk6mc1rEqlrBczJHqx/iX4fPI7AnS8K/cmuOKTHURnCdTsF5QcOLe+z0xAr3Ys5
3O8IsgH2AO80UOnOF5H7TboiEEoDvDtH3FnYRCgpWCMDF/EyA5Ef++bMEXmLI+XU
mqQTdxkczJkPvDNgV4GH/Dxns1jSMjid8/ySQHUlcBQRxH7AGDeNyY6mLy09HJnS
di2l81eN0bgvK/Vxrse0Ragj75+1/Unq8pJ6HeOsgFS8y3THBVWzKQpR/3U62E/N
miaJaYSoykXrKCiuCzM076gilIjGfv45618r1jIjGxGay6piRBjkPKsCAwEAAaOB
0TCBzjAdBgNVHQ4EFgQUo2vyNFhqZb17FC/2s9zgs2y3+7IwCQYDVR0TBAIwADAO
BgNVHQ8BAf8EBAMCBaAwVwYJYIZIAYb4QgENBEoWSE9wZW5TU0wgR2VuZXJhdGVk
IENlcnRpZmljYXRlIGZvciBURVNUSU5HIG9ubHkuICBOT1QgRk9SIFBST0RVQ1RJ
T04gVVNFLjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGgYDVR0RBBMw
EYIJMTI3LjAuMC4xhwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQC4h+15PorQxATg
9G3BywtJwvmKF+j/S3dc25jIUO6LyXjaXanSf5FYKr+X4fdjflhMNp6TFBDHwVX2
T+ihZmhq7xKrP0RQAVIkMwAFNElFmiDuelJNzhxZBzu4ZIaOIk5J/oAWh8sqjX4Y
YYeXEOkM14+YeGbGD/YI+1YMhkA/CuEZl5LxinOHTXnx5chLgueDems01FgwidoX
NlK1XjLHzb0jBjhwzNU8CwR8d55PJq2lLs6W0Gc9KGbWKxQNMrqgVIVT/AkWGGK0
g1WHI5ehOEvyHXSTYgXUkynW4xn/yLq50IkxYMLwPg7U7O/U2StdlG88nPINHbKu
VfYFQ0F3M4CRFWaV0UNxK9hV6x+qu96jCmp+ftpC9zM7bathen9fnOM6Arg+U2Or
jDD5hRboMqdT1bw3k19WUnnbR3uFNDJFgNvTMOTt563UdaNxMSALJOpPDO21JK83
BxnfFEe1SMoTpsus9VEzZ3Fyjkug4CN7PzFt+x/NWRqyoEOuUXWtxzdQLj3f9MS1
RvMCbnvJcBr4NzDmFBmt8MehgbS4V1SKO7V2YCEnDu1YjSn6FxQqU7t8dl6K2Srz
HXbrRm/mcps1/QcKXgpOX1sajcvd0BsrqzGJtvrb8EnBbLk5lNYFcU3bnFAdHtbN
hdf6gGd96V3VkW7ZbxUoi3TBOmN7Tg==
-----END CERTIFICATE-----

View File

@@ -1,29 +1,78 @@
-----BEGIN CERTIFICATE-----
MIIE4jCCAsqgAwIBAgIBATANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZyb290
Q0EwHhcNMTgwOTA2MTEwNDM0WhcNMjAwMzA2MTEwNDM0WjARMQ8wDQYDVQQDEwZy
b290Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDqVvFpIft91o1x
ALjDQ+zoCke2daQ5tntwbDwosbiGB58Jz5p/KVwGHQvYIt5yKSzc7KN7OkTFF8Xt
QGbVY2ZHOONHHZHOtuiBPz05fE/HDPxic2MO9jN4GGTphgFDBBfaEaF0G/19Rffk
1wtB8PoOY3MU0mSTxT1q2Ka2yY2VRbvoPxo7qbhCfXuAu1cA8RmbYCWQzGsqxPC6
s7cen9C5IOhHB/osQcI7ZoSL2fkiDch8SLFBPj7W5nofjH+P4Xncm2c65tHSy4pI
hbYW44NDR9o2RS1OdD2GhS9MHBppzQGAnXM3yxsbKDyzjcxZpIjwMlxaGz97y404
8ROET8Hu7CoOK9kPA20rmhpX/3ET7kiHs2f4/BlD7xNVL74tr1Plva/C8DcCWDC8
sf1PW4RJsuwadbkMAST4MY87HknIiN4NGKE6mSlfukaKKkW1HdCY7ynpCyv3Uru3
FiD5XrphSvonZbSfcnKjYQVKEudJWyMbdoO5JX6cDIb7QP3jsKADzedwrtWBWx2Z
CxWOJPeVan/I6OfV45q3LZFAsNjK2gquOe/3WmJKpO+EspivY+Fv/32IAACmjoY/
90Szf6YUKEE1Etpj9PT2gqmFleOx51A7jg3z4wUl3KI8CTcdVlDogct+4CHiQfJU
4ajXTqd3O0qGbulQPrZuhPZWBSbVqQIDAQABo0UwQzAOBgNVHQ8BAf8EBAMCAQYw
EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU1WOTBafpqvImxGUiw6viAUwh
KcUwDQYJKoZIhvcNAQELBQADggIBAMEw6cOWi7s/6A5cMObSbbfS91yXx4tjFda/
5lJ+7gxO935pQas2ZppxVpGUZezXH5rYl8bR/xGTZ1SLDqp0mjphVp4G6VQFtonK
E9nNRuVK9jDJ41IXjWEtdgeig5Sf6hRUbwTDTBulhSviQQzo7hQUpSknMC1UNAgy
op3q1dluBaG8BWi9aZu0WL5VdxdQdTCAXSrYqmeGZlc0IgiNiebRmkQwNImnvfzb
WmrCK8rThNdXml7G/BD+m9na1OwUVoee1oohbHmxH1YsNwe1rSEBL7oAHzNi695H
QrriZWu7t7QdO5ZITGZpzmVU1nrwSB/VgPH0tBAUeZSifctNII9NuW9FS1h3Gys1
JV2cwQYVCLK9+M/VhRdSv6u+UCHE1TtZwHmSKYjcdN52pUEnWZNtlwPyrJ7cbSEj
Wrq+iZBBO9qcPg20ldYLkjv1QlOGLnVbl2K9ePTTYbUaGo0DLGlA6E2lVjoD8FvS
DQYS6qQGHCgVgOPhca8FOCxKEfMvXSzKOF9eGn0rnzsUcJbiYxNArjDDKSRSyMhD
2TfBupFV+tYM8OXBDArgk464IZnjsrT4DeQQ+WOtEm3kHo/NVhZ/6A1uV/JyQhkF
D6FSNoKvWz3LIC5v42+hvj6teAk4wC9tFk4Q76c2PQxiwY1Ur8ySVUYiIv8bETCt
nQT44DuY
MIIG3TCCBMWgAwIBAgIUImm7nNshohrxdxIyIFBh+W6FtVMwDQYJKoZIhvcNAQEL
BQAwgZwxCzAJBgNVBAYTAkFSMSEwHwYDVQQIDBhUZXN0Q2VydGlmaWNhdGVTdGF0
ZU5hbWUxJDAiBgNVBAcMG1Rlc3RDZXJ0aWZpY2F0ZUxvY2FsaXR5TmFtZTEfMB0G
A1UECgwWVGVzdENlcnRpZmljYXRlT3JnTmFtZTEjMCEGA1UECwwaVGVzdENlcnRp
ZmljYXRlT3JnVW5pdE5hbWUwHhcNMjAwMzI0MjEzNzM3WhcNMjUwMzI0MjEzNzM3
WjCBnDELMAkGA1UEBhMCQVIxITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRl
TmFtZTEkMCIGA1UEBwwbVGVzdENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYD
VQQKDBZUZXN0Q2VydGlmaWNhdGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlm
aWNhdGVPcmdVbml0TmFtZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
ANAiZD1FH60/gVJ/rmGph2Q+N9T0lcGeQcrPLeLYXK0SaKL+FOGUZUHldVu9v+WU
Gu4Lc1kI94MDtQRFWkOwpcLj3ATUg1GibV+vOuntxLOvpVOZSmyy4BvC3vuV6rXl
paYOVpXegZssWUdlWQGPZomb9trr/dQNTMPCkppI1QW7xHNdUtsRvR7lP5PEk4TX
G9amKIOhcZdkclylNek8qV2EuXA0FGcdxSAjJvqx13vnFCrCTTlzzQzBxyjbTv3M
1T0rbJEXGgC7l5JZq8AoTSOR7EapsdRlF08W4Fw30Ap+q24KEfdZSZmqbHmvqFTq
NPJNV57p+dPVCQ13IEvBMW3Bb2Gxt1M3ldVYkaWYnPUdisnoWQJga4EYEV3hwHC1
hfa3Fafq7cVcl3ZBkIjs3u9f785cSGwT3xnQKpCdMmpQW86maeaEfgSykP5fIJcG
dJ2Dv2pYOCIiHiwks/GWdaQukJ13VnIaISwF0FCcE8FhkguQLjRsmLxCpoY+3fn7
PwYcBaplzW+sHx7Yi7yTefi7CSKYfuA/IHbHJkKo6V23pbHbYwgvCKLRK4Vi4DEm
8d5ultHnbSHNgi+8x+aVnfepTzxEAVySX3jbatk/XN2AE4LA0wILlE+K64MfnS1r
grZJ8vAU+Vm2RwfaRq87l6Vme2/BoZvrJoOlIljv8lPXAgMBAAGjggETMIIBDzAd
BgNVHQ4EFgQUkJPzgPfIa6aVR4e0ZaPrNIGtf3wwDwYDVR0TAQH/BAUwAwEB/zCB
3AYDVR0jBIHUMIHRgBSQk/OA98hrppVHh7Rlo+s0ga1/fKGBoqSBnzCBnDELMAkG
A1UEBhMCQVIxITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRlTmFtZTEkMCIG
A1UEBwwbVGVzdENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYDVQQKDBZUZXN0
Q2VydGlmaWNhdGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlmaWNhdGVPcmdV
bml0TmFtZYIUImm7nNshohrxdxIyIFBh+W6FtVMwDQYJKoZIhvcNAQELBQADggIB
AM53we9IF6skJ/zqgBS6mmztYabkoNLU8Sm5p9a5atQkMEv0cFbuzDpnUkQALAIg
wdUj5lFg7QjyAbHzE++b0GrqFjGeAHYlE9ngcvwrlFu9r8d0IQrtrUuDaOM7YQ+y
xguQfN/5J61yYTEZh49pmf9m8FGjx8hvck+LYVSkBW5st6rgJqSzukrVHZhzfSY8
u7yUYZIU0FMqnIArWh/YZENKBWkJu2Q0TwQKmk04Uyh3rZhIAIIkGEwsPbA4CQiB
cIx0upFxfkOtJRcjMy7EXmHGZiQXuP7IXxDRWgdi+rIRGgEYJ9rgL7Br4AEpyAL7
AyV7mXzUhe2pfAMfFXTKau7tO9z/bb2dBQT8OyKI4CCZBJ0eyOtpk8AjOeWq1HPt
dPgi82lNUyKH9WGpVlF5+XK0hf2XZ8xbN+nc/svqmxP3yyJMrvnMkc+lkVx0r2Qp
Fak01dNkGGEdQp4JeAzy8+Fh5CmAwVjrC+YWTNj1RqnaBAcjsVo3xeQN92r5E87J
QcBzHu2wPGBy9XFip01uw2QVCZCYWVGRdOOnDCs1tNZyzVGHhtdchgZtSxQvDVJZ
sYZPzix7YIfAirDPP1U6Bb1hqEbi+Zkt/uX8jVBc4atktc2cfNm7vddh5KzFzqCC
PFrKy5yS0opQhkp7lNcoMYM0l06O2doBlOLSFSZe2TAh
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGyjCCBLKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBnDELMAkGA1UEBhMCQVIx
ITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRlTmFtZTEkMCIGA1UEBwwbVGVz
dENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYDVQQKDBZUZXN0Q2VydGlmaWNh
dGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlmaWNhdGVPcmdVbml0TmFtZTAe
Fw0yMDAzMjQyMTM3NDBaFw0yMjAzMjQyMTM3NDBaMIGcMQswCQYDVQQGEwJBUjEh
MB8GA1UECAwYVGVzdENlcnRpZmljYXRlU3RhdGVOYW1lMSQwIgYDVQQHDBtUZXN0
Q2VydGlmaWNhdGVMb2NhbGl0eU5hbWUxHzAdBgNVBAoMFlRlc3RDZXJ0aWZpY2F0
ZU9yZ05hbWUxIzAhBgNVBAsMGlRlc3RDZXJ0aWZpY2F0ZU9yZ1VuaXROYW1lMIIC
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzDJEp73jSblTKaD/zCdAIS+M
t6HbQiUi3E/Vnwsiu8VNX+Ym4M3FIU8ImzU5fdD7Uvdgkar1mAFXLab4OK3rT/bL
w6v2lU1SILPMFZMS/YVaaH+v9janXbxYkS4bee7cX6sK+MLg8SHjB8f/eLP7azrF
Q3CyCY+Ul0QX1bdyWKEA4cnnPl1dSGvEzTKpJu70C0SHgv0mYz/Cu+QXTWzToXM6
vzSKSS5uthL2DldgNojB5FIlfZP5axRC0XOE74KS+oohC8kvGn7+eFl321HSDibF
39LfCSnxzxIawnPTjICajA+x1Gw8YU82SGGJgrSRkLQ8HTf+MpWxZdAxSRPCmxxA
eIGatrfNoVbbtjG6Xrton2e1Gc9PDVLP8bb+GlVnwIsz/fUg+7+uYFitL4DQUtYQ
nuqy3YuHTW9mmvEiBIdskTB7bawfrWnk17vNOdHfnwmA1UT5Va5Du1wsslPGPjHV
fJNQ9b6/GE2YE6ZGMMUBnA84vqhnZfcMpvZP1vBsmfncA+uXUV0yJ+eREc2/xOQU
DQQ0s0gCT/DnYreLjUYv6MEhPKrY/9oNCW6Ay0bQoYdpalSdXCVfB/LvGHyXkUN3
3/Zwa0KtNx3wHwS+YRao9rexFnU+WHDKOjjzaKITd3WVjk9rH9k3oY7qGrrywjQI
7X3ggKDidUJPNJ7QAPECAwEAAaOCARMwggEPMB0GA1UdDgQWBBQC0b2Fa6ck3osL
3tJGbxGe9c1xiTAPBgNVHRMBAf8EBTADAQH/MIHcBgNVHSMEgdQwgdGAFJCT84D3
yGumlUeHtGWj6zSBrX98oYGipIGfMIGcMQswCQYDVQQGEwJBUjEhMB8GA1UECAwY
VGVzdENlcnRpZmljYXRlU3RhdGVOYW1lMSQwIgYDVQQHDBtUZXN0Q2VydGlmaWNh
dGVMb2NhbGl0eU5hbWUxHzAdBgNVBAoMFlRlc3RDZXJ0aWZpY2F0ZU9yZ05hbWUx
IzAhBgNVBAsMGlRlc3RDZXJ0aWZpY2F0ZU9yZ1VuaXROYW1lghQiabuc2yGiGvF3
EjIgUGH5boW1UzANBgkqhkiG9w0BAQsFAAOCAgEAhvoDyji+OeYUI4ZKPvUtBg5k
A7coX9U7B/22BEAngYqSTfa0My53LfROA8DnoUgbyWENe4qRFx5/yYnTnwZ5YqtA
5Qtkd6pJRG1YqCC57k0tSAu/xpAXqDGof4w/mejGSt+VkYcQ3f34+L4dS9EDeZ5I
H76mHD51+PxZKSzMS1RK8TuYZ+2Sp1AcZVrpjSxL1QE3E6vodDm7tMwZQHAWVAcJ
F2qqJFLke6TE3+w1aG/nDswJ5L0D1L9cUkgisXHiavsIpndB+zxjyRauVWHcQcd5
o4kBl/NzA78Gx+eJK7kW2NxdkEAJRWbj9+cYpQ6HzlmshcuoQG47wruTQIE2E2hG
B1uhfyHK0d5kC12iX74VZK2slbTc0Q5JKE1DfleTLXyY9/m1M+qBIpL7T5Pc6NeJ
GQSyAReFs92dNeQ/3p55e1UktkVi2GxAu2/rsZRkRSVFN6XWe+APz7seoF7Eut1H
0s39RMx0DEqjpNReGBdxXjpdmaasJeNXW8GJjnGLpqVKmus4a2PtcxqZuiVsHHZV
FMr2Gp/XPa8JJFoZ7oAzlzIV1G32KFNJPQnoz4M8LnWMQg+BLverP3MC4FxpBhVg
Y9X9KWaA/OYfCrgXFF+phLAZDjutV4Xdorrn9Qtk/d2bw97eT6nv0Y5qAcQm5/Rg
RltLHRYT8rBHu26V3jQ=
-----END CERTIFICATE-----

View File

@@ -10,7 +10,7 @@ import (
"strings"
"time"
uuid "github.com/satori/go.uuid"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
)
@@ -52,11 +52,11 @@ func CheckUpdates(toolName, version string) (string, error) {
}
func checkUpdates(url string, timeout time.Duration, toolName, version string) (string, error) {
client := &http.Client{
Timeout: timeout,
}
payload := fmt.Sprintf("%x;%s;%s", uuid.NewV2(uuid.DomainOrg).String(), PERCONA_TOOLKIT, version)
vuuid := uuid.New()
payload := fmt.Sprintf("%x;%s;%s", vuuid.String(), PERCONA_TOOLKIT, version)
req, err := http.NewRequest("POST", url, strings.NewReader(payload))
if err != nil {
return "", err

View File

@@ -18,7 +18,7 @@ func TestCheckUpdates(t *testing.T) {
m := strings.Split(string(body), ";")
advices := []Advice{
Advice{
{
Hash: m[0],
ToolName: m[1],
Advice: "There is a new version",

View File

@@ -23,10 +23,10 @@ const (
ipv6PG11Port = "6432"
ipv6PG12Port = "6432"
pg9Container = "pt-pg-summary_postgres9_1"
pg10Container = "pt-pg-summary_postgres10_1"
pg11Container = "pt-pg-summary_postgres11_1"
pg12Container = "pt-pg-summary_postgres12_1"
pg9Container = "go_postgres9_1"
pg10Container = "go_postgres10_1"
pg11Container = "go_postgres11_1"
pg12Container = "go_postgres12_1"
)
var (

View File

@@ -4,7 +4,9 @@ export BASEDIR=$(git rev-parse --show-toplevel)
export CHECK_SESSIONS=0
cd $BASEDIR
for dir in $(ls -d pt-*)
source ${BASEDIR}/src/go/setenv.sh
for dir in $(ls -d ./src/go/pt-*)
do
echo "Running tests at $BASEDIR/$dir"
cd $BASEDIR/$dir

View File

@@ -84,6 +84,21 @@ is_deeply(
'Basic DSN'
);
is_deeply(
$dp->parse('u=a,p=b,F=/something.cnf'),
{
F => '/something.cnf',
P => undef,
u => "a",
p => "b",
h => undef,
A => undef,
S => undef,
D => undef,
},
'Read from config overrides other params'
);
is_deeply(
$dp->parse('S=/tmp/sock'),
{ u => undef,
@@ -257,7 +272,7 @@ SKIP: {
is($d->{h}, '127.0.0.1', 'Left hostname alone');
my $want = $sandbox_version lt '8.0' ? [ qw(utf8 utf8 utf8) ]: [ qw(utf8mb4 utf8mb4 utf8mb4) ];
warn Data::Dumper::Dumper($want);
is_deeply(
$dbh->selectrow_arrayref('select @@character_set_client, @@character_set_connection, @@character_set_results'),
$want,
@@ -632,6 +647,20 @@ SKIP: {
$dbh->disconnect();
}
is_deeply(
$dp->parse('h=f000::1,P=12345,u=msandbox,p=msandbox'),
{ u => 'msandbox',
p => 'msandbox',
S => undef,
h => 'f000::1',
P => '12345',
F => undef,
D => undef,
A => undef,
},
'IPV6 support'
);
# #############################################################################
# Done.
# #############################################################################

View File

@@ -335,7 +335,6 @@ $res = $ms->wait_for_master(
slave_dbh => $slaves[0],
timeout => 10,
);
warn "res->{result}: $res->{result}";
ok($res->{result} >= 0, 'Wait was successful');
@@ -868,6 +867,33 @@ SKIP: {
$sb->stop_sandbox(qw(chan_master1 chan_master2 chan_slave1));
}
my $connected_slaves = [
{
command => 'Binlog Dump',
db => undef,
host => '2001:db8:1::242:ac11:3:53902',
id => 7,
info => undef,
rows_examined => 0,
rows_sent => 0,
state => 'Master has sent all binlog to slave; waiting for more updates',
time => 80,
user => 'root'
},
];
my @g = $ms->_process_slaves_list ($dp, $dsn, $connected_slaves);
is (
scalar @g,
1,
"1 slave (IPv6) detected",
);
is (
$g[0]->{h},
"[2001:db8:1::242:ac11:3]",
"Brackets were added to IPv6 detected slave host",
);
# #############################################################################
# Done.
# #############################################################################

View File

@@ -28,7 +28,7 @@ elsif ( !$slave_dbh ) {
} elsif ($sandbox_version lt '5.7') {
plan skip_all => 'Only on MySQL 5.7+';
} else {
plan tests => 5;
plan tests => 4;
}
my ($master1_dbh, $master1_dsn) = $sb->start_sandbox(
@@ -76,17 +76,10 @@ $output = output(
sub { $exit_status = pt_archiver::main(@args) },
stderr => 1,
);
isnt(
is(
$exit_status,
0,
'Must specify a channel name',
);
like (
$output,
qr/"channel" was not specified/,
'Message saying channel name must be specified'
'No need of channel name since there is only one master',
);
push @args, ('--channel', 'masterchan1');

View File

@@ -57,7 +57,8 @@ system('/tmp/12345/use -e "insert into issue_758.t select sleep(3)"');
# Slave seems to be lagging now so the first row should get purged
# immediately, then the script should wait about 2 seconds until
# slave lag is gone.
system("$cmd --source F=$cnf,D=issue_758,t=t --purge --where 'i>0' --check-slave-lag h=127.1,P=12346,u=msandbox,p=msandbox >/dev/null 2>&1 &");
#system("$cmd --source F=$cnf,D=issue_758,t=t --purge --where 'i>0' --check-slave-lag h=127.1,P=12346,u=msandbox,p=msandbox >/dev/null 2>&1 &");
system("$cmd --source F=$cnf,D=issue_758,t=t --purge --where 'i>0' --check-slave-lag h=127.1,P=12346,u=msandbox,p=msandbox &");
sleep 1;
is_deeply(

View File

@@ -51,7 +51,6 @@ ok(
);
SKIP: {
skip "Skipping in MySQL 8.0.4-rc since there is an error in the server itself. See https://bugs.mysql.com/bug.php?id=89441", 9 if ($sandbox_version ge '8.0');
($output, $exit_status) = full_output(
sub { pt_online_schema_change::main(@args,
"$master_dsn,D=issue26211,t=process_model_inst",

View File

@@ -28,7 +28,8 @@ if ( !$master_dbh ) {
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
# so we need to specify --set-vars innodb_lock_wait_timeout-3 else the
# tool will die.
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
$master_dbh->do('SET @@collation_server="latin1_swedish_ci"');
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox,charset=utf8';
my @args = (qw(--set-vars innodb_lock_wait_timeout=3 --alter-foreign-keys-method rebuild_constraints));
my $output;
my $exit_status;
@@ -47,6 +48,7 @@ $sb->load_file('master', "$sample/long_fk_constraints.sql");
sub { pt_online_schema_change::main(@args,
"$master_dsn,D=bug1215587,t=Table1",
"--alter", "ENGINE=InnoDB",
"--charset", "utf8",
qw(--execute)) },
);
@@ -66,10 +68,10 @@ my @sorted_constraints = sort { @$a[0].@$a[1] cmp @$b[0].@$b[1] } @$constraints;
is_deeply(
\@sorted_constraints,
[
[ 'Table1', '__fkey1a' ],
[ 'Table1', '__fkey_SALES_RECURRING_PROFILE_CUSTOMER_CUSTOMER_ENTITY_ENTITY_I' ],
[ 'Table2', '__fkey2b' ],
[ 'Table2', '_fkey2a' ],
[ 'Table1', '_fkey1a' ],
[ 'Table1', '_fkey_SALES_RECURRING_PROFILE_CUSTOMER_CUSTOMER_ENTITY_ENTITY_ID' ],
[ 'Table2', '_fkey2b' ],
[ 'Table2', 'fkey2a' ],
],
"First run adds or removes underscore from constraint names, accordingly"
);

View File

@@ -23,10 +23,6 @@ my $master_dbh = $sb->get_dbh_for('master');
my $vp = VersionParser->new($master_dbh);
if ($vp->cmp('8.0.14') > -1 && $vp->flavor() !~ m/maria/i) {
plan skip_all => 'Cannot run this test under the current MySQL version';
}
if ( !$master_dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}

View File

@@ -58,8 +58,8 @@ is_deeply(
$constraints,
[
['person', '_fk_testId'],
['test_table', '_fk_person'],
['test_table', '__fk_refId'],
['test_table', 'fk_person'],
['test_table', 'fk_refId'],
],
"First run adds or removes underscore from constraint names, accordingly"
);
@@ -79,9 +79,9 @@ $constraints = $master_dbh->selectall_arrayref("SELECT TABLE_NAME, CONSTRAINT_NA
is_deeply(
$constraints,
[
['person', '__fk_testId'],
['test_table', '_fk_refId'],
['test_table', '__fk_person'],
['person', '_fk_testId'],
['test_table', 'fk_person'],
['test_table', 'fk_refId'],
],
"Second run self-referencing will be one due to rebuild_constraints"
);
@@ -100,7 +100,7 @@ $constraints = $master_dbh->selectall_arrayref("SELECT TABLE_NAME, CONSTRAINT_NA
is_deeply(
$constraints,
[
['person', 'fk_testId'],
['person', '_fk_testId'],
['test_table', 'fk_person'],
['test_table', 'fk_refId'],
],

View File

@@ -0,0 +1,69 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use PerconaTest;
use Sandbox;
use SqlModes;
use threads;
use Time::HiRes qw( usleep );
use constant PTDEBUG => $ENV{PTDEBUG} || 0;
require "$trunk/bin/pt-table-checksum";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master');
my $slave1_dbh = $sb->get_dbh_for('slave1');
if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 2;
}
my $num_rows = 1000;
my $table = 't1';
$dbh->do("DROP DATABASE IF EXISTS test");
$dbh->do("CREATE DATABASE IF NOT EXISTS test");
$dbh->do("CREATE TABLE `test`.`$table` (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(5)) Engine=InnoDB");
diag(`util/mysql_random_data_load --host=127.0.0.1 --port=12345 --user=msandbox --password=msandbox test $table $num_rows`);
$slave1_dbh->do("DELETE FROM `test`.`$table` WHERE 1=1");
diag("Starting checksum");
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the tool will die.
# And --max-load "" prevents waiting for status variables.
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
my @args = ($master_dsn, qw(--no-check-binlog-format --chunk-size 10));
my $output;
$output = output(
sub { pt_table_checksum::main(@args) },
stderr => 1,
);
like(
$output,
qr/100\s+1000\s+10\s+102\s+0\s+\d+\.\d+\s+test.t1/,
"Truncating tables while checksum is running"
);
# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($dbh);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
exit;

View File

@@ -6,9 +6,9 @@ Starting checksum ...
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', convert(`c` using utf8mb4), CONCAT(ISNULL(`c`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `osc`.`t2` FORCE INDEX(`c`) WHERE (((? IS NULL OR `c` >= ?))) AND (((? IS NULL OR `c` <= ?))) /*checksum chunk*/
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*), '0' FROM `osc`.`t2` FORCE INDEX(`c`) WHERE ((((? IS NOT NULL AND `c` IS NULL) OR (`c` < ?)))) ORDER BY `c` /*past lower chunk*/
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*), '0' FROM `osc`.`t2` FORCE INDEX(`c`) WHERE (((? IS NOT NULL AND `c` IS NULL) OR (`c` < ?))) ORDER BY `c` /*past lower chunk*/
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*), '0' FROM `osc`.`t2` FORCE INDEX(`c`) WHERE ((((? IS NULL AND `c` IS NOT NULL) OR (`c` > ?)))) ORDER BY `c` /*past upper chunk*/
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*), '0' FROM `osc`.`t2` FORCE INDEX(`c`) WHERE (((? IS NULL AND `c` IS NOT NULL) OR (`c` > ?))) ORDER BY `c` /*past upper chunk*/
SELECT /*!40001 SQL_NO_CACHE */ `c`, `c` FROM `osc`.`t2` FORCE INDEX(`c`) WHERE (((? IS NULL OR `c` >= ?))) ORDER BY `c` LIMIT ?, 2 /*next chunk boundary*/