☰
数仓搭建必备:MySQL安装与Navicat远程连接实操指南
2026/10/13 7:47:16 网站建设 项目流程

记得去年在搞数仓项目的时候,最闹心的不是Hive、Spark那堆分布式组件,反而是开局第一步——装MySQL。当时我跟着一套数仓实战课程学,视频里老师十分钟就装完了,轮到自己手上,不是权限坑就是防火墙坑,远程连不上急得挠头。后来踩得多了才摸清套路,其实安装MySQL和用Navicat连远程库这件事,本身一点也不难,难的是一堆藏在细节里的前置认知。这篇笔记就把我当时记录的内容重新整理一遍,从“为什么数仓要依赖MySQL”讲起,到具体的安装步骤、远程连接配置,再到常见的故障排查,尽量让你少走弯路。

这篇文章适合刚接触数仓搭建的人,尤其是第一次在Linux服务器上装MySQL、然后用Windows上的Navicat去连库的朋友。你不需要有很深的DBA基础,只要会敲基本的Linux命令、能看懂简单的SQL就行。读完之后,你应该能独立完成一套干净的MySQL部署,并且顺利把它接到可视化工具上。

1. 数仓搭建中MySQL的角色与安装前的思路

1.1 为什么数仓的元数据要放在MySQL里

很多人一开始不明白,数仓体系里Hive、Hadoop都是大块头,为什么MySQL这种“小库”反而成了必装项。其实在典型的离线数仓架构里,MySQL主要承担两类职责。

第一类是作为Hive的元数据库。Hive本身的表结构、分区信息、字段注释等元数据,默认存储在自带的Derby里,但Derby只支持单会话,一旦你同时开多个终端操作Hive就会报错。所以生产环境几乎都会把Hive的元数据迁移到MySQL中,让Metastore服务通过JDBC读写MySQL。这样多个客户端并发查表、写表才不会互相打架。

第二类是作为调度平台或数据管理平台的业务库。比如你在用某套调度系统管理数仓任务时,任务流定义、调度时间、运行记录这些信息都需要落库。MySQL因为轻量、稳定、运维成本低,成了这类场景的首选。还有数据质量管理、指标管理系统,也都喜欢用MySQL存配置信息。

所以你在学习数仓搭建时,安装MySQL不是单纯的“装一个数据库”,而是在为整个上层体系打地基。地基没打牢,后面Hive跑不起来,调度平台也没法初始化表结构,课程进度直接卡死。

1.2 环境准备与版本选型

我当时的实验环境是三台Linux服务器,CentOS 7.9,内存各8G,硬盘50G。这套配置跑数仓的各个组件刚好够用。MySQL就装在其中的一台机器上,这台机器同时也承担Hive Metastore的访问压力。

版本选择是个值得说两句的事情。课程里用的是MySQL 5.7,我一开始图新鲜装了8.0,结果跟Hive的驱动兼容性出了问题,后来老老实实换回5.7。这里给个明确建议:如果你是为了跟课做数仓项目,就用课程指定的版本,不要自己乱升级。因为Hive的mysql-connector-java版本对MySQL服务端版本有依赖,5.7和8.0的认证方式不一样,8.0默认的caching_sha2_password插件在旧的JDBC驱动下会报“Authentication plugin”错误,折腾起来非常费时间。

如果你是自己做新项目,没有兼容性包袱,那可以装8.0,性能和安全上更强。但就数仓教学场景而言,5.7依然是稳妥选择。另外,操作系统方面,CentOS 7自带的软件源里没有MySQL,默认是MariaDB,所以不能用yum直接装MySQL,需要先添加MySQL官方源或者直接下载rpm包。

1.3 安装包的获取与校验

安装MySQL主要有两种方式:一种是下载官方yum源,然后用yum安装;另一种是直接下载对应版本的rpm包,用rpm或yum本地安装。我推荐后者,因为yum源方式有时候会因为网络原因卡在“Downloading packages”很久,而且源地址在国外,速度不稳定。直接下载rpm包到本地再装,整个过程可以掌控,出了问题也好排查。

我当时用的是MySQL 5.7.38的rpm包,包含以下几个文件:

  • mysql-community-server-5.7.38-1.el7.x86_64.rpm
  • mysql-community-client-5.7.38-1.el7.x86_64.rpm
  • mysql-community-common-5.7.38-1.el7.x86_64.rpm
  • mysql-community-libs-5.7.38-1.el7.x86_64.rpm

