-
Notifications
You must be signed in to change notification settings - Fork 328
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pt 2247 #686
Pt 2247 #686
Changes from 11 commits
8ad0bc0
275ceb0
3be972e
b9be38d
b9675c5
6f767a9
4a812d4
e3a3d97
a8bb509
1dc1c99
0924e35
bc23d08
f3f4943
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2039,25 +2039,52 @@ sub main { | |
|
||
# If MySQL 5.7.6+ then we need to use SHOW CREATE USER | ||
my @create_user; | ||
if (( VersionCompare::cmp($version, '5.7.6') >= 0 ) && | ||
if (( VersionCompare::cmp($version, '5.7.6') >= 0 ) || | ||
( VersionCompare::cmp($version, '10.0.0') <= 0 )) { | ||
eval { | ||
if (!($version =~ m/MariaDB/) && ( VersionCompare::cmp($version, '8.0.17') >= 0 ) && ($o->get('print_identified_with_as_hex'))){ | ||
$dbh->do("SET print_identified_with_as_hex=1") or die(); | ||
print "-- Setting print_identified_with_as_hex as ACTIVE at session level for correct export/import\n"; | ||
} | ||
@create_user = @{ $dbh->selectcol_arrayref("SHOW CREATE USER $user_host") }; | ||
}; | ||
if ( $EVAL_ERROR ) { | ||
PTDEBUG && _d($EVAL_ERROR); | ||
$exit_status = 1; | ||
} | ||
PTDEBUG && _d('CreateUser:', Dumper(\@create_user)); | ||
# make this replication safe converting the CREATE USER into | ||
# CREATE USER IF NOT EXISTS and then doing an ALTER USER | ||
my $create = $create_user[0]; | ||
my $alter = $create; | ||
$create =~ s{CREATE USER}{CREATE USER IF NOT EXISTS}; | ||
$create =~ s{ IDENTIFIED .*}{}; | ||
$alter =~ s{CREATE USER}{ALTER USER}; | ||
@create_user = ( $create, $alter ); | ||
PTDEBUG && _d('AdjustedCreateUser:', Dumper(\@create_user)); | ||
if ($#create_user >= 0){ | ||
PTDEBUG && _d('CreateUser:', Dumper(\@create_user)); | ||
#given caching_sha2_password issue we need to select the password in binary format and replace the one coming from the create | ||
#my $query = "SELECT authentication_string as sha2, convert(authentication_string using Binary) as bin from mysql.user where user='$u->{User}' and host='$u->{Host}'"; | ||
my $query = "SELECT authentication_string sha2 from mysql.user where user='$u->{User}' and host='$u->{Host}'"; | ||
PTDEBUG && _d('get password:', Dumper($query)); | ||
my ( $pw_sha2) = $dbh->selectrow_array($query); | ||
my $pw_bin = $pw_sha2; | ||
$pw_bin =~ s/(.)/sprintf '%02X', ord $1/seg; | ||
$pw_bin = "0x".$pw_bin; | ||
|
||
# make this replication safe converting the CREATE USER into | ||
# CREATE USER IF NOT EXISTS and then doing an ALTER USER | ||
my $create = $create_user[0]; | ||
my $alter = $create_user[0]; | ||
$create =~ s{CREATE USER}{CREATE USER IF NOT EXISTS}; | ||
$create =~ s{ IDENTIFIED VIA }{ IDENTIFIED AS }; | ||
$create =~ s{ BY }{ AS }; | ||
if (( $create =~ m/caching_sha2_password/ ) && !($o->get('print_identified_with_as_hex'))) { | ||
print "-- Converting $user_host caching_sha2_password to binary for correct export/import\n"; | ||
$create =~ s/\sAS\s.*'\s/ AS $pw_bin /g; | ||
} | ||
$alter =~ s{CREATE USER}{ALTER USER}; | ||
# Alter user should not be pass in the latest MySQL version | ||
#we need to cleanup other MariaDB diversions | ||
if ( ($version =~ m/MariaDB/) && $o->get('convert-MariaDB')){ | ||
$create =~ s{ AS.*PASSWORD }{ AS }; | ||
$create =~ s/IDENTIFIED.*USING.*unix_socket.*/IDENTIFIED WITH auth_socket/; | ||
$create =~ s/IDENTIFIED AS/IDENTIFIED WITH mysql_native_password AS/; | ||
} | ||
@create_user = ( $create); | ||
PTDEBUG && _d('AdjustedCreateUser:', Dumper(\@create_user)); | ||
} | ||
} | ||
my @grants; | ||
eval { | ||
|
@@ -2067,6 +2094,13 @@ sub main { | |
PTDEBUG && _d($EVAL_ERROR); | ||
$exit_status = 1; | ||
} | ||
#IF is MariaDB we need to remove the password from the user | ||
if (($version =~ m/MariaDB/)){ | ||
for my $i (0 .. $#grants){ | ||
$grants[$i] =~ s{IDENTIFIED.*}{}; | ||
} | ||
PTDEBUG && _d('Grants:', Dumper(\@grants)); | ||
} | ||
PTDEBUG && _d('Grants:', Dumper(\@grants)); | ||
next unless @grants; | ||
|
||
|
@@ -2146,8 +2180,8 @@ sub main { | |
|
||
if ( $o->get('drop') && !defined($u->{IsRole}) ) { | ||
print join("\n", | ||
"DROP USER $user_host;", | ||
"DELETE FROM `mysql`.`user` WHERE `User`='$u->{User}' AND `Host`='$u->{Host}';", | ||
"DROP USER IF EXISTS $user_host;", | ||
#"DELETE FROM `mysql`.`user` WHERE `User`='$u->{User}' AND `Host`='$u->{Host}';", | ||
), "\n"; | ||
} | ||
|
||
|
@@ -2433,6 +2467,16 @@ type: array | |
|
||
Only show grants for this comma-separated list of users. | ||
|
||
=item --convert-MariaDB | ||
|
||
When set it convert some of the proprietary MariaDB syntax into valid MySQL form | ||
svetasmirnova marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
=item --print_identified_with_as_hex | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. According to the user manual at https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_print_identified_with_as_hex:
Do we really need this option or checking for correct MySQL version is enough? |
||
|
||
Enabling print_identified_with_as_hex causes SHOW CREATE USER to display such hash values as hexadecimal strings rather than as regular string literals. | ||
Hash values that do not contain unprintable characters still display as regular string literals, even with this variable enabled. | ||
|
||
|
||
=item --password | ||
|
||
short form: -p; type: string | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With "||" this expression is always true.