Flutter连接Plesk服务器MariaDB数据库的问题求助
解决Flutter通过mysql1包连接Plesk远程MySQL的问题
我之前也踩过类似的坑,折腾了好一阵才搞定远程连接的问题,给你梳理下完整的步骤和需要注意的细节:
第一步:确认Plesk服务器端的配置是否到位
别光看Plesk界面的远程权限开关,还有几个关键点要检查:
- 数据库用户的远程访问权限:
除了在Plesk的「数据库」模块里给你的数据库用户添加允许访问的IP(测试阶段可以暂时填%允许所有IP,生产环境一定要限制特定IP),还要登录MySQL控制台确认用户的host设置:
确保结果里的host是你的设备公网IP或者SELECT user, host FROM mysql.user WHERE user = '你的数据库用户名';%,如果不是,需要执行:GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES; - 服务器防火墙放行3306端口:
- 在Plesk的「工具与设置」→「防火墙」里,添加规则允许入站的3306端口访问;
- 还要检查服务器系统层面的防火墙(比如Linux的ufw/iptables),确保3306端口没有被拦截;
- 确认MySQL端口和SSL设置:
在Plesk的「数据库」→「你的数据库」→「远程访问」里,确认MySQL的端口是默认的3306(如果改过要记下来),同时注意是否强制要求SSL连接。
第二步:Flutter端mysql1包的正确连接代码
先在pubspec.yaml里添加依赖:
dependencies: mysql1: ^0.20.0 # 建议用pub.dev上的最新版本
然后写连接和查询的代码,一定要加异常处理和SSL配置(Plesk的MySQL大多默认开启SSL):
import 'package:mysql1/mysql1.dart'; Future<void> fetchRemoteData() async { // 配置连接参数 final connSettings = ConnectionSettings( host: '你的Plesk服务器公网IP', port: 3306, // 如果服务器改了端口就填对应的 user: '数据库用户名', password: '数据库密码', db: '目标数据库名称', // 关键:SSL配置,Plesk的MySQL一般要求SSL sslSettings: SslSettings( // 测试阶段可以先跳过证书验证,生产环境要配置合法证书 insecure: true, allowedCipherSuites: [], ), ); try { // 建立连接 final connection = await MySqlConnection.connect(connSettings); print('✅ 远程数据库连接成功!'); // 执行查询获取数据 final results = await connection.query('SELECT * FROM 你的表名 LIMIT 5'); // 遍历输出数据 for (var row in results) { print('📋 行数据:${row.fields}'); // 获取特定字段示例:row['id'], row['username'] } // 关闭连接 await connection.close(); } catch (e) { print('❌ 连接/查询失败:$e'); // 根据错误信息排查:比如"Access denied"是权限问题,"Connection timed out"是网络/防火墙问题 } }
常见坑点排查
- SSL连接失败:如果报错和SSL相关,先确认服务器是否强制SSL,测试阶段可以先设置
insecure: true跳过验证,生产环境要获取服务器的SSL证书并配置到sslSettings里; - 网络不通:用你的设备测试能不能访问服务器的3306端口,比如在终端执行
telnet 服务器IP 3306,如果连接不上就是防火墙或者服务商安全组的问题; - 权限不足:确保数据库用户拥有目标数据库的
SELECT等必要权限,在Plesk的用户权限设置里可以直接配置; - 生产环境提醒:直接在Flutter客户端连接MySQL非常不安全,会暴露数据库账号密码,建议搭建一个后端API(比如用Node.js/PHP/Go),Flutter通过API和数据库交互,这才是正规的生产环境做法。
内容的提问来源于stack exchange,提问作者Koek
相关产品推荐
相关产品推荐