这几个包的顺序不能乱:common → libs → client → server。libs里面包含客户端连接时需要的动态库,server依赖client,client依赖libs,libs依赖common。用rpm命令逐个安装时会自动检查依赖,如果顺序反了会直接报错。

下载完成后强烈建议做一次md5校验,官方页面提供了每个文件的md5值。别嫌麻烦,我身边真有人下到过被篡改的安装包,导致装完之后MySQL行为诡异,最后重装了事。校验命令很简单:

md5sum mysql-community-server-5.7.38-1.el7.x86_64.rpm

对比一下输出的md5值和官网列出的值,一致再继续。

2. MySQL安装的完整实操

2.1 卸载旧版本与依赖清理

这一步很多人会跳过,导致后面各种莫名冲突。新装的服务器一般没有MySQL,但CentOS会自带MariaDB-libs。MariaDB和MySQL的文件路径、服务名有重叠,不卸载的话,装完MySQL可能启动失败,或者mysql命令指向了MariaDB的客户端。

先查一下当前系统里有没有装相关包:

rpm -qa | grep mysql rpm -qa | grep mariadb

如果有输出,比如mariadb-libs-5.5.68-1.el7.x86_64,那就先卸掉:

yum remove mariadb-libs -y

卸载完之后,再看看/etc/my.cnf、/var/lib/mysql这些目录是否残留。如果是全新机器,一般是没有的。如果有残留,建议先备份再删除,避免数据丢失。

注意:卸载MariaDB-libs会影响依赖它的软件包,比如PostgreSQL的某些驱动。如果你机器上还有其他数据库相关的组件,建议用yum remove而不是rpm -e,yum会帮你判断哪些包会被一起移除,让你有个确认的过程。

2.2 安装MySQL Server

把四个rpm包放到同一个目录,然后按顺序安装。也可以用一行命令直接装所有包,让yum自动处理依赖顺序:

yum install -y mysql-community-*.rpm

这个命令会把匹配到的所有rpm包一起装,yum会自己解析依赖关系。我测试过,这种方式比手动一个个rpm -ivh省心,而且不会因为顺序问题报错。

安装完成后,验证一下版本:

mysql --version

如果输出类似mysql Ver 14.14 Distrib 5.7.38,说明客户端工具已经就位。服务端是否安装完整,可以通过rpm -qa | grep mysql看到所有相关包。

这里还有一个细节:MySQL 5.7安装后,默认的数据目录是/var/lib/mysql,日志在/var/log/mysqld.log,配置文件在/etc/my.cnf。知道这些路径很重要,后面出问题排查的时候都靠它们。

2.3 初始化与启动服务

MySQL 5.7在首次启动时会自动初始化数据目录,并生成一个临时root密码。这个初始化过程不需要手动执行mysql_install_db,除非你自定义了数据目录。直接启动服务即可:

systemctl start mysqld systemctl enable mysqld

启动后,查看临时密码:

grep 'temporary password' /var/log/mysqld.log

输出会类似这样:

[Note] A temporary password is generated for root@localhost: xxxxxxxx

那个xxxxxxxx就是临时密码。注意,从启动到生成密码之间可能有一两秒延迟,如果你立刻去grep发现没有内容,等两秒再试。

拿到临时密码后,用它登录MySQL:

mysql -uroot -p'xxxxxxxx'

登录成功后,你会看到mysql命令行提示符。这里先不要做任何复杂操作,下一步就是改密码,因为临时密码不能执行普通查询之外的写操作。

2.4 安全配置与密码策略

修改root密码的命令是:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

新密码必须满足MySQL的默认密码策略,至少8位,包含大小写字母、数字和特殊字符。如果设置得过于简单,会出现“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements”。

这个策略是validate_password插件控制的。如果你确实想用简单密码开发测试,可以临时调整策略级别:

SET GLOBAL validate_password_policy = LOW; SET GLOBAL validate_password_length = 6;

不过我不建议在正式环境这么做。如果是自己学习用的虚拟机,倒无所谓。改完密码后,顺手把一些高风险项关掉。比如删除匿名用户,默认安装没有匿名用户,但检查一下总没坏处:

SELECT user, host FROM mysql.user;

看到root@localhost就足够了,如果有空用户名的记录,执行DROP USER ''@'localhost';。

还有一件事,就是禁止root远程登录。虽然我们后面要配置远程访问,但那是给专门创建的用户用的,不是把root开放出去。root只保留本机登录,这是安全底线。

3. 配置远程访问与Navicat连接

3.1 创建远程连接用户

