自从我们以前的技术人员去世以来,我正在调整他的几段代码,因为它无法正常工作,例如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];
}