描述:最详细的MySQL 9.7二进制安装教程,覆盖MySQL环境检查、MySQL安装配置、MySQL启动排错、用户安全、SQL基础、参数调优、事务与索引原理,适合学生、开发和运维工程师。
一、安装前必读
1.1 为什么选择二进制安装?
MySQL 在 Linux 下支持多种安装方式:
| 安装方式 | 优点 | 缺点 |
|---|---|---|
| 源码编译 | 定制性强,可优化编译参数 | 耗时长,依赖多,易出错 |
| YUM/RPM | 方便快捷,自动解决依赖 | 版本滞后,路径分散,管理不便 |
| 二进制(预编译) | 开箱即用,性能稳定,便于多实例管理 | 需手动配置环境变量和服务 |
本教程采用官方二进制包(glibc 2.28 版) ,适合生产环境批量部署,统一目录规范(/opt/mysql + /data 分离)。
1.2 下载MySQL 9.7.1 二进制包
百度网盘链接(含 mysql-9.7.1-linux-glibc2.28-x86_64.tar.xz):
🔗 链接: https://pan.baidu.com/s/1QRuCxRMsXaiv4d4quGpzuQ?pwd=hpe3
📦 提取码: hpe3
1.3 检查系统glibc版本(必须 ≥ 2.28)
如果还没有Linux环境,请参考我的这篇文章 :VMware安装Rocky Linux。
bash
[root@test ~]# ldd --version
ldd (GNU libc) 2.34 # 如果小于2.28,请升级系统或下载低版本MySQL
如果版本低于 2.28,启动会报错 FATAL: kernel too old 或 GLIBC_2.28 not found。
二、二进制安装MySQL 9.7全流程
2.1 创建虚拟用户及目录
bash
# 创建MySQL运行用户(不登录,无家目录)
useradd -s /sbin/nologin -M mysql
# 创建软件存放、安装、数据目录
mkdir -p /server/tools
mkdir -p /opt/mysql
mkdir -p /data/mysql/mysql3306/{data,logs}
cd /server/tools


2.2 上传并解压二进制包
bash
# 若没有rz,先安装 lrzsz
yum install -y lrzsz
rz # 选择下载好的 tar.xz 文件
若没有tar工具,先按照
yum install tar -y
# 解压(.xz 格式,用 xf 参数)
tar xf mysql-9.7.1-linux-glibc2.28-x86_64.tar.xz



2.3 移动软件并创建软链接
bash
mv mysql-9.7.1-linux-glibc2.28-x86_64 /opt/mysql/mysql-9.7.1
ln -s /opt/mysql/mysql-9.7.1/ /usr/local/mysql

2.4 移除系统自带的 MariaDB 库(避免冲突)
bash
rpm -e --nodeps mariadb-libs