MySQL默认只允许root从localhost连接,其他IP一律拒绝。为了能让Windows上的Navicat连接,我们需要创建一个新用户,并授权给指定IP或IP段。

登录MySQL后执行:

CREATE USER 'hive'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

这里的hive只是示例用户名,你可以根据实际用途取。%表示允许从任意IP连接,如果你只想让某个固定IP连,比如公司内网地址192.168.1.100,那就写'hive'@'192.168.1.100',更安全一点。

授权语句里*.*代表所有库的所有表。如果这个用户只是给Hive Metastore用,其实只需要它操作metastore库。但很多时候我们会用Navicat做管理操作,给全部权限省事。学习环境无所谓,生产环境务必遵循最小权限原则,给具体的库权限:

GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'%';

FLUSH PRIVILEGES是让权限表的修改立即生效。有时候你改了授权认为已经生效了,其实还需要flush一下。虽然修改mysql.user表会自动刷新,但建议加上,养成习惯。

3.2 防火墙与端口放行

很多新手在Navicat里配置好连接后一直超时,就以为是MySQL配置错了,实际上90%的情况是防火墙拦住了3306端口。我自己的经历,当时在服务器上折腾了半天,最后才发现防火墙没放行。

CentOS 7默认的防火墙是firewalld。查看状态:

systemctl status firewalld

如果状态是active,那就把3306端口加进去:

firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload

--permanent表示永久生效,reload让配置立即加载。查看是否已经放行:

firewall-cmd --list-ports

除了防火墙,还有一层可能是云服务商的安全组。如果你用的是云服务器,需要登录云控制台,在网络安全组里添加入方向规则,允许TCP 3306端口。这一层容易忽略,因为本机防火墙开了,但云平台的规则没开,一样连不上。

如果你用的是虚拟机,而且网络环境是NAT模式,还需要确认宿主机和虚拟机之间能互通。最简单的测试方法是在你的Windows命令行里ping一下MySQL服务器的IP,能通再谈端口。

3.3 Navicat连接配置与测试

Navicat是个老牌的数据库管理工具,我用的是Navicat for MySQL版本,界面基本上没什么大变化。打开Navicat,点击“连接”按钮,弹出连接配置窗口。需要填的信息有:

  • 连接名:随便写,比如“数仓测试库”
  • 主机:填MySQL服务器的IP地址,比如192.168.1.88
  • 端口:默认3306,如果你改了my.cnf里的port,这里也要跟着改
  • 用户名:刚才创建的hive
  • 密码:对应的密码

填完之后,点击“测试连接”。看到“连接成功”的提示,就说明一切正常。如果失败,错误信息会在下面显示,根据提示去排查。

我习惯在测试成功后,顺手把连接保存一下。然后展开连接,看是否能看到数据库列表。如果能看到information_schema、mysql、performance_schema等系统库,就表示权限没问题。

3.4 连接串与驱动说明

在项目里使用MySQL不止Navicat这一种方式。比如Hive的Metastore配置,需要填一个JDBC连接串:

jdbc:mysql://192.168.1.88:3306/metastore?useSSL=false&serverTimezone=Asia/Shanghai

其中metastore是你在MySQL里为Hive创建的数据库,useSSL=false是因为本地内网环境不需要加密连接,serverTimezone要指定时区,否则驱动会报错。

对应地,你还需要把mysql-connector-java的jar包放到Hive的lib目录下。Hive 3.x版本推荐用5.1.49或8.0.23等兼容版本,具体看Hive版本。我当时用的是mysql-connector-java-5.1.49.jar,没有出过问题。

Navicat本身已经内置了MySQL驱动,不需要额外配置。但如果你是做Java开发,用Spring Boot连MySQL,要注意驱动版本和数据库版本对应关系。5.7的库用8.x的驱动可以连,但8.0的库用5.1.x的驱动就会碰壁。

4. 常见问题与排查实录

4.1 Access denied for user 'hive'@'localhost'

这个错误的完整信息是Access denied for user 'hive'@'localhost' (using password: YES)。看起来是密码错误,但很多时候密码明明是对的,却还是报这个错。原因是MySQL在匹配用户时,会同时检查用户名和来源主机。当你本地用mysql -uhive -p登录时,MySQL看到连接来源是localhost,它就去查找'hive'@'localhost'这条记录,如果没有,就拒绝。而你创建的用户是'hive'@'%',虽然%也可以匹配localhost,但在某些版本里local的优先级更高,导致匹配失败。

