如何使这个perl代码片段也适用于MySQL 8.0?



自从我们以前的技术人员去世以来,我正在调整他的几段代码,因为它无法正常工作,例如MySQL 8.0

perl 代码的片段是:

@temp = `/usr/sbin/vzctl exec $server 'mysql -V 2>/dev/null'`;
chomp(@temp);
@temp = split /s+/,$temp[0];
$mysql = $temp[4];
$mysql =~ s/,//;

它适用于MySQL 5.5/5.6/5.7和所有MariaDB版本。

正确输出的两个示例:

MySQL:  5.5.33
MySQL: 10.3.18-MariaDB

但是,MySQL 8.0存在一个问题。我用 mysql -V 命令检查了它,它以不同的方式输出信息。

正常输出(适用于所有MySQL/MariaDB版本(:

mysql  Ver 14.14 Distrib 5.6.46, for Linux (x86_64) using  EditLine wrapper

但是在MySQL 8.0中是这样的:

mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

由于上述结果,它显示:Linux(而不是版本(。到目前为止,我可以理解这一点,因为"$temp[4]"是mysql -v中的Linux一词。

有解决方法吗?我尝试了一些事情,但老实说,我缺乏 perl 的知识,到目前为止我还没有取得任何进展。由于某种原因,我无法使用MySQL 8.0正确显示版本。

我也尝试过使用 dpkg -l 'mysql-server',但这需要更多的修改才能与其他发行版一起使用,比如 CentOS。

所以也许有人对如何为 MySQL 8.0 解决这个问题有想法?也许我也可以从中学到一些东西以备将来使用。提前谢谢。

您想要服务器版本?

use DBI qw( );
my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
my $dbh = DBI->connect($dsn, $user, $password);
say $dbh->{mysql_serverversion};

它似乎也是信息行中的最后一个(如果只是(版本,因此您可以使用以下内容:

my ($info) = `/usr/sbin/vzctl exec $server 'mysql -V 2>/dev/null'`;
my $version = $info =~ ( /bd+.[d.]+/g )[-1];

可能有一些方法可以直接从MySQL服务器获取它。但这似乎可以满足您的需求,并且与您现有的代码没有太大区别。

#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
my @temp = split /s+/, $_;
my $mysql;
# If the fifth column contains a character that isn't a
# digit, a dot or a comma...
if ($temp[4] =~ /[^d.,]/) {
# then look in column 3
$mysql = $temp[2];
} else {
# else look in column 5
$mysql = $temp[4];
}
$mysql =~ s/,//;
print "$mysqln";
}
__DATA__
mysql  Ver 14.14 Distrib 5.6.46, for Linux (x86_64) using  EditLine wrapper
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

更新:根据下面的评论,我建议将if/else条款更新为:

# If column 5 start with what looks like a version number...
if ($temp[4] =~ /^d+.d+/) {
# then look in column 5
$mysql = $temp[4];
} else {
# else look in column 3
$mysql = $temp[2];
}

最新更新