SSH Tunnel连接MariaDB遇阻:本地/远程绑定地址混淆求助
解决树莓派间MariaDB远程连接问题的分步指南
我明白你现在的困惑——远程连接数据库时绑定地址和权限配置确实是新手容易踩的坑,咱们一步步把问题拆解清楚:
1. 先修正MariaDB的绑定地址配置
默认情况下,MariaDB只允许**本地回环地址(127.0.0.1)**访问,这就导致只有数据库所在的树莓派本身能连,其他设备哪怕在同一局域网也会被拒绝。你需要修改配置让它监听局域网IP:
- 打开树莓派上的MariaDB配置文件:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf - 找到
bind-address这一行,把默认的127.0.0.1改成:- 如果你只想让特定设备访问,填数据库树莓派的局域网IP(比如
192.168.1.100) - 想允许局域网内所有设备访问,就改成
0.0.0.0(仅限局域网内使用,避免暴露到公网)
- 如果你只想让特定设备访问,填数据库树莓派的局域网IP(比如
- 重启MariaDB生效:
sudo systemctl restart mariadb
2. 给另一台树莓派配置数据库访问权限
你用PC的SQL Workbench能连上,大概率是这个数据库用户只授权了PC的IP访问,现在要给另一台树莓派开权限:
- 在数据库所在树莓派上登录MariaDB:
sudo mariadb -u root -p - 执行授权命令(替换成你的实际信息):
-- 允许指定IP的设备访问指定数据库 GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'另一台树莓派的局域网IP' IDENTIFIED BY '你的密码'; -- 或者允许该用户从整个局域网段访问(比如192.168.1.x) GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'192.168.1.%' IDENTIFIED BY '你的密码'; - 刷新权限让配置生效:
FLUSH PRIVILEGES; - 退出MariaDB:
EXIT;
3. 新手友好的Python连接代码(带参数注释)
给你写个清晰的示例,每个参数都标注了作用,避免再混淆本地/远程地址:
import mysql.connector # 核心参数说明: # host: 必须填数据库所在树莓派的**局域网IP**,不能写localhost(localhost是本地回环,远程设备用不了) # user: 你在MariaDB中创建的合法用户名 # password: 对应用户的登录密码 # database: 你要操作的目标数据库名称 db_config = { "host": "192.168.1.XXX", # 替换成你的数据库树莓派IP "user": "你的用户名", "password": "你的密码", "database": "你的数据库名" } try: # 建立数据库连接 conn = mysql.connector.connect(**db_config) if conn.is_connected(): print("成功连接到MariaDB服务器!") # 示例:插入一条测试数据(替换成你的业务逻辑) cursor = conn.cursor() insert_sql = "INSERT INTO 你的表名(字段1, 字段2) VALUES (%s, %s)" data = ("测试内容1", "测试内容2") cursor.execute(insert_sql, data) conn.commit() print(f"成功插入{cursor.rowcount}条数据") # 用完记得关闭资源 cursor.close() conn.close() except mysql.connector.Error as e: print(f"连接或操作出错: {e}")
4. 最后排查网络和防火墙问题
如果还是连不上,先确认基础网络是否通畅:
- 在另一台树莓派上ping数据库树莓派的IP:
ping 192.168.1.XXX,看能不能收到响应 - 测试3306端口是否开放:
telnet 192.168.1.XXX 3306(没装telnet的话先执行sudo apt install telnet) - 检查数据库树莓派的防火墙,允许3306端口:
sudo ufw allow 3306,然后重启防火墙:sudo ufw reload
内容的提问来源于stack exchange,提问作者tarnis