解决方法:要么用-h 服务器IP来指定连接来源,要么再创建一个'hive'@'localhost'用户。不过我们远程场景一般只需要保留%,本地管理尽量用root,所以这种报错多发生在测试时。如果遇到,先检查一下mysql.user表里的用户记录:

SELECT user, host FROM mysql.user WHERE user='hive';

看到只有'hive'@'%',那就不要在本机用mysql -uhive的方式登录,直接用Navicat远程连。

4.2 Navicat连接报10060错误

10060是“连接超时”,意味着数据包发出去了,但一直没收到回应。这种情况基本不是MySQL的授权问题,而是网络路径不通。排查步骤按照下面这个顺序来:

  1. 先用ping 服务器IP确认主机能通。
  2. 再用telnet 服务器IP 3306确认端口能通。如果telnet提示“无法打开到主机的连接”,说明端口被防火墙拦截。
  3. 检查firewalld是否放行3306。
  4. 如果是云服务器,检查安全组规则。
  5. 最后再看MySQL的bind_address配置。如果my.cnf里设置了bind-address=127.0.0.1,那么MySQL只会监听本机回路地址,外部请求直接进不来。需要改成bind-address=0.0.0.0或者注释掉这行。

我的经历是,有一次忘了云服务器安全组,本机防火墙已经放行了,telnet还是不通,最后在云控制台加了一条规则瞬间解决。所以排查的时候别只盯着服务器本身,云平台那层也得看。

4.3 中文乱码问题

Navicat连上MySQL后,查询数据表发现中文显示为乱码或者问号,一般有两种情况。一种是在连接配置里没有指定字符集。打开Navicat连接属性,在“高级”或“编码”标签页,把编码强制为utf8mb4。另一种是MySQL服务端默认字符集不是utf8。检查一下:

SHOW VARIABLES LIKE '%character%';

如果看到character_set_server是latin1,那就需要修改配置文件/etc/my.cnf,在[mysqld]下面添加:

character-set-server=utf8mb4 collation-server=utf8mb4_general_ci

然后重启MySQL:

systemctl restart mysqld

注意,改字符集只对新建的库表生效,已经创建的库表需要单独修改。为了根子上不出这个问题,建议在安装完MySQL后、创建业务库之前就把字符集改好。

还有一个隐蔽点:Hive往MySQL写元数据的时候,如果用到了中文注释,而MySQL表字段的字符集不是utf8,那么写入的注释全是乱码。这个问题排查起来挺隐蔽,因为表还能正常建,只是你看不到中文明文。所以一定要在最开始就统一字符集。

4.4 连接数与性能建议

默认情况下,MySQL的最大连接数是151。如果你的数仓系统开发人员比较多,每个人都开着几个连接导致连接数满,新连接会报“Too many connections”错误。查看当前连接数和最大限制:

SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections';

如果确实不够用,可以在my.cnf里把这个值调大,比如500。但这只是治标,更合理的做法是在应用程序里使用连接池,控制空闲连接释放。像Hive Metastore这类服务,本身有连接池配置,不要为了方便随意调大MySQL连接上限,因为MySQL每维护一个连接都要消耗内存,连接越多,内存占用越大。

另外,Navicat这种图形工具,默认会为每个查询打开一个连接,但不会常驻,所以一般不会成为瓶颈。真正需要注意的反而是你的数仓任务调度脚本,如果你用Python或Shell反复短连接数据库,建议用连接池复用,否则压力一大MySQL就报错。

补充一个实操小技巧:安装完成后,建议立刻做一次全库备份脚本。数仓环境的元数据库太重要了,万一误操作删了表,没有备份就得从头建库重新初始化Hive Metastore,那真是灾难级别的返工。

结语与个人经验

现在这套流程我基本已经不需要看笔记就能走下来了。回想当时跟着课程一步步装的时候,最费时间的不是敲命令,而是理解每个配置项的意义。比如为什么要单独建一个远程用户而不是直接用root,为什么防火墙要放行3306,为什么字符集要提前设好。这些层面打通了,后面哪怕遇到没见过的报错,也能顺着思路快速定位。

我个人的习惯是,每次新装完MySQL,会写一个安装记录文档,把用到的命令、配置文件、踩过的坑都记下来。这不是走形式,而是因为不同服务器的环境多少有差异,记录得越详细,下次再装就越顺畅。尤其是远程连接这块,可能出现的坑太多,光靠记忆很容易漏掉。如果你也在学数仓搭建,建议你也试着把每一步操作写成笔记,动手加复盘,比单纯看视频记得牢得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询