WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version

回答 2 浏览 3292 2023-08-10

正如我在此处所看到的,从 MySQL 8.0.34 开始,不推荐使用自动重连功能。我有很多 Perl 脚本连接到 MySQL 数据库,例如:

my $dbh = DBI->connect( "DBI:mysql:database=$db_name;host=$db_host",
                         $db_user, $db_pass, {'RaiseError' => 1,
                         mysql_enable_utf8 => 1} );

现在发出警告:

WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.

我尝试将 Perl 代码更改为:

my $dbh = DBI->connect( "DBI:mysql:database=$js_db_name;host=$js_db_host",
                         $js_db_user, $js_db_pass, {'RaiseError' => 1,
                         mysql_enable_utf8 => 1, mysql_auto_reconnect => 0} );

但警告仍然存在。我尝试按照这里的建议,将reconnect=false添加到/etc/my.cnf处配置文件的[client]部分 。也没有成功。

我甚至尝试更改 MySQL 的 Perl DBI 驱动程序,其代码如下(mysql.pm):

    if ($this && ($ENV{MOD_PERL} || $ENV{GATEWAY_INTERFACE})) {
        $this->{mysql_auto_reconnect} = 1;
    }

避免将mysql_auto_reconnect属性设置为1。但这也行不通。可能还有额外的代码,但如果可能的话我会避免更改标准库。

我尝试更新 DBI 和 DBD::mysql,但它们似乎是最新的:

$ cpanm DBI
DBI is up to date. (1.643)
$ cpanm DBD::mysql
DBD::mysql is up to date. (4.050)

任何打开连接的 Perl 脚本都会向 stderr 抛出消息。

DBD::mysql 的行为记录如下:

This attribute determines whether DBD::mysql will automatically reconnect to mysql if the connection be lost. This feature defaults to off; however, if either the GATEWAY_INTERFACE or MOD_PERL envionment variable is set, DBD::mysql will turn mysql_auto_reconnect on. Setting mysql_auto_reconnect to on is not advised if 'lock tables' is used because if DBD::mysql reconnect to mysql all table locks will be lost. This attribute is ignored when AutoCommit is turned off, and when AutoCommit is turned off, DBD::mysql will not automatically reconnect to the server. It is also possible to set the default value of the mysql_auto_reconnect attribute for the $dbh by passing it in the %attr hash for DBI-connect>. Note that if you are using a module or framework that performs reconnections for you (for example DBIx::Connector in fixup mode), this value must be set to 0.

但我希望能够通过设置mysql_auto_reconnect => 0来绕过它。这是必须显式设置的,因为 MySQL 现在默认设置为不重新连接:

$ mysql --help | egrep "^reconnect"
reconnect                                 FALSE

有什么想法可以禁用重新连接功能并消除警告吗?

Javier Elices 提问于2023-08-10
我认为该标志是自动插入的,因此只要驱动程序未更新,问题仍然存在,但这只是我的猜测nbk 2023-08-10
建议使用 MySQL 和 Perl 模块报告错误,无论哪个模块似乎有问题。Rick James 2023-08-10
2 个回答
#1楼 已采纳
得票数 10

DBD::mysql 总是将 MYSQL_OPT_RECONNECT 设置为 false,您的代码无法更改它。将其设置为任何值(包括 false)都会引发错误。

另请参阅:https://github.com/perl5-dbi/DBD-mysql/issues/354

philip 提问于2023-08-10
philip 修改于2023-08-11
感谢您的反馈意见!我认为你的意思是“DBD::mysql 总是将 MYSQL_OPT_RECONNECT 设置为 true”。Javier Elices 2023-08-11
不,它总是将其设置为 false,然后使用自己的重新连接机制。philip 2023-08-11
问题似乎出在最近更新的libmysqlclient21 库上。当 MYSQL_OPT_RECONNECT 选项设置为 false 时,该库不应发出警告,或者 BDB::mysql 根本不应设置该选项,而应将其设置为 falseJavier Elices 2023-08-17
看起来现在 ubuntu 上的 libdbd-mysql-perl 有了更新,并且似乎已经解决了这个问题!CpnCrunch 2023-08-17
#2楼
得票数 0

以下内容在 Ubuntu 20.04.6 LTS (Focal Fossa) 上为我解决了这个问题:

sudo apt update
sudo apt install libdbd-mysql-perl

(正如OP和其他人的评论中所建议的)

Sideshow Leonard 提问于2023-08-23
标签