2.5 编写实例配置文件(多实例标准化)
使用 vi /data/mysql/mysql3306/my3306.cnf,粘贴以下内容(已针对 MySQL 9.7 优化):
ini
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/data/mysql/mysql3306/mysql.sock
server_id=1
port=3306
log_error=/data/mysql/mysql3306/logs/error.log
log_bin=/data/mysql/mysql3306/logs/mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=true
log_slave_updates=1
# 连接与超时
max_connections=1024
wait_timeout=60
max_allowed_packet=32M
# 排序与连接缓冲区
sort_buffer_size=2M
join_buffer_size=2M
# InnoDB 核心配置(生产环境请调大 buffer pool)
innodb_buffer_pool_size=128M # 建议设为物理内存的70%~80%
innodb_flush_log_at_trx_commit=1 # 最安全(双一)
innodb_log_buffer_size=32M
innodb_redo_log_capacity = 128M
# 二进制日志缓存
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
binlog_expire_logs_seconds=604800 # 7天
# 慢查询日志
slow_query_log=on
slow_query_log_file=/data/mysql/mysql3306/logs/slow.log
long_query_time=0.5
log_queries_not_using_indexes=1
⚠️ 注意 :MySQL 9.7 已废弃部分老参数(如
expire_logs_days被binlog_expire_logs_seconds取代),本配置已兼容。
2.6 安装依赖包并修改目录权限
bash
yum install -y libaio-devel numactl
chown -R mysql:mysql /data/*


2.7 初始化数据库(无密码,方便首次登录)
bash
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf \
--initialize-insecure --user=mysql --basedir=/usr/local/mysql \
--datadir=/data/mysql/mysql3306/data
若想生成随机初始密码,将
--initialize-insecure替换为--initialize,密码会记录在error.log中。
2.8 添加环境变量
bash
echo 'PATH="/usr/local/mysql/bin:$PATH"' >> /etc/profile
source /etc/profile

2.9 启动MySQL
bash
mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &
2.10 验证启动
bash
# 如没有netstat命令,先安装
yum install net-tools -y
netstat -lntup | grep 3306
# 或者
ss -lntup | grep mysql

三、MySQL启动失败常见案例与排查
3.1 目录权限问题
错误日志 :
[ERROR] Could not open file '/data/mysql/mysql3306/logs/error.log' for error logging: Permission denied
原因 :data/logs 目录属主不是 mysql:mysql。
解决 :chown -R mysql:mysql /data/*
3.2 配置文件参数拼写或版本废弃
错误 :[ERROR] unknown variable 'basedi=/usr/local/mysql'
解决 :仔细检查 my3306.cnf,修改正确拼写(如 basedir)。
3.3 未正确指定配置文件
现象 :MySQL 启动时使用了默认路径的配置(如 /etc/my.cnf),导致参数不符。
排查 :mysqld --verbose --help | grep defaults 查看默认加载顺序。
解决 :启动时务必带 --defaults-file 指定绝对路径。
3.4 端口被占用
错误 :[ERROR] Do you already have another mysqld server running on port: 3306 ?
解决:修改端口或 kill 旧进程,多实例需确保每个实例端口不同。
3.5 二进制日志文件丢失
错误 :[ERROR] Failed to open log (file '/data/mysql/mysql3306/logs/mysql-bin.000014', errno 2)
解决 :编辑 mysql-bin.index,删除缺失的那一行记录。
3.6 共享表空间大小不匹配
错误 :The Auto-extending innodb_system data file './ibdata1' is of a different size ...
解决 :若未初始化,修改配置文件中的 innodb_data_file_path=ibdata1:12M:autoextend(默认12M),重新初始化。
启动失败三板斧排查口诀
- 看版本 :确认
ldd --version、mysql --version。 - 看日志 :
tail -100 /data/mysql/mysql3306/logs/error.log。 - 看权限 :
ls -l /data/mysql/mysql3306/data是否属主正确。
四、连接MySQL与用户安全策略
4.1 本地与远程连接方式
bash
# 本地socket连接
mysql -S /data/mysql/mysql3306/mysql.sock

4.2 初始化安全策略
--initialize-insecure:root 密码为空,需立即修改。--initialize:生成随机密码,在 error.log 中查找A temporary password is generated for root@localhost。
修改root密码:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongP@ssw0rd';
或使用 mysqladmin:
bash
mysqladmin -uroot -p'oldpass' password 'newpass' -S /data/mysql/mysql3306/mysql.sock
4.3 删除匿名用户与多余账号
sql
DELETE FROM mysql.user WHERE user != 'root';
FLUSH PRIVILEGES;
4.4 创建管理用户并授权
sql
CREATE USER 'ergou'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'ergou'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
五、MySQL基础操作(DML/DDL/DQL/DCL)
SQL 语言按功能分为四大类,掌握它们是DBA和开发的基本功。
5.1 DDL(数据定义语言)
用于创建、修改、删除数据库对象(库、表、索引等)。
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建表
CREATE TABLE testdb.users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 修改表结构(添加列)
ALTER TABLE testdb.users ADD COLUMN age TINYINT;
-- 删除表
DROP TABLE testdb.users;
5.2 DML(数据操纵语言)
增、删、改数据。
sql
-- 插入
INSERT INTO testdb.users (username, email) VALUES ('zhangsan', 'zhangsan@example.com');
-- 更新
UPDATE testdb.users SET age = 28 WHERE username = 'zhangsan';
-- 删除(务必带条件)
DELETE FROM testdb.users WHERE id = 1;
5.3 DQL(数据查询语言)
最常用的 SELECT 查询。
sql
-- 简单查询
SELECT * FROM testdb.users WHERE age > 20 ORDER BY created_at DESC;
-- 聚合查询
SELECT COUNT(*), AVG(age) FROM testdb.users;
-- 多表联查(JOIN)
SELECT u.username, o.order_id
FROM users u
JOIN orders o ON u.id = o.user_id;
5.4 DCL(数据控制语言)
权限管理与事务控制(事务也常归为DCL)。
sql
-- 授予权限
GRANT SELECT, INSERT ON testdb.* TO 'app_user'@'%';
-- 回收权限
REVOKE INSERT ON testdb.* FROM 'app_user'@'%';
-- 事务控制(begin/commit/rollback)
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT; -- 或 ROLLBACK;
六、MySQL 9.7 核心参数详解
| 参数 | 作用 | 建议值 |
|---|---|---|
innodb_buffer_pool_size |
InnoDB 缓存数据和索引的内存池,性能最关键参数 | 物理内存的70%~80% |
innodb_log_file_size |
重做日志文件大小,影响崩溃恢复速度和写入性能 | 1G~4G(生产) |
innodb_flush_log_at_trx_commit |
1(最安全,每次提交刷盘)、2(每秒刷盘)、0(每秒刷盘,延迟) | 生产环境=1 |
binlog_format |
二进制日志格式:row(推荐)、statement、mixed |
ROW |
gtid_mode |
开启全局事务标识,便于主从切换 | ON |
max_connections |
最大并发连接数 | 根据业务估算,一般 500~2000 |
wait_timeout |
非交互连接超时秒数,避免长连接堆积 | 60~300 |
binlog_expire_logs_seconds |
binlog 保留时间(秒) | 604800(7天) |
long_query_time |
慢查询阈值(秒) | 0.5~2 |
log_queries_not_using_indexes |
记录未走索引的查询,便于优化 | ON |
修改参数后,需重启实例或动态调整(部分参数支持
SET GLOBAL)。
七、事务与索引深度解析
7.1 事务(Transaction)
事务特性(ACID):
- 原子性(A):事务中操作要么全部成功,要么全部失败。
- 一致性(C):事务前后数据库完整性约束不被破坏。
- 隔离性(I) :并发事务互相隔离,MySQL 提供四种隔离级别:
READ UNCOMMITTED(读未提交)READ COMMITTED(读已提交,Oracle默认)REPEATABLE READ(可重复读,MySQL默认,解决幻读)SERIALIZABLE(串行化,性能最低)
- 持久性(D):事务提交后数据持久化到磁盘。
查看隔离级别 :SELECT @@transaction_isolation;
设置隔离级别 :SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
MVCC(多版本并发控制):MySQL 通过 undo log 实现非锁定读,提高并发性能。
7.2 索引(Index)
索引是加速查询的数据结构(B+树、Hash等),但会占用空间并影响写入性能。
常见索引类型:
- PRIMARY KEY:聚集索引,叶子节点存储完整行数据。
- UNIQUE KEY:唯一索引,不允许重复。
- INDEX(普通索引):辅助索引,叶子节点存储主键值(回表)。
- FULLTEXT:全文索引(用于文本搜索)。
- 复合索引 :多列组合,遵循最左前缀原则。
索引优化建议:
- 在 WHERE、JOIN、ORDER BY 列上建索引。
- 区分度高的列优先(如身份证号优于性别)。
- 避免在索引列上使用函数或计算。
- 使用
EXPLAIN分析执行计划,关注type、key、rows。
查看索引 :SHOW INDEX FROM table_name;
创建索引 :CREATE INDEX idx_name ON table_name (col1, col2);
删除索引 :DROP INDEX idx_name ON table_name;
八、总结与最佳实践
通过本教程,你已掌握:
✅ MySQL 9.7 二进制安装全流程(从下载到启动)
✅ 常见启动故障排查思路(权限、参数、端口、日志)
✅ 用户安全和连接方式
✅ SQL 四大分类(DDL/DML/DQL/DCL)实操
✅ 核心参数调优与事务/索引原理
生产环境部署建议:
- 数据目录与软件目录分离,便于迁移和扩容。
- 开启 binlog + GTID,为高可用(主从、MGR)做准备。
- 定期监控慢查询,并利用
pt-query-digest分析。 - 使用
mysql_secure_installation脚本加固安全。
MySQL 9.7 新特性亮点(简要):
- 更强大的 JSON 函数支持。
- 改进的 InnoDB 并行读取。
- 优化器对窗口函数和 CTE 的优化。
- 安全性增强(caching_sha2_password 默认)。
关键词:MySQL 9.7安装、MySQL二进制安装、MySQL 9.7配置、MySQL基础操作、DML DDL DQL DCL、MySQL事务索引、MySQL启动排错
如果觉得本文对你有帮助,欢迎收藏、转发,如有问题请在评论区留言,我会尽力解答!

