为何Perl DBI/DBD无法连接本地MariaDB(MySQL)?
解决Perl DBI连接MariaDB时出现"Can't connect to MySQL server on 'localhost' (10061)"的问题
既然你能用命令行正常连接MariaDB,但Perl脚本却连不上,说明数据库服务本身没问题,问题大概率出在Perl连接的配置细节或者驱动兼容性上,试试下面这些排查和解决步骤:
1. 把localhost换成127.0.0.1试试
Windows系统下,localhost有时候会优先解析到IPv6的::1地址,而你的MariaDB可能只监听了IPv4的127.0.0.1。修改连接字符串后再测试:
use DBI; my $dbh = DBI->connect('DBI:mysql:host=127.0.0.1;database=test', 'user', 'password') or die "failed to connect\n";
2. 检查MariaDB的绑定地址配置
打开你的MariaDB配置文件(Windows上通常是安装目录下的my.ini,比如C:\Program Files\MariaDB 10.2\my.ini),找到bind-address这一行:
- 如果它被设置为
127.0.0.1,那没问题;如果被注释或者设置成了其他网卡IP,可能会导致本地TCP连接失败,建议改回127.0.0.1。
3. 确认DBD::mysql驱动的兼容性
你已经安装了DBI 1.641,但还要确保配套的DBD::mysql驱动版本和你的MariaDB 10.2.14兼容。先查看当前驱动版本:
perl -MDBI -e "print DBI->installed_versions"
如果版本偏旧,建议更新驱动:
cpan DBD::mysql
要是Windows下编译失败,可以尝试用Perl Package Manager(PPM)安装预编译好的版本。
4. 调整连接字符串格式
有时候连接字符串的参数顺序或写法会影响连接,试试这两种格式:
- 把数据库名放在前面:
my $dbh = DBI->connect('DBI:mysql:test;host=127.0.0.1', 'user', 'password') or die "failed to connect\n";
- 显式指定端口号(默认3306,如果你没修改过端口的话):
my $dbh = DBI->connect('DBI:mysql:host=127.0.0.1;port=3306;database=test', 'user', 'password') or die "failed to connect\n";
5. 测试TCP/IP连接是否正常
命令行默认可能用socket连接,而Perl DBI默认用TCP/IP,所以手动测试TCP连接确认网络层面没问题:
mysql -h 127.0.0.1 -P 3306 -u user -p test
如果这个命令能连上,说明TCP/IP通路正常,问题还是在Perl驱动或配置上;如果连不上,那就要检查MariaDB的TCP监听配置了。
内容的提问来源于stack exchange,提问作者grjash
相关产品推荐
相关产品推荐

