连接数据库服务器,核心就一句话:用客户端工具,把“连哪台机器、哪个端口、用哪个账号、验证什么密码”这四个参数告诉数据库,它验证通过就建立会话。 不管是MySQL、SQL Server还是Oracle,参数含义都差不多,差别只在命令格式和图形界面入口,下面我会拆开讲,从通用原理到具体操作,再到排错,一步一步说清楚。
怎么用sql连接数据库服务器:先搞懂连接参数
在动手敲命令之前,得先明白连接这件事到底在做什么,SQL本身是查询语言,不负责传输,真正干活的,是数据库厂商提供的客户端程序或驱动,你要做的,是把“目的地”和“身份证明”交给它。
连接数据库服务器需要哪些信息
不管用什么数据库,下面四项缺一不可:
- 主机地址(Host):数据库服务器的IP或域名,本地测试填
0.0.1或localhost,远程就是那台服务器的公网IP或内网IP。 - 端口(Port):数据库监听的端口,MySQL默认
3306,SQL Server默认1433,Oracle默认1521,PostgreSQL默认5432,如果改了默认端口,必须显式指定。 - 用户名(User):有权限登录的账号,比如
root、sa、system。 - 密码(Password):对应账号的密码。
另外在SQL Server和Oracle里,可能还要多一项:实例名或服务名,SQL Server连接时写成“主机地址\实例名”,比如168.1.20\\SQLEXPRESS,Oracle连接则用“主机地址:端口/服务名”,比如168.1.20:1521/orcl。
三大主流数据库的连接命令长什么样
行业共识是,命令行是检验连接是否通的最快方式,下面给出三种常用数据库的命令行示例。
MySQL/MariaDB:
mysql -h 192.168.1.20 -P 3306 -u root -p
回车后会提示输入密码,如果不加-h,默认连本机;不加-P,默认3306,密码直接写在命令里有泄露风险,不建议这么干。
SQL Server(使用sqlcmd工具):
sqlcmd -S 192.168.1.20,1433 -U sa -P YourPassword
注意SQL Server的连接语法,主机和端口之间用英文逗号,不是冒号,如果是默认实例,-S后面直接写主机名就行。
Oracle(使用sqlplus工具):
sqlplus system/YourPassword@192.168.1.20:1521/orcl
Oracle把用户名、密码、连接串放在一起,用和连接,这种方式写死了密码,更推荐用sqlplus /nolog进入后再connect。
怎么用sql连接远程数据库服务器:三步走
远程连接和本地连接没有本质区别,只是多了网络路径和防火墙两道坎,第一次操作远程库,按照下面的顺序做基本不会卡壳。
第一步:确认服务器端开启了远程访问
这一步最容易被忽略,很多数据库默认只监听本地回环地址,IntelliJ IDEA、Navicat报“连接超时”多半是这儿的问题。
- MySQL:查看配置文件
my.cnf或my.ini里的bind-address,如果写着0.0.1,远程连不上,得改成0.0.0或具体网卡IP,然后重启MySQL服务。 - SQL Server:打开“SQL Server配置管理器”,检查“MSSQLSERVER的协议”里TCP/IP是否已启用,默认可能禁用,右键启用后重启服务。
- Oracle:检查
listener.ora的监听地址是否包含了服务器IP,用lsnrctl status查看监听状态。
第二步:打通防火墙和安全组
远程连接的三道墙分别是:服务器本地防火墙、云服务器安全组、数据库账号授权。
- Windows防火墙:在“高级安全Windows Defender防火墙”里,添加入站规则放行对应端口(如3306)。
- Linux防火墙:执行
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload(CentOS)或ufw allow 3306/tcp(Ubuntu)。 - 云服务器:登录简米云、酷番云或AWS控制台,在安全组里添加入站规则,源IP建议限制为你自己的公网IP,别直接填
0.0.0/0。
第三步:用客户端发起连接
这一步就看工具了,图形化工具(Navicat、DBeaver、DataGrip)本质是把上面的参数填到界面里,再点击测试连接,填连接数据库服务器地址怎么填?数据库主机填IP,端口填数字,用户名密码照抄,测试成功后保存,如果是内网穿透或SSH隧道场景,还需要在工具里额外配置SSH认证。
sql连接数据库服务器失败怎么办:常见原因排查
连接失败是最常见的需求,排查思路比背命令更重要,我按出现频率从高到低列几个典型场景。
账号授权不匹配
- 错误提示:
Access denied for user 'xxx'@'xxx.xxx.xxx.xxx' (using password: YES) - 原因:账号没权限从那个IP登录,MySQL里执行
GRANT ALL ON . TO 'user'@'%' IDENTIFIED BY 'password';可以放开,但更稳妥的做法是只允许特定IP。 - 教训:
'user'@'localhost'和'user'@'%'是两回事,别搞混。
端口不通或服务未启动
- 错误提示:
Can't connect to MySQL server on '192.168.1.20' (10061),或SQL Server的“网络相关或特定实例的错误”。 - 排查命令:在你本机执行
telnet 192.168.1.20 3306,如果黑屏没反应就是网络不通;如果弹出命令窗口白屏,说明端口通,也可以ping一下看主机是否在线。 - 再看看服务:
systemctl status mysqld(或mariadb)、systemctl status mssql-server、lsnrctl status。
连接超时还是被拒绝
这两个逻辑完全不同:
- 超时(Timeout expired):说明包发出去了但没人回,大概率是防火墙、安全组、路由问题。
- 拒绝(Connection refused):说明目标机器能收到包,但对应端口没有服务在监听,大概率是数据库没启动、监听端口不对、或bind-address限制。
字符集或加密协议不匹配
较新的数据库可能默认要求SSL或特定字符集,如果看到Authentication plugin 'caching_sha2_password' cannot be loaded,说明客户端版本太老,升级驱动,或者把MySQL用户改成mysql_native_password(生产环境慎用)。
连接数据库服务器有哪些工具:命令行与图形化对比
连接数据库服务器,选工具就看你是“偶尔跑个查询”还是“天天开发调试”,命令行灵活、脚本友好,图形化直观、适合看数据,没有绝对好坏,只看场景。
| 工具类型 | 代表工具 | 优点 | 缺点 |
|---|---|---|---|
| 命令行 | mysql、sqlcmd、sqlplus | 轻量、脚本可控、远程服务器上必用 | 结果排列不直观,写复杂查询麻烦 |
| 图形化 | Navicat、DBeaver、DataGrip | 可视化表格、自动补全、ER图 | 内存占用高,部分工具收费 |
| 编程语言驱动 | JDBC、Python pymysql、Go database/sql | 可嵌入应用、自动连接池 | 需要写代码,调试成本稍高 |
如果你是DBA或运维,命令行是底线技能,如果你是后端开发,图形化解锁生产力,但底层参数原理一样。
连接字符串怎么写:应用代码里的连接逻辑
应用程序连接数据库时,不走命令行,而是通过连接字符串,这个字符串本质上还是那四个参数,只是被格式化了。
JDBC(Java)
jdbc:mysql://192.168.1.20:3306/dbname?useSSL=false&serverTimezone=UTC
- SQL Server:
jdbc:sqlserver://192.168.1.20:1433;databaseName=dbname - Oracle:
jdbc:oracle:thin:@192.168.1.20:1521/orcl
Python(PyMySQL)
import pymysql conn = pymysql.connect(host='192.168.1.20', port=3306, user='root', password='123456', database='dbname')
.NET(SqlConnection)
Server=192.168.1.20,1433;Database=dbname;User Id=sa;Password=123456;
写连接字符串的时候,注意参数名大小写不敏感但拼写必须正确,密码里有特殊字符时要URL编码或转义,这是新手常踩的坑。
安全性:别把数据库裸奔在公网
连接数据库服务器这个问题,光会连还不算完,服务器一旦暴露在公网上,扫描机器人几分钟内就会尝试爆破端口,刚学习的话,至少做到下面几点:
- 禁止root远程登录:MySQL的root只允许本地登录,远程用独立账号,权限按库划分。
- 改默认端口:别用3306默认端口,找个高位端口比如
23306,能挡掉绝大多数的自动扫描。 - 防火墙按IP白名单放行:只把你办公网的IP加入白名单,而不是对全世界开放。
- 加密传输:MySQL启用SSL,SQL Server强制加密连接,抓包能看到明文密码的教训太多了。
- 定期换密码:密码复杂度够不够档,不是你说了算,是暴力破解工具说了算。
大家常问的连接问题
为什么我用localhost能连,用服务器IP就连不上?
local>ost走的是socket或Unix域套接字,不走网络协议栈,数据库的账号授权表里通常默认允许localhost,换成IP时,一是要确保服务器监听的地址包含该IP,二是账号授权里有对应IP的权限,三是有没有跨平台防火墙拦截,逐个排查这三项即可。
sql连接数据库服务器失败,提示“已成功与服务器建立连接,但在登录过程中发生错误”是什么原因?
这是SQL Server很典型的提示,大部分情况是账号的默认数据库被改成了用户无权限访问的库,输入法全角字符导致密码错误,或者时区语言配置差异,用管理员账号登录SQL Server,把该用户的默认数据库改回master或dbname,通常就解决了,Oracle连接串里如果用户名和密码写反,也会有类似提示,仔细检查号左右的顺序。
连接远程数据库时,密码明文写在命令行里安全吗?
不安全,命令行会记录在shell历史文件(如~/.bash_history)中,进程列表里也可能短暂暴露,建议使用配置文件或环境变量:MySQL用--defaults-extra-file参数,SQL Server用-E强制Windows身份认证,Oracle用/nolog配合登录,管理员查看进程列表时,明文密码会出现在命令参数中,这是实际发生过的泄密通道。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/772258.html


