Как заставить этот фрагмент кода на Perl работать также на MySQL 8.0? - PullRequest
0 голосов
/ 18 октября 2019

Так как наш предыдущий техник скончался, я корректирую несколько частей его кода, так как он не работает, например, с 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]» - это слово Linux в mysql -v.

Есть ли обходной путь для этого? Я попробовал несколько вещей, но мне не хватает знания Perl, если честно, и пока я не делаю успехов. По какой-то причине я не могу правильно отобразить версию с MySQL 8.0.

Я также пытался дурачиться с dpkg -l 'mysql-server', однако это потребовало бы дополнительных модификаций для работы также с другими дистрибутивами, такими какCentOS.

Так, может, у кого-то есть идея, как решить эту проблему для MySQL 8.0? И, может быть, я смогу чему-то научиться от этого для будущего использования. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Требуется версия сервера?

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 =~ ( /\b\d+\.[\d.]+/g )[-1];
1 голос
/ 18 октября 2019

Возможно, есть способы получить это напрямую с сервера 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 "$mysql\n";
}

__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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...