统信uos中mysql远程访问需四步:确认服务运行并本地登录成功;创建指定ip/网段的专用用户并授权;修改bind-address=0.0.0.0并重启服务;配置firewalld放行3306端口,最后用pymysql验证连接。

在统信UOS系统中,完成MySQL数据库安装后,若无法通过命令行或程序访问数据库,通常是因为连接方式、用户权限或网络配置未正确设置。必须先确认MySQL服务已运行,再验证本地连接是否通,最后扩展至远程或应用层连接。
确认MySQL服务状态并测试本地连接
打开终端,执行:sudo systemctl status mysql。若显示 active (running),说明服务已就绪;若为 inactive,立即执行 sudo systemctl start mysql && sudo systemctl enable mysql 启动并设为开机自启。
用默认root用户尝试本地登录:mysql -u root -p。首次安装后,部分APT安装版本的root密码为空,直接回车即可进入;若提示密码错误,请先通过 sudo mysql_secure_installation 设置强密码。
登录成功后执行 SELECT USER(), CURRENT_USER();,确认当前会话用户是 root@localhost。如果不是,说明你可能被匿名用户或旧配置干扰,需退出后重新检查用户表。
创建可远程连接的专用用户(含授权与主机白名单)
MySQL默认仅允许 root@localhost 本地登录,禁止任何远程IP访问。要从Navicat、Python脚本或其他设备连接,必须显式创建新用户并授权指定主机。
方法一:允许特定IP远程连接(推荐用于开发机)
在MySQL命令行中执行:CREATE USER 'appuser'@'192.168.1.105' IDENTIFIED BY 'StrongPass2026!';GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'192.168.1.105' WITH GRANT OPTION;FLUSH PRIVILEGES;
方法二:允许局域网段内任意设备连接(如调试多台测试机)CREATE USER 'devadmin'@'192.168.1.%' IDENTIFIED BY 'DevTeam@2026';GRANT SELECT,INSERT,UPDATE,DELETE ON myappdb.* TO 'devadmin'@'192.168.1.%';FLUSH PRIVILEGES;
【注意】不要使用 '%' 通配符开放公网访问,这会暴露root或高权限账户,极易被暴力破解。
修改MySQL监听地址并重启服务
即使创建了远程用户,MySQL默认仍只监听 127.0.0.1(回环地址),外部请求会被直接拒绝。必须修改配置使其监听真实网卡。
第一步:编辑主配置文件sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
第二步:在 [mysqld] 段落下找到 bind-address 行,将其改为:bind-address = 0.0.0.0
若该行被注释(开头为#),需取消注释;若不存在,手动添加在 [mysqld] 下方。
第三步:保存退出,重启服务使配置生效sudo systemctl restart mysql
重启后再次执行 sudo ss -tlnp | grep :3306,输出中应包含 *:3306 或 0.0.0.0:3306,而非 127.0.0.1:3306。
配置UOS系统防火墙放行3306端口
统信UOS默认启用firewalld,即使MySQL监听了0.0.0.0,外部连接仍会被防火墙拦截。
执行以下命令放行MySQL端口:sudo ufw allow 3306
若提示 ufw: command not found,说明使用的是firewalld,则运行:sudo firewall-cmd --permanent --add-port=3306/tcpsudo firewall-cmd --reload
验证是否生效:sudo firewall-cmd --list-ports | grep 3306。有输出即表示已放行。
用Python代码验证数据库连接(含异常处理)
在UOS终端中安装PyMySQL驱动:pip3 install PyMySQL。确保使用pip3而非pip,避免Python 2/3混淆。
创建测试脚本 test_mysql.py:
import pymysqltry: conn = pymysql.connect( host='192.168.1.200', # 替换为MySQL服务器实际IP user='appuser', password='StrongPass2026!', database='mysql', port=3306, connect_timeout=5 ) print("✅ 连接成功") conn.close()except pymysql.err.OperationalError as e: print(f"❌ 连接失败:{e}")
运行:python3 test_mysql.py。若输出 ✅ 连接成功,说明整个链路(网络→防火墙→MySQL监听→用户权限→认证)全部打通。











