perl 警告:MYSQL_OPT_RECONNECT已弃用,将在未来版本中删除

s4n0splo  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(430)

正如我所看到的here,从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} );

他们现在发出警告:
警告:MYSQL_OPT_RECONNECT已弃用,并将在未来版本中删除。
我尝试将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添加到配置文件的[client]部分的/etc/my.cnf,建议here。也没有成功。
我甚至尝试过更改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的行为记录如下:
此属性决定DBD::mysql是否会在连接丢失时自动重新连接到mysql。此功能默认为off;但是,如果设置了GATEWAY_INTERFACE或MOD_PERL环境变量,DBD::mysql将打开mysql_auto_reconnect。如果使用“lock tables”,则不建议将mysql_auto_reconnect设置为on,因为如果DBD::mysql重新连接到mysql,则所有表锁都将丢失。当AutoCommit关闭时忽略此属性,当AutoCommit关闭时,DBD::mysql不会自动重新连接到服务器。也可以设置$的mysql_auto_reconnect属性的默认值。注意,如果您使用的是为您执行重新连接的模块或框架(例如,修复模式下的DBIx::Connector),则此值必须设置为0。
但是我希望能够通过设置mysql_auto_reconnect => 0来绕过它。这是必须显式设置的,因为MySQL现在默认设置为无重新连接:

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

有什么办法可以禁用重新连接功能并摆脱警告吗?

jljoyd4f

jljoyd4f1#

DBD::mysql总是将MYSQL_OPT_RESIDECT设置为false,您的代码无法更改此设置。将其设置为任何值,包括false,都会发出错误。
标签:https://github.com/perl5-dbi/DBD-mysql/issues/354

x6yk4ghg

x6yk4ghg2#

以下为我修复了Ubuntu 20.04.6 LTS(Focal Fossa)上的问题:

sudo apt update
sudo apt install libdbd-mysql-perl

(as执行部分和其他人的评论中建议的)

相关问题