在linux环境下操作mysql数据库是后端开发和运维人员的日常。无论你是要在服务器上直接执行SQL语句,还是要从本地机器连接远程数据库,都离不开对连接方式的掌握。很多初学者装好mysql之后卡在第一步,不知道怎么登录,或者遇到Access denied报错无从下手。这篇文章把linux下访问mysql的几种主流方式讲清楚,并附上常见报错的处理办法。

一、使用mysql命令行客户端本地登录
命令行是最基础也最常用的访问方式。mysql安装完成后,会在系统中提供mysql这个客户端命令。本地登录最简单的形式是直接输入用户名,让系统提示你输入密码:
mysql -u root -p # 回车后输入密码,密码输入时不回显 Enter password:
登录成功后,终端会变成mysql>提示符,这时就可以执行SQL语句了。比如查看有哪些数据库、切换到某个库、执行查询:
SHOW DATABASES; USE test_db; SELECT * FROM users LIMIT 10; EXIT;
除了交互式登录,mysql命令还支持直接在命令行执行SQL并返回结果,这在写shell脚本时特别有用:
# 直接执行一条SQL mysql -u root -p'yourpassword' -e "SELECT VERSION();" # 指定某个数据库并导入SQL文件 mysql -u root -p'yourpassword' test_db < /root/init.sql
需要注意几个常用参数:-h指定主机地址,默认是localhost;-P指定端口,注意是大写的P,默认3306;-u指定用户名;-p表示使用密码登录,密码可以紧贴着写在后面,也可以回车后输入。在脚本中把密码明文写在命令行有泄露风险,更稳妥的做法是把账号密码写在~/.my.cnf配置文件里:
# 编辑 ~/.my.cnf,加入以下内容并保存 [client] user=root password=yourpassword # 设置权限为仅本人可读 chmod 600 ~/.my.cnf # 之后直接输入mysql即可登录,无需再输密码 mysql
二、远程连接mysql数据库的配置
本地登录很简单,但实际工作中更多场景是从一台linux服务器或本地开发机连接另一台服务器上的mysql。这时如果直接用mysql -h 192.168.1.100 -u root -p去连,大概率会遇到两种报错:一种是Connection refused,一种是Access denied。这两种错误的排查思路完全不同。
首先解决Connection refused的问题。mysql默认的配置文件里有一项bind-address,它决定了mysql监听哪些网络接口。默认值通常是127.0.0.1,也就是只接受本机连接,远程请求根本到不了mysql进程。修改方法如下:
# 找到配置文件,常见路径(不同发行版可能不同) sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 或 sudo vim /etc/my.cnf # 将 bind-address = 127.0.0.1 改为 bind-address = 0.0.0.0 # 重启mysql服务使配置生效 sudo systemctl restart mysql # 或 sudo systemctl restart mysqld
接着要确认3306端口是否放行。如果服务器开启了防火墙或使用云服务器的安全组,必须放行3306端口:
# firewalld(CentOS常见) sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload # ufw(Ubuntu常见) sudo ufw allow 3306/tcp
然后处理Access denied的问题。即便网络通了,mysql本身也要授权远程用户才能登录。默认的root用户往往只允许localhost登录,需要专门创建或修改一个允许远程访问的账号:
-- 在mysql服务器上本地登录后执行 -- 方式一:创建一个新的远程用户,%表示允许任意主机连接 CREATE USER 'admin'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'; FLUSH PRIVILEGES; -- 方式二:修改已有用户的host限制 UPDATE mysql.user SET host='%' WHERE user='admin' AND host='localhost'; FLUSH PRIVILEGES;
出于安全考虑,生产环境不建议把host设为%并授予全部权限,更好的做法是限定来源IP,例如'admin'@'192.168.1.%'只允许特定网段访问,并且只授予业务库的权限。
三、使用图形化工具和编程语言访问
命令行适合快速查询和管理,但如果要做复杂的数据浏览、表结构设计,图形化工具效率更高。在linux桌面环境下可以使用DBeaver、MySQL Workbench,跨平台且免费。windows或mac用户则常用Navicat、DataGrip等工具连接linux服务器上的mysql。配置时填写的四个要素是:主机IP、端口3306、用户名、密码,前提是第二部分讲的远程访问配置已经完成。
如果希望用编程方式访问,以python为例,安装pymysql库后几行代码即可建立连接:
import pymysql
# 建立连接
conn = pymysql.connect(
host='192.168.1.100',
port=3306,
user='admin',
password='StrongPass123!',
database='test_db',
charset='utf8mb4'
)
cursor = conn.cursor()
cursor.execute("SELECT id, name FROM users LIMIT 5")
for row in cursor.fetchall():
print(row)
cursor.close()
conn.close()php项目中最常用的是mysqli扩展和PDO,两者都支持连接远程mysql,PDO的优势是可以切换不同数据库驱动,写法更通用。无论哪种语言,连接时都建议显式指定utf8mb4字符集,避免中文数据出现乱码。
四、常见报错的排查思路
汇总几个高频问题。第一,忘记root密码:可以通过--skip-grant-tables参数启动mysql跳过权限验证,然后无密码登录修改密码,操作完记得去掉参数重启服务。第二,ERROR 2003表示连不上服务器,重点检查mysql服务是否运行、bind-address和防火墙。第三,ERROR 1045表示账号密码或host授权有问题,检查mysql.user表中该用户的host字段。第四,ERROR 1130提示host is not allowed to connect,说明用户没有远程授权,回到第二部分添加授权即可。第五,中文乱码通常是字符集问题,执行SHOW VARIABLES LIKE 'character%';查看各项编码,统一改成utf8mb4。
掌握这些内容后,在linux下访问mysql基本不会再有障碍。建议平时养成最小授权的习惯,远程账号只给必要权限、只允许指定IP连接,数据库安全往往就体现在这些细节上。
linux mysqlmysql连接命令mysql客户端修改时间:2026-09-11 02:04:31