在Linux中建立数据库连接,本质就是安装对应的客户端工具,然后用正确的协议、账号和网络参数去访问目标库服务,这篇文章把命令行、远程配置、图形工具和常见故障一次讲透,实操可直接复制命令。
连接数据库前,先把这三样东西准备好
动手之前,先确认三个基础条件:数据库服务端地址和端口、可用的账号密码、以及Linux本机已安装对应客户端,缺任何一样,后面的命令都会报错。
怎么确认数据库服务端信息
如果你连接的是内网数据库,先和DBA或运维确认三件事:服务IP是内网地址还是外网地址、监听端口(MySQL默认3306,PostgreSQL默认5432,Oracle默认1521)、账号是否允许从你的主机登录,这三个信息可以通过一条命令快速验证网络通不通:
telnet 192.168.1.10 3306
如果黑屏或提示连接成功,说明端口开放;如果提示Connection refused或超时,说明网络层面有问题,这比排查客户端配置快得多,现在多数Linux发行版默认没装telnet,可以用nc -zv 192.168.1.10 3306替代,效果一样,但输出更简洁。
安装命令行客户端
不同数据库对应的客户端工具不一样,下面按数据库类型分别说明安装命令,以Debian/Ubuntu系和RHEL/CentOS系为例:
- MySQL / MariaDB:
sudo apt install mysql-client(Debian系)或sudo yum install mysql(RHEL系) - PostgreSQL:
sudo apt install postgresql-client(Debian系)或sudo yum install postgresql(RHEL系) - Oracle:需要单独下载Oracle Instant Client,解压后配置
LD_LIBRARY_PATH,或者直接装sqlplus包 - Redis:
sudo apt install redis-tools,这个只能用于Redis连接,不做SQL类查询
安装完成后,先看一下版本号,确认装成功:mysql --version,如果返回版本信息,说明客户端可用。
linux连接mysql数据库命令,一条命令搞定
这是日常最高频的场景,社区和招聘需求里最常见的表述就是linux连接mysql数据库命令,实际上标准命令是这样的:
mysql -h 192.168.1.10 -P 3306 -u root -p
-h指定主机地址,-P指定端口(大写,小写-p是密码参数),-u指定用户名,-p表示回车后输入密码,如果你要连接同一台机器上的本地MySQL,并且服务端允许socket连接,直接输入mysql -uroot -p就能连上,不需要写IP和端口,这属于localhost下的快速通道。
常用参数组合,实际工作里就这几招
以下几种连接方式覆盖了绝大多数真实使用场景:
- 指定数据库直连:
,密码紧跟mysql -h192.168.1.10 -uroot -p'密码' test_db
-p后面不要有空格,执行完直接进入指定库 - 带SSL加密连接:
mysql -h192.168.1.10 -uroot -p --ssl-mode=REQUIRED,强制使用加密传输,防止明文嗅探 - 连接时指定字符集:
mysql -h192.168.1.10 -uroot -p --default-character-set=utf8mb4 - 执行单个SQL后自动退出:
mysql -h192.168.1.10 -uroot -p -e "show databases;",适合写脚本批量巡检
需要注意的是,MySQL 8.0默认认证插件是caching_sha2_password,如果你的Linux客户端版本太老(低于5.7),会提示认证插件无法加载,据MySQL官方文档确认,解决方法是升级客户端到8.0版本,或者把服务端账号改回mysql_native_password认证,这是最容易踩的坑之一。
连接成功后怎么确认和切换
连上之后,MySQL终端会显示mysql>提示符,先用一条命令确认当前连接的服务器IP和你操作的是哪个库:
select current_user(), now(); show databases; use test_db;
use切换目标库后,之后的SQL都会在这个库上执行。
linux远程连接数据库服务器,配置没到位一定连不上
linux远程连接数据库服务器和本地最大的区别在于:服务端不监听外部请求、防火墙拦截、账号授权不足,三个问题里随便遇到一个就会失败,这不是客户端命令能解决的,得回到服务端改配置。
绑定地址必须从localhost改过来
默认情况下,MySQL和PostgreSQL只监听127.0.0.1,也就是只接受本机连接,修改方式:
- MySQL:编辑
/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address = 127.0.0.1,改成bind-address = 0.0.0.0(监听所有网卡)或指定内网IP如168.1.10 - PostgreSQL:编辑
/etc/postgresql/16/main/postgresql.conf,把listen_addresses = 'localhost'改成listen_addresses = '' - MariaDB:配置文件在
/etc/mysql/mariadb.conf.d/50-server.cnf,同样的修改逻辑
改完必须重启服务:MySQL用sudo systemctl restart mysql,PostgreSQL用sudo systemctl restart postgresql,这一步忘了做,后面全白搭。
防火墙放行与账号授权
服务监听地址改完,还要检查防火墙,以Ubuntu的ufw为例:
sudo ufw allow 3306/tcp sudo ufw status
如果用的是firewalld(常见于CentOS),命令是sudo firewall-cmd --add-port=3306/tcp --permanent --reload,内网环境还要确认云安全组是否放行了对应端口,这是云厂商控制台层面的事,不在Linux系统里。
账号授权也不能忽略,MySQL默认的root账号在%上通常没有远程权限,需要单独创建远程访问账号:
create user 'appuser'@'%' identified by 'StrongPass123'; grant all privileges on test_db. to 'appuser'@'%'; flush privileges;
表示允许任意主机连接,如果只想让某个固定IP连接,把换成具体IP更安全,例如'appuser'@'192.168.1.50'。
Linux之间直连,ssh隧道是加密替代方案
如果数据库端口不方便直接对外开放,可以用SSH隧道转发,在客户端机器上执行:
ssh -L 3306:localhost:3306 user@db_server_ip
这条命令把本地3306端口通过SSH隧道映射到数据库服务器的3306端口,之后用mysql -h127.0.0.1 -P3306连接,实际访问的是远程数据库,但流量全程走SSH加密通道,相比直接暴露端口,安全性高出不少,配置也简单,很多团队在生产环境都这么干。
图形化工具:Linux桌面环境下更直观的连接方案
服务器上只能用命令行,但在自己的Linux桌面机做开发和运维,图形化工具效率更高,以下几个工具在Linux环境下的支持度比较好。
DBeaver Community:开源免费,一工具连所有库
DBeaver基于Java运行,支持MySQL、PostgreSQL、Oracle、SQLite、Redis等几乎所有常见数据库,安装方式:
sudo snap install dbeaver-ce
或去官网下载Linux安装包,它的优势是单一工具解决所有连接需求,无需为每种数据库单独装GUI客户端,连接时填写主机、端口、数据库名、用户名密码即可,还能保存连接配置下次直接打开。
Navicat家族:功能全面但付费
Navicat在Linux下可用,支持MySQL和PostgreSQL版本,界面和Windows端一致,它的特点是数据同步、结构同步、导入导出工具齐全,适合需要频繁做数据迁移的运维场景,缺点是授权费用不低,个人开发用可能会觉得不划算。
命令行重度用户:推荐使用mycli和pgcli
如果你习惯终端操作又想要高亮提示,mycli和pgcli是很好的补充,安装后输入和mysql一样,但带了自动补全和语法高亮,体验贴近IDE:
sudo apt install mycli mycli -h192.168.1.10 -uroot -p
工具对比,按需求选合适的
| 工具 | 支持数据库 | 是否免费 | 适合场景 | 安装复杂度 |
|---|---|---|---|---|
| DBeaver Community | 全类型 | 是 | 日常开发、多库管理 | 低 |
| Navicat for MySQL | MySQL/MariaDB | 否 | 数据迁移、结构同步 | 低 |
| mycli / pgcli | MySQL/PostgreSQL | 是 | 终端重度用户 | 低 |
| VS Code Database插件 | 多类型 | 是 | 前端全栈开发副带 | 中 |
连接失败原因,按这个顺序排查
连接报错时,先看错误提示,再按层级排查,给你一个通用的排查路径。
第一层:网络连通性
这里最常见的报错是Can't connect to MySQL server on 'x.x.x.x',可能原因包括:IP地址写错、端口不对、防火墙拦截,用nc -zv IP 端口测试是否通,如果不通,回到服务端查监听状态。
第二层:服务端配置
ss -tlnp | grep 3306可以查看MySQL是否在监听外部端口,如果只有127.0.0.1:3306,说明bind-address没改,如果是0.0.0:3306或具体IP,检查服务端防火墙。
第三层:认证与授权
接下来最常见的报错是Access denied for user 'xxx'@'xxx',这个报错说明服务端连通,但是账户认证没通过,先用正确的密码在服务端本地尝试登录,确认密码无误后,再检查授权:
select user, host from mysql.user;
看目标账号的host是否包含你当前客户端所在IP网段,如果host字段是localhost,远程永远无法登录,改为或具体网段后重启。
第四层:客户端版本兼容性
前面提到的MySQL 8.0认证插件问题就属于这一类,报错信息表现为Authentication plugin 'caching_sha2_password' cannot be loaded,解决方法是升级客户端到MySQL 8.0以上版本,或者修改账号认证插件:
alter user 'appuser'@'%' identified with mysql_native_password by 'StrongPass123';
行业共识认为,从安全角度考虑应优先升级客户端,而不是降低认证插件等级。
常见问题快速问答
Linux下连接数据库提示command not found怎么办?
说明客户端工具未安装,确认数据库类型后,按文中对应命令安装客户端,以Ubuntu连接MySQL为例执行sudo apt install mysql-client,CentOS执行sudo yum install mysql即可。
输入密码后提示Access denied但密码确实是对的?
优先检查账号对应的host授权范围。mysql -h127.0.0.1与mysql -h192.168.1.10连接看到的主机级别不同,服务端会将客户端IP匹配到mysql.user表的host字段,如果host为localhost,只能从本机socket方式登录,建议将远程账号host设为或固定内网段,同时确认服务端bind-address已改为0.0.0。
能ping通数据库服务器但为什么连接超时?
ping通只能说明ICMP协议可达,不能代表TCP端口可达,检查云安全组入方向规则和Linux防火墙是否放行对应数据库端口,用nc -zv IP 3306做端口测试,如果超时,基本可以确定是防火墙拦截,按文中firewalld或ufw的命令配置放行。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/673694.html





