尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL 5.5 安装配置实战:Windows/Linux 环境搭建与避坑指南

MySQL 5.5 安装配置实战:Windows/Linux 环境搭建与避坑指南 最近总有做老项目的朋友来问我MySQL 5.5 到底还能不能装怎么装才不踩坑。这版本虽然官方早就停止维护了但很多企业内部系统、机房里的旧服务器、某些第三方软件配套的数据库仍然锁死在 5.5 上。我在实际部署中也折腾过不少次踩过配置文件的坑、也遇过客户端乱码的烦心事。这篇文章就把我常用的 MySQL 5.5 安装配置流程完整梳理一遍覆盖 Windows 和 Linux 两种常见环境也会把我踩过的坑一起列出来。不管你是第一次装数据库的新手还是需要给旧项目搭环境的老手按照这里的步骤走基本能一路通畅。1. 安装前必须搞清楚的几件事1.1 为什么现在还有人装 5.5MySQL 5.5 是 2010 年发布的版本最后一个 5.5.62 补丁也在 2018 年画上了句号。按理说这种老掉牙的版本早该退役了但现实是很多银行、政务、教育类项目还在用原因无非这么几个一是老系统上线时用的就是 5.5数据库一换整个应用都要跟着改成本太高二是某些商业软件只认证过 5.5版本高了反而得不到官方支持三是历史数据迁移太麻烦几千万行数据的表从 5.5 迁到 8.0 不是改几条 SQL 就能搞定的。所以如果你是因为“项目必须跑在 5.5 上”才来搜教程那这篇文章就是写给你的。如果你是刚学数据库、想从零开始搭环境我反而建议装新版本比如 5.7 或 8.0毕竟老版本在性能和安全性上都落后太多了。装 5.5 唯一的理由应该是“业务需要”而不是“只会装这个”。1.2 安装包怎么选官方归档、MSI 还是 ZIP现在在 MySQL 官网首页已经找不到 5.5 的下载入口了必须去官方归档页面。地址是 downloads.mysql.com/archives/community进去之后 Product Version 选择 5.5.62OS 选择 Windows 或 Linux就能看到对应的安装包。Windows 下有 MSI 和 ZIP 两种格式。MSI 是图形化安装向导全程点下一步适合新手但安装完成后会自动注册成 Windows 服务默认参数比较“官方”后面还是要手动改配置文件。ZIP 是免安装版解压就能用配置全靠自己写 my.ini看起来麻烦但胜在干净、可控想挪目录随时打包就走。我在生产环境里更常用 ZIP 版因为可以精确控制每个参数也方便批量拷贝到多个机器。下载时还有一个很要紧的细节看清楚 x86 还是 x64。现在大多数机器都是 64 位但有些老服务器还是 32 位系统装错位数会导致服务起不来。还有个容易被忽略的点是在 Windows 10 及以上版本解压 5.5 后如果提示缺少 MSVCR100.dll 之类的动态库需要先装 Visual C 2010 运行库这个在微软官网能直接下属于老版本 MySQL 在新时代系统上的兼容性通病。2. Windows 下安装配置实操2.1 ZIP 免安装版完整步骤我用的版本是 mysql-5.5.62-winx64.zip下面以它为例完整走一遍 ZIP 版安装流程。第一步解压。把 zip 包解压到一个路径里我习惯放在 D:\mysql-5.5.62-winx64这个路径后面会经常用到。注意解压目录不要带中文也不要带空格否则后面 ini 配置和命令行操作都容易出奇怪问题。如果你只打算把它放在 C 盘根目录下比如 C:\mysql也完全可以。第二步创建 my.ini。在解压目录下新建一个文本文件重命名为 my.ini注意扩展名不是 txt。这个文件是 MySQL 的核心配置内容可以直接照抄下面这段然后根据自己机器的实际情况调整路径[client] default-character-setutf8 port3306 [mysqld] basedirD:/mysql-5.5.62-winx64 datadirD:/mysql-5.5.62-winx64/data port3306 character-set-serverutf8 collation-serverutf8_general_ci default-storage-engineINNODB max_connections500 innodb_buffer_pool_size512M innodb_file_per_table1 skip-name-resolve这里面的 basedir 是 MySQL 安装目录datadir 是数据目录。需要注意路径分隔符用正斜杠 / 或者双反斜杠 \不要只写一个反斜杠否则会被解析成转义字符这是一个很容易踩的坑。第三步初始化数据目录。5.5 的 ZIP 包有个特点跟 5.7 之后的版本不太一样解压后不一定自带 data 目录。如果启动服务时报找不到数据目录就在解压根目录下手动建一个空的 data 文件夹。系统库和权限表的初始化在首次启动 mysqld 时会自动完成。这一步很多人卡住我后面在常见问题里再详细说。第四步注册 Windows 服务。以管理员身份打开命令提示符切换到 bin 目录cd D:\mysql-5.5.62-winx64\bin mysqld --install MySQL55 --defaults-fileD:\mysql-5.5.62-winx64\my.ini执行后提示 Service successfully installed 就说明注册成功了。MySQL55 是服务名可以改成你喜欢的名字比如 MySQL5.5。注册完成后在服务管理器里就能看到这个服务。第五步启动服务net start MySQL55没有报错的话MySQL 就已经在跑了。然后用命令行验证一下mysql -uroot5.5 刚装好时 root 默认密码是空的能直接进来就说明安装成功。2.2 MSI 图形化安装与路径规划如果你觉得敲命令太麻烦MSI 图形化安装向导更适合你。双击安装包后一路 Next到 Installation Type 那一步建议选 Custom自定义安装路径不要用默认的 C:\Program Files\MySQL因为带空格的路径在后续命令行操作时会很难受而且 MySQL 5.5 对带空格的路径处理并不完美。选好路径后默认勾选了 Register as a Windows Service服务名默认是 MySQL可以改成 MySQL55避免和本机其他 MySQL 版本冲突。安装完成前最后一步会让你设置 root 密码可以直接设置也可以留空后面再用命令行改。这里我的建议是留空等配置文件全部调整好之后再统一设密码省得装完还要因为编码、权限问题反复重启服务。MSI 安装完成后安装目录下通常也会自动生成一个 my.ini位置可能在安装目录下也可能在 C:\ProgramData\MySQL\MySQL Server 5.5\。但要注意Windows 下 MySQL 读取配置文件的优先级是先读 C:\Windows\my.ini再读 C:\my.ini最后才读安装目录下的 my.ini。所以如果你发现改了配置文件没生效先检查一下 C 盘根目录或者 Windows 目录下是不是存在旧的配置文件把它覆盖了。这是 MSI 安装方式里非常容易遇到的一个坑。2.3 安装后的基本验证装完不要急着做别的先把这几步验证做完确认环境是健康的第一看版本号。命令行执行 mysql --version如果输出 mysql Ver 14.14 Distrib 5.5.62说明程序正常。第二看服务状态。services.msc 打开服务管理器找 MySQL55状态应该是“正在运行”。如果启动类型没设成“自动”右键改成自动否则服务器重启后 MySQL 起不来。第三看基础变量。登录 MySQL 后执行SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE version;第一行命令会显示 character_set_server 等一批变量重点看 character_set_server 是不是 utf8不是的话说明 my.ini 没读进去。第二行确认版本号是 5.5.62 而不是其他。第四测试建库建表。执行 create database testdb default charset utf8; use testdb; create table t1(id int); 能正常返回就说明存储引擎和建表逻辑没问题。3. 核心配置文件 my.ini 详解3.1 字符集统一不改必乱码很多人装完 MySQL 5.5 后发现中文插入进去变成问号或者查询出来的中文是乱码99% 的原因就是字符集没统一。MySQL 5.5 默认字符集是 latin1这个字符集压根不含中文字符所以必须手动改成 utf8 或 utf8mb4。先看一下我推荐的配置[client] default-character-setutf8 [mysqld] character-set-serverutf8 collation-serverutf8_general_ci这里有三个地方要一致客户端字符集、连接层字符集、服务端字符集。只改 [mysqld] 的 character-set-server不改 [client] 的 default-character-set那么命令行工具连上去时还是会用本地的默认字符集照样乱码。如果用 Navicat 或程序连接连接字符串里也要显式指定 characterEncodingutf8三层全对齐了才不会出问题。关于 utf8 和 utf8mb4 的选择5.5 从 5.5.3 开始支持 utf8mb4但支持力度远不如 5.7 和 8.0索引长度限制也更严格。如果只是存储普通中文用 utf8 就够了。如果你非要支持 emoji 表情可以尝试 utf8mb4但要注意索引字段如果是 varchar(255) 这种长度可能建索引会报错需要改成 varchar(191) 或更短。我的建议是5.5 环境里能用 utf8 就尽量用 utf8别给自己找麻烦。3.2 InnoDB 缓冲池与常用连接参数5.5 最大的一个变化就是 InnoDB 取代 MyISAM 成为了默认存储引擎。所以 InnoDB 的参数配置直接决定数据库性能。最核心的参数是 innodb_buffer_pool_size它决定了 InnoDB 缓存数据和索引的内存大小。设置原则很简单如果是独立数据库服务器物理内存的 50%-70% 都可以分给它如果机器上还跑了其他应用比如 Tomcat、Nginx那就控制在 30%-40%。我见过一台 8G 内存的服务器装 MySQL 5.5innodb_buffer_pool_size 只配了 128M结果查询稍大一点就慢得要命后来改成 3G同样的 SQL 快了好几倍。这个参数在 5.5 里改完必须重启服务才能生效没有热更新一说。另外几个常用参数我整理成一个表格参数名建议值作用与说明max_connections500-1000最大连接数默认151应用并发高就要调大wait_timeout60-120非交互连接空闲超时单位秒太长浪费连接数interactive_timeout28800交互连接空闲超时单位秒命令行客户端可长些innodb_file_per_table1每张表独立表空间默认就是开显式写上保险max_allowed_packet32M允许的最大数据包导入大 SQL 文件时报错就调它query_cache_size32M查询缓存5.5 时代还有点用后续版本已废弃wait_timeout 和 max_connections 是一对关联参数。如果你发现日志里报 too many connections先看是不是连接数设置太小再看是不是 wait_timeout 设太长导致一堆死连接占着名额。我习惯把 wait_timeout 设为 60 秒让空闲连接尽快释放可以有效缓解连接数不够的问题。3.3 安全与扩展参数建议除了基础性能参数还有几个偏安全和运维向的参数值得关注。skip-name-resolve 这个参数建议开启作用是跳过反向 DNS 解析。MySQL 每接受一个外部连接默认都要把客户端 IP 反解成主机名如果 DNS 解析慢连接就会很慢。加了 skip-name-resolve 之后连接速度快很多但要注意授权表里就不能再用主机名了必须用 IP。比如 rootlocalhost 不受影响但 rootmyhost.com 这种写法一定要改成 root192.168.1.10。bind-address 默认情况下 MySQL 监听所有网卡包括公网网卡。如果数据库只在内网使用建议在 my.ini 里显式写 bind-address127.0.0.1 或者内网 IP这样公网根本连不上能挡住一大波扫描攻击。MySQL 5.5 已经没有新补丁了老版本漏洞多该锁的端口一定要锁。还有一个值得提的参数是 lower_case_table_names。Windows 下的 MySQL 默认表名不区分大小写而 Linux 下默认区分这在迁移的时候非常坑。如果是从 Windows 迁到 Linux建议在 Linux 的 my.cnf 里加上 lower_case_table_names1让表名统一按小写处理否则之前用大写表名的 SQL 全都会报错。4. 服务管理、远程访问与账号权限4.1 服务注册、启停与开机自启Windows 下注册服务我前面讲过 mysqld --install 的方式。如果你想彻底删掉注册过的服务用这一句sc delete MySQL55或者mysqld --remove MySQL55两者效果差不多都要求以管理员身份运行。我遇到过一种情况服务注册成功但启动时报 1067 错误怎么都起不来后来把服务删掉重新执行 mysqld --install 才解决。这种玄学问题通常是注册信息写坏了重建一次就好。日常启停命令行方式最省事net start MySQL55 net stop MySQL55想查看服务当前状态用 sc query MySQL55。注意 net start 的时候如果提示“服务名无效”多半是服务名打错了如果提示“服务已经启动”说明之前注册过同名服务直接用 net start 即可。开机自启的问题注册服务的时候默认就是自动启动不用额外设置。如果不想开机启动可以在服务管理器的启动类型里改成“手动”或者干脆不注册成服务直接写一个批处理文件开机时执行 mysqld --defaults-fileD:\mysql-5.5.62-winx64\my.ini --console 手动拉起适合某些特殊环境。4.2 root 密码与常见权限操作刚装完的 MySQL 5.5root 密码通常是空的第一步就该设置密码。5.5 的密码设置方式和 8.0 不一样8.0 用 ALTER USER5.5 用 SET PASSWORD语法如下SET PASSWORD FOR rootlocalhost PASSWORD(YourPassword123); FLUSH PRIVILEGES;如果你是通过 mysql -uroot 登录也可以简写成SET PASSWORD PASSWORD(YourPassword123);注意 5.5 的 mysql.user 表里存密码的字段叫 Password用的加密函数是 PASSWORD()。5.7 开始字段改成了 authentication_string8.0 的加密方式也完全不同。所以网上的教程一定要看清版本把 5.7 的 UPDATE user SET authentication_string... 语句拿到 5.5 上执行直接报错 no such column。创建普通账号也很常用比如创建一个只读账号给报表系统用GRANT SELECT ON mydb.* TO report192.168.1.% IDENTIFIED BY report_pass;这里的 192.168.1.% 表示只允许这个网段的 IP 访问。如果你不确定应用服务器的 IP可以先给 %所有 IP但要评估风险用完尽早改成具体的 IP。4.3 远程访问配置与防火墙放行MySQL 默认监听 3306 端口但你要让其他机器连上来光改配置还不够Windows 防火墙默认会拦掉 3306。最直接的办法是给防火墙加一条入站规则允许 TCP 3306 端口。命令行方式netsh advfirewall firewall add rule nameMySQL 3306 dirin actionallow protocolTCP localport3306加完之后用 netstat -ano | findstr 3306 确认 MySQL 正在监听监听地址如果是 0.0.0.0:3306那么理论上其他机器就能连上了。远程能不能通最直观的测试是在另一台机器上用 telnet 测端口telnet 192.168.1.100 3306如果 telnet 黑屏后没报错说明端口通。如果报连接失败先查防火墙再查 MySQL 服务状态。端口通之后再用 mysql 命令测试账号权限mysql -h 192.168.1.100 -ureport -p报 ERROR 1130 (HY000): Host ... is not allowed to connect说明授权表没配好回去检查 GRANT 语句里的 IP 范围。报 ERROR 1045 (28000): Access denied说明密码或账号不对。5. Linux 下安装配置要点5.1 RPM 包方式安装Linux 下装 5.5最省事的方式是下载官方 RPM 包。5.5 时代的包名和 5.6 之后不一样不是 mysql-community-server而是直接叫 MySQL-server-5.5.62-1.el6.x86_64.rpm配套的还有 MySQL-client、MySQL-devel、MySQL-shared 等。在一台 CentOS 6 或兼容系统上下载这几个包后一条命令装完rpm -ivh MySQL-server-5.5.62-1.el6.x86_64.rpm MySQL-client-5.5.62-1.el6.x86_64.rpm MySQL-devel-5.5.62-1.el6.x86_64.rpm装完之后数据目录默认在 /var/lib/mysql配置文件在 /etc/my.cnf启动命令有专门的 service 脚本service mysql start首次启动时MySQL 会自动初始化数据目录并且会在日志 /root/.mysql_secret 或终端输出里提示 root 初始密码。5.5 有些版本初始密码是空的有些会生成随机密码如果登录不进去看 /root/.mysql_secret 这个文件。装完跑一遍安全初始化脚本mysql_secure_installation它会引导你设置 root 密码、删除匿名用户、禁止 root 远程登录、删除 test 库。生产环境建议全部点 Y开发环境至少要把 root 密码设了。RPM 方式有一个要注意的问题5.5 的 RPM 包对操作系统版本很敏感el6 的包装到 CentOS 7 上可能缺依赖或 glibc 版本不兼容。CentOS 7 用户如果想强行装有可能会遇到 libaio.so.1 缺失的报错先执行 yum install libaio 补上依赖再试。如果还是不行我建议直接用源码编译或者 Docker别在依赖上耗太久。5.2 源码编译和 Docker 快速体验源码编译安装 5.5 比较麻烦因为 5.5 用的编译工具链是 autotools 体系不是 5.6 之后的 CMake步骤又多又容易错。除非你的系统确实找不到任何现成的包否则我不建议手动编译。如果真到了那一步大致流程是下载源码包依次执行 configure、make、make install编译前要装好 gcc、g、ncurses-devel、bison 等依赖整个编译过程在老旧机器上可能要大半个小时这只是纯编译时间。更现代化也更省心的方式是 Docker。Docker Hub 上保留了 mysql:5.5 镜像一条命令就能拉起来docker run --name mysql55 \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -v /data/mysql55:/var/lib/mysql \ -d mysql:5.5这种方式拿来验证老项目兼容性非常方便一分钟搞定环境。但它有个问题官方 mysql:5.5 镜像里配置文件只提供了最简设置字符集默认没改所以启动后还是要进容器里改 /etc/mysql/my.cnf 加上字符集配置或者挂载自定义的配置文件进去。另外 Docker 容器用的是虚拟化网络对性能有轻微损耗高并发生产库不建议这么跑但用来开发联调完全够用。6. 常见问题排查与避坑指南6.1 服务起不来、1067 错误与密码重置Windows 下 MySQL 5.5 最常见的故障就是服务起不来错误日志里报 1067。1058 是服务没注册好1067 是服务启动过程中立即退出。1067 的原因十有八九是 my.ini 写错了最常见的有三种路径不对、路径分隔符写成单反斜杠、ini 文件编码不对。这里特别说下编码问题。MySQL 5.5 在 Windows 下读取 my.ini 时对 UTF-8 带 BOM 的文件支持得不好可能直接不认导致启动失败。解决办法是用记事本打开 my.ini另存为时把编码选成 ANSI保存后再启动服务。这是很多老手都会踩的坑我刚开始也卡了半天。如果排查完配置文件还是起不来看日志最直接。日志文件通常在 datadir 目录下名字类似主机名.err打开看最后几十行MySQL 会明明白白写出拒绝启动的原因。比如 [ERROR] Cant find messagefile说明路径没找对比如 [ERROR] Unknown variable说明参数名写错了。密码忘了也是高频问题尤其是一台尘封已久的测试服务器没人记得密码。重置思路是跳过权限表启动第一步停止 MySQL 服务 第二步在 my.ini 的 [mysqld] 段加一行 skip-grant-tables 第三步启动服务 第四步用 mysql -uroot 免密登录 第五步执行 UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot; FLUSH PRIVILEGES; 第六步删掉 skip-grant-tables 这一行重启服务。这个过程本身不难但有个必须强调的点skip-grant-tables 意味着任何本地用户都可以无密码登录你的数据库操作期间千万不要对外开放端口操作完务必立刻重启去掉这个参数。6.2 客户端连接不上与乱码问题命令行登录时报 Access denied for user rootlocalhost先确认密码是否正确注意 5.5 默认端口 3306可以用 -P3306 显式指定。如果密码确认无误但还能 Access denied有可能是之前的空密码还没改或者授权表被改乱了直接走上面 skip-grant-tables 的流程把密码重置一遍。报 Cant connect to MySQL server on 127.0.0.1 (10061)说明服务端没在监听。先 net start MySQL55 确认服务状态再 netstat -ano | findstr 3306 看端口。如果服务在跑但没监听 330699% 是 my.ini 里的 port 配置没生效或者配置文件被读成了其他路径。乱码问题分两头说。已经存进数据库的数据乱码说明当时连接用的字符集就不是 utf8历史数据很难救一般只能重新导入。新写入的数据乱码多发生在 Navicat 连接时没选对字符集。Navicat 连接设置里有个“编码”选项要选 UTF-8不要选“自动”自动在某些老 OC 驱动下会解析成 GBK。另外程序连接串里要带 characterEncodingutf8 参数Java 的 JDBC 更要注意MySQL 5.5 的驱动版本不要选太新mysql-connector-java 5.1.x 系列与 5.5 最匹配。6.3 后续迁移与升级的简单建议如果只是临时维护老系统5.5 装好能用就先别折腾升级。如果要长期使用甚至打算往新版本迁移有几个事情可以提前准备。数据备份是最基本的5.5 时代最常用的备份工具是 mysqldumpmysqldump -uroot -p --all-databases --single-transaction --routines --triggers all.sql--single-transaction 保证导出时 InnoDB 表的数据一致性--routines 和 --triggers 把存储过程和触发器也带出来。恢复时执行 mysql -uroot -p all.sql 即可。这个备份文件在迁移到 5.7 或 8.0 之前建议先用新版本临时实例导入测试一遍因为有些老语法在新版本里已经废弃了。如果迁移到 8.0最坑的是密码加密方式变了老客户端像 Navicat 11、老版本 JDBC 驱动都连不上需要在 MySQL 8.0 里给账号指定 mysql_native_password。如果迁移到 5.7则要注意 sql_mode 的差异5.7 默认启用了 ONLY_FULL_GROUP_BY很多在 5.5 上攒了多年的老 SQL 会因为这个报错迁移后可能要逐条调 SQL。根据我自己的实际经验MySQL 5.5 这套安装配置流程真正花时间的从来不是“下一步下一步”的过程而是装完之后对 my.ini 的打磨以及对各种老系统兼容问题的排查。如果你手头也是 5.5 的老环境建议把配置文件的每一行都搞清楚再动手改完一次只改一两个参数启动后马上观察日志这样即使出问题也知道是哪个参数引起的排查效率会高很多。
返回列表