在早先21年左右的时候mysql官网就不提供全部的mysql5.x安装包了有一些特殊的场景还是要5.x的mysql例如ranger等因此如果官网上下载不到你需要的可以去国内的镜像中下载。本文由于用的是CentOS7能用的包官网上只提供了glibc依赖但是最高只有2.5的所以从阿里镜像上下载不依赖glibc的官网https://downloads.mysql.com/archives/community/阿里云镜像地址https://mirrors.aliyun.com/mysql/MySQL-5.7/下载包mysql-5.7.36-el7-x86_64.tar.gz下载的包中应当只有mysql本体自身和8.x的无缝接入不一样TAR全包中没有router工具5.x的需要负载均衡那些需要自己额外搭建第一步检查安装环境1、运行如下命令查看是否有自带的mysql#按需停止servicemysql stoprpm-qa|grepmysql如果有使用如下命令删除它后面的–nodeps是强制删除的意思rpm–e 自带的mysqlrpm包--nodeps2、查找mysql遗留文件find/-namemysql删除查找出的mysql目录可能类似如下的文件具体找到什么不一定总之我们需要删除找到的所有文件如果不删除那么有可能安装mysql的时候会发生不生成密码等重要数据的问题/var/lib/mysql /usr/lib/mysql /usr/lib64/mysql /usr/include/mysql同时要注意卸载后mysql的/etc/my.cnf文件不会删除需要进行手工删除rm-rf/etc/my.cnf3、运行如下命令安装或更新已有的环境yum-yinstallautoconf libaio perl numactl删除当前mysql-libs包yum remove mysql-libs如果你不删除它那么很有可能在安装的时候和你安装的版本冲突而导致安装mysql的时候日志输出一堆准备的install然后就结束了就是不进安装阶段第二步将安装包解压tar-zxfmysql-5.7.36-el7-x86_64.tar.gz-C/optcd/optmvmysql-5.7.36-el7-x86_64 mysql57第三步准备运行环境创建数据存储路径cd/opt/mysql57mkdirdata虽然mysql没有像Oracle那样强制非root启动但正式环境一般会准备一个mysql用户来后期操作自己用可以不配置# 创建用户组和用户groupaddmysqluseradd-r-gmysql mysqlchownmysql:mysql-R/opt/mysql57新建/etc/my.cnf文件vi/etc/my.cnf# 添加以下内容[mysqld]#数据库监听的地址bind-address0.0.0.0#端口port3306#操作数据库的用户userroot#你mysql的本体放在哪里了basedir/opt/mysql57#存储数据的路径datadir/opt/mysql57/data#mysql通讯文件存放位置socket/opt/mysql57/data/mysql.sock#日志log-error/opt/mysql57/data/mysql.err#进程文件pid-file/opt/mysql57/data/mysql.pid#字符集character_set_serverutf8 collation-serverutf8_general_ci symbolic-links0explicit_defaults_for_timestamptrue#关闭严格模式这个模式对一些场景有影响sql_modeNO_ENGINE_SUBSTITUTION#允许最大连接数max_connections10000#允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统max_connect_errors10# 创建新表时将使用的默认存储引擎default-storage-engineINNODB[mysql]#设置mysql客户端默认字符集default-character-setutf8# 支持的监听地址bind-address0.0.0.0[client]#设置mysql客户端连接服务端时默认使用的端口和会话文件port3306socket/opt/mysql57/data/mysql.sock第四步执行初始化命令cd/opt/mysql57/bin ./mysqld --defaults-file/etc/my.cnf--basedir/opt/mysql57--datadir/opt/mysql57/data--userroot--initialize命令不报错的前提下进入数据目录查看里面的有资源[rootnode2 mysql57]# cd data/[rootnode2 data]# lltotal110664-rw-r-----.1root root56Jun1917:03 auto.cnf -rw-------.1root root1680Jun1917:03 ca-key.pem -rw-r--r--.1root root1112Jun1917:03 ca.pem -rw-r--r--.1root root1112Jun1917:03 client-cert.pem -rw-------.1root root1676Jun1917:03 client-key.pem -rw-r-----.1root root436Jun1917:03 ib_buffer_pool -rw-r-----.1root root12582912Jun1917:03 ibdata1 -rw-r-----.1root root50331648Jun1917:03 ib_logfile0 -rw-r-----.1root root50331648Jun1917:03 ib_logfile1 drwxr-x---.2root root4096Jun1917:03 mysql -rw-r-----.1root root1002Jun1917:03 mysql.err drwxr-x---.2root root8192Jun1917:03 performance_schema -rw-------.1root root1676Jun1917:03 private_key.pem -rw-r--r--.1root root452Jun1917:03 public_key.pem -rw-r--r--.1root root1112Jun1917:03 server-cert.pem -rw-------.1root root1680Jun1917:03 server-key.pem drwxr-x---.2root root8192Jun1917:03 sys此时初始的默认密码在mysql.err文件中的最后一行[rootnode2 data]# cat mysql.err2025-06-19T09:03:39.887224Z0[Warning]NO_AUTO_CREATE_USERsql mode was not set.2025-06-19T09:03:40.402774Z0[Warning]InnoDB: New log files created,LSN457902025-06-19T09:03:40.471464Z0[Warning]InnoDB: Creating foreign key constraint system tables.2025-06-19T09:03:40.533215Z0[Warning]No existing UUID has been found, so we assume that this is the firsttimethat this server has been started. Generating a new UUID: 4b271a54-4cec-11f0-bf1d-000c29e980e8.2025-06-19T09:03:40.534735Z0[Warning]Gtid table is not ready to be used. Tablemysql.gtid_executedcannot be opened.2025-06-19T09:03:40.741949Z0[Warning]A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.2025-06-19T09:03:40.741962Z0[Warning]A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.2025-06-19T09:03:40.742683Z0[Warning]CA certificate ca.pem is self signed.2025-06-19T09:03:40.767753Z1[Note]A temporary password is generatedforrootlocalhost: mloDcfuKR3L第五步启动将mysql本体中的启动脚本拷贝到linux系统的系统文件夹下面cp/opt/mysql57/support-files/mysql.server /etc/init.d/mysql随后就可以使得linux识别mysql的服务启动命令[rootnode2 data]# service mysql startWarning: mysql.service changed on disk. Runsystemctl daemon-reloadto reload units. Starting MySQL. SUCCESS!让mysql随机器启动chkconfigmysql on#后面关闭随机启动用offchkconfigmysql off第六步配置环境变量并按需使用mysqlvi/etc/profile 追加exportPATH$PATH:/opt/mysql57/binsource/etc/profile使用初始密码登录mysql并修改密码注意第一次连接不要显示的直接-p携带初始密码直接执行 mysql-uroot-p随后在跳出的密码输入界面输入初始密码即可修改初始密码ALTERUSERrootlocalhostIDENTIFIED BY新密码;FLUSH PRIVILEGES;更改连接域use mysql;UPDATE user SEThost%WHEREuserroot;FLUSH PRIVILEGES;顺带提一点由于 CentOS 7 已经很老了如果原地升级到其他发行版要对mysql做一个兼容。尤其是CentOS 7中有一个叫做 systemd-sysv-generator 的后台工具。它会自动扫描 /etc/init.d/ 目录下的脚本并为它们临时生成一个systemd服务单元当你执行 systemctl start mysql 时systemd 没有找到 mysql.service 文件systemd 向兼容层查询发现 /etc/init.d/mysql 存在systemd 会调用 systemd-sysv-generator 将那个古老的SysV脚本包装成一个临时的systemd服务。但在其他新的发行版中需要自己写 service 文件并安装向下兼容软件[Unit]DescriptionMySQL ServerAfternetwork-online.targetWantsnetwork-online.targetAftersyslog.target[Install]WantedBymulti-user.target[Service]UsermysqlGroupmysql# Typeforking 表示这是一个会自己转入后台运行的程序Typeforking# 关键: 修改为你的 mysql.server 脚本的路径ExecStart/opt/mysql57/support-files/mysql.server startExecStop/opt/mysql57/support-files/mysql.server stopExecReload/opt/mysql57/support-files/mysql.server reload# 关键: 修改为你的 PID 文件位置通常在数据目录下PIDFile/opt/mysql57/data/mysqld.pidRestarton-failureRestartPreventExitStatus1PrivateTmpfalse如果你需要配置主从尽量确保主从关系的数据库版本是一致的即使有差别也不要太大而且版本差异如果存在一定要是从库版本比主库版本高。配置主从的方式如下首先关闭要配置主从关系数据库中的主库一定要关闭servicemysql stop先配置主库修改 /etc/my.cnf 配置文件在 [mysqld] 部分加入如下的配置# 主库唯一ID建议用IP最后一段server-id1# 开启二进制日志路径按实际修改需要存在且mysql的管理用户有权限log-bin/var/log/mysql/mysql-bin.log# 推荐ROW模式数据记录最精确binlog_formatROW# 保证完整的行映像记录binlog_row_imageFULL# 每几次事物触发写一次binlog磁盘数据默认就是1可以保证最高数据安全性。sync_binlog1# 自动清理7天前的日志防止磁盘撑爆expire_logs_days7现在启动主库并建立一个专门用来主从的用户# 启动service mysqlstart# 进入mysql后添加用户CREATEUSERrepl%IDENTIFIEDBY必须是一个强密码;GRANTREPLICATIONSLAVEON*.*TOrepl%;FLUSHPRIVILEGES;给主库的所有表加一个全局锁让主库处于不可写入状态随后将所有数据导出为一个 sql文件 因为mysql 的主从是增量同步因此需要手动给从库备份刷数据# 在mysql里执行全局读锁FLUSHTABLESWITHREADLOCK;# 在 系统命令行下执行导出数据mysqldump-uroot-p--all-databases /opt/all_backup.sql查询当前主库的状态你会得到主库现在的 binlog 文件是那个以及数据位置在哪里mysqlSHOW MASTER STATUS;-------------------------------------------------------------------------------|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|-------------------------------------------------------------------------------|mysql-bin.000001|739||||-------------------------------------------------------------------------------此时去配置从库先给从库导入来着主库的 sql 文件mysql-uroot-p/opt/all_backup.sql随后同样service mysql stop关闭从库改配置文件 /etc/my.cnf 追加 [mysqld][mysqld]# 从库唯一ID绝不能和主库一样server-id2# 开启中继日志和主库的 binlog 一样路径要存在并有权限relay_log/var/log/mysql/relay-log-bin# 开启只读防止从库被意外写入。mysql的配置遵循 0假 1真read_only1# 允许同步过来的数据写入自身的binlog中级联复制场景下需要log_slave_updates1现在启动从库执行如下 sql 生效从库功能# 指定主库位置CHANGE MASTERTOMASTER_HOST主库IP地址,MASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORD你的强密码,MASTER_LOG_FILE主库查到的File值,MASTER_LOG_POS主库查到的Position值;# 触发从库功能的启动STARTSLAVE;# 查看从库功能的状态SHOWSLAVESTATUS\G# 状态中看下面这两个信息# 负责拉取主库日志的线程正常Slave_IO_Running: Yes# 负责执行日志的线程正常Slave_SQL_Running: Yes最后回到主库释放全局读锁UNLOCKTABLES;执行完这个命令后主库就恢复正常读写了。你可以试着在主库插入一条测试数据看看从库能不能正常同步过来在 mysql5.7 开始针对主写从读数据库使用场景下写入高发从而导致从库默认的单线程同步效率性能问题mysql 提供了多线程从库同步能力你只需要更改从库的下面两个配置即可[mysqld]slave_parallel_typeLOGICAL_CLOCK slave_parallel_workers8slave_parallel_type需要将其设置为 LOGICAL_CLOCK。这表示从库将基于主库事务的逻辑时钟组提交机制来实现同一库内事务的并行复制slave_parallel_workers用于设置并行执行的工作线程数。该参数默认值为 0即单线程回放你需要将其设置为大于 1 的值例如 8 或 16才能真正开启并行复制或者当你只是某一段时刻要紧急开启同步可以用sql改从节点能力配置并重启功能STOP SLAVE SQL_THREAD;SETGLOBALslave_parallel_typeLOGICAL_CLOCK;SETGLOBALslave_parallel_workers8;STARTSLAVE SQL_THREAD;注意事项主库 Binlog 格式要求要让基于逻辑时钟的并行复制生效主库的 binlog_format 必须设置为 ROW行模式。如果是 MIXED 或 STATEMENT在某些语句下会丢失依赖信息导致并行复制退化为单线程。线程数设置建议slave_parallel_workers 并非越多越好通常建议设置为从库 CPU 核心数的 75% 左右例如 8~16 个设置过多反而会增加线程协调的开销。但是有些地方会会设置服务器 cpu核数 的 2 倍上面这种主从关系叫做单主从只能用来支持主写从度的业务诉求。 Mysql还支持双向主从也就是a、b互为对方的主又互为对方的从在配置上略微有些差别将上面的单主从改为双向主从只需要在现有配置文件的基础上改如下内容A服务器[mysqld]# ID 必须与服务器B不同server-id1# 配置路径开启二进制日志log_bin路径# 推荐ROW格式减少冲突binlog_formatROW# 保证完整的行映像记录binlog_row_imageFULL# 每几次事物触发写一次binlog磁盘数据默认就是1可以保证最高数据安全性。sync_binlog1# 自动清理7天前的日志防止磁盘撑爆expire_logs_days7# 作为从库的 relay 日志数据路径relay_log路径# 允许将从主库接收到的更新再次写入自己的Binloglog_slave_updates1# 自增步长设为2auto_increment_increment2# 自增起始偏移量设为1生成奇数IDauto_increment_offset1B服务器[mysqld]# 必须与服务器A不同server-id2# 开启二进制日志log_bin路径 binlog_formatROW# 保证完整的行映像记录binlog_row_imageFULL# 每几次事物触发写一次binlog磁盘数据默认就是1可以保证最高数据安全性。sync_binlog1# 自动清理7天前的日志防止磁盘撑爆expire_logs_days7relay_log路径 log_slave_updates1# 自增步长设为2auto_increment_increment2# 【核心】自增起始偏移量设为2生成偶数IDauto_increment_offset2# B服务器初始状态处于禁写状态它会拒绝来自于外部的链接写入这是为了防止有煞笔连接这个初始先做从库的mysql写数据。不过在搭建的时候需要临时用sql放开不然你要创建用户的语句就执行不了了read_onlyON super_read_onlyONA服务器上指向BCHANGE MASTER TOMASTER_HOST服务器B的IP,MASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORD你的强密码,MASTER_LOG_FILE服务器B查到的File值,MASTER_LOG_POS服务器B查到的Position值;START SLAVE;B服务器上指向ACHANGE MASTER TOMASTER_HOST服务器A的IP,MASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORD你的强密码,MASTER_LOG_FILE服务器A查到的File值,MASTER_LOG_POS服务器A查到的Position值;START SLAVE;这种互为主从的数据库通常会通过vip对外服务不过当 action 数据库崩溃需要人为的干预去切换备用库放行写入操作流程如下。# 停止从库同步STOP SLAVE;# 重置作为从库的信息这一步其实可选如果初始主库 A 能在短时间内恢复对执行影响不大RESET SLAVEALL;# 动态放行写入SETGLOBALsuper_read_onlyOFF;SETGLOBALread_onlyOFF;后期初始主库 A 恢复后以从库的角色正常调起就行不需要一定切换本身互为主从的数据就是通的。服务 B 主需要补一个从节点信息即可mysql 5.7.6以后提供了一个gtid的主从同步模式他的直观好处就是。开启从节点功能的时候不需要手动指定主库的binlog位置但坏处就是有很多语句就不能使用了所以一般情况下不用有兴趣可以去了解一下。有几个坑点如果你在部署时图方便复制了库部署路径比如说你是虚拟机拷贝这种情况下一定要删除 mysql data路径下的 auto.cnf 使得 mysql 启动时从新生成服务ID。还有就是不属实出现 serverid 冲突尽量不要用sql改因为可能会导致 log 数据损坏导致你需要用 主库的 log文件位置信息 重新配置从库的 slave 信息才行