安装MySQL的方式有很多种,但二进制安装凭借“解压即用”的特点,成为生产环境中最推荐的部署方式。本文基于实际运维经验,从目录规范、用户创建到配置文件优化,完整记录MySQL 5.7二进制安装的全过程,并总结了6类常见启动失败案例及解决方案。

还在为源码编译安装MySQL头疼吗?二进制版本安装不仅快速,而且稳定可靠。本文将手把手教你如何在Linux系统(以CentOS 7为例)上安装MySQL 5.7的二进制版本,图文详解。

适用人群:运维工程师、后端开发、云服务器使用者、Linux初学者

前置要求:一台CentOS 7服务器,如果还没有,可以参考我前面的文章,VMware安装centos教程:https://blog.csdn.net/weixin_41558294/article/details/162388432

一、MySQL安装规范

  • MySQL安装方式:二进制安装(源码编译安装、yum 、rpm)

  • MySQL运行用户:

mysql:mysql 注意该用户是虚拟用户,只是用于mysql进程运行使用,不允许登录、不创建家目录
切换到root用户
useradd -s /sbin/nologin -M mysql
  • MySQL目录规范:
下载目录     /server/tools
系统目录     /opt/mysql/mysql-xx.xx
软连接       ln -s /opt/mysql/mysql-xx.xx /usr/local/mysql
数据目录     /data/mysql/mysql+port/{data,logs}
配置文件     /data/mysql/mysql+port/my+port.cnf
  • 确定libc版本,>=2.12,小于2.12会有报错

    [root@test ~]# ldd --version
    ldd (GNU libc) 2.17
    Copyright (C) 2012 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    由 Roland McGrath 和 Ulrich Drepper 编写。
    
  • MySQL下载

    通过网盘分享的文件:mysql-5.7.44-linux-glibc2.12-x86_64
    链接: https://pan.baidu.com/s/12f0rVP1qfbhNLphWAw-Hww?pwd=tkp5 提取码: tkp5 
    --来自百度网盘的分享
    

二、二进制安装MySQL

1. 创建MySQL虚拟用户

 useradd -s /sbin/nologin -M mysql

mysql5.7安装教程

2. 创建MySQL目录

 mkdir -p /server/tools
    mkdir -p /opt/mysql
    mkdir -p /data/mysql/mysql3306/{data,logs}
    cd /server/tools

mysql5.7安装教程

3. 上传MySQL二进制包

 rz
如果没有这个工具,安装 `yum install -y lrzsz`

mysql5.7安装教程

4. 解压MySQL二进制包

tar xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

mysql5.7安装教程

5. 将软件部分移动到指定目录

 mv mysql-5.7.44-linux-glibc2.12-x86_64  /opt/mysql/mysql-5.7.44

mysql5.7安装教程

6. 创建软连接

 ln -s /opt/mysql/mysql-5.7.44/ /usr/local/mysql

mysql5.7安装教程

7. 删除mariadb

rpm -e --nodeps mariadb-libs

mysql5.7安装教程

8. 配置文件整理

编辑 /data/mysql/mysql3306/my3306.cnf:

[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
sort_buffer_size=2M
max_allowed_packet=32M
join_buffer_size=2M
innodb_buffer_pool_size=128M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_log_files_in_group=2
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=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

mysql5.7安装教程

9. 安装MySQL依赖包

```
yum install libaio-devel -y
yum install numactl -y
```

mysql5.7安装教程

10. 更改MySQL相关目录的用户组

```
chown -R mysql:mysql /data/*
```

mysql5.7安装教程

11. 初始化MySQL数据库

```
/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
```

mysql5.7安装教程

12. 加入环境变量

编辑 `vim /etc/profile`:

```
PATH="/usr/local/mysql/bin:$PATH"
source /etc/profile
```

mysql5.7安装教程

mysql5.7安装教程

13. 启动MySQL

```
mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &
```

14. 查看是否启动成功

```
netstat -lntup |grep mysql
```

mysql5.7安装教程

15. MySQL8.0安装教程

三、首次登录MySQL与MySQL密码修改

3.1 无密码登录


# 本地登录
mysql -uroot -p -S /data/mysql/mysql3306/mysql.sock

mysql5.7安装教程

3.2 修改root密码

# MySQL 5.7中password字段已改为authentication_string
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';

mysql5.7安装教程

3.3 清理无用用户

DELETE FROM mysql.user WHERE user != 'root';

四、MySQL启动失败常见问题与排查

4.1 MySQL目录权限问题

错误信息:[ERROR] Could not open file '/data/mysql/mysql3306/logs/error.log' for error logging: Permission denied

原因:数据目录的所有者不是mysql用户

解决:

chown -R mysql:mysql /data/mysql

4.2 MySQL配置文件参数错误

错误信息:[ERROR] unknown variable 'xxx'

原因:参数拼写错误或该版本不支持该参数

解决:检查配置文件,修正错误参数

4.3 MySQL配置文件未正确加载

解决:启动时必须通过 --defaults-file 指定配置文件

mysqld --verbose --help | grep defaults

4.4 MySQL端口被占用

错误信息:[ERROR] Do you already have another mysqld server running on port: 3306?

解决:

# 查找占用端口的进程
netstat -lntup | grep 3306
# 修改配置文件中的端口,或停止冲突的服务

4.5 MySQL二进制日志文件丢失

错误信息:[ERROR] Failed to open log (file '.../mysql-bin.000014', errno 2)

解决:编辑 mysql-bin.index 文件,删除对应的日志记录

4.6 MySQL共享表空间大小不匹配

错误信息:[ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size

解决:在初始化前设置 innodb_data_file_path=ibdata1:12M:autoextend,或删除data目录重新初始化

4.7 MySQL配置文件隐形字符问题

有时启动失败是因为配置文件中存在看不见的字符(如Windows编辑器的换行符、BOM头等)。

解决:使用 dos2unix 工具转换格式,或用 vim 的 :set ff=unix 修复。

4.8 MySQL启动失败排查方法

  1. 确认版本和启动方式:明确当前MySQL版本及启动命令
  2. 查看错误日志:tail -100 /data/mysql/mysql3306/logs/error.log
  3. 检查配置文件:mysqld --defaults-file=xxx --verbose --help
  4. 检查系统资源:磁盘空间、内存、端口等

五、连接MySQL数据库的方式

本地连接(通过socket):

mysql -uroot -p -S /data/mysql/mysql3306/mysql.sock

远程连接(通过TCP/IP):

mysql -uroot -p -P3306 -h192.168.58.51

六、MySQL安全加固建议

  1. 使用非root用户运行:已通过 mysql:mysql 用户实现
  2. 设置强密码:避免使用默认或简单密码
  3. 删除匿名用户:DELETE FROM mysql.user WHERE User='';
  4. 限制远程root登录:仅允许localhost登录
  5. 定期备份:配合二进制日志实现增量备份
  6. 启用慢查询日志:便于性能分析和优化

七、常用MySQL管理命令

-- 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'localhost';

-- 查看数据库状态
SHOW STATUS LIKE 'Threads_connected';
SHOW PROCESSLIST;

-- 导入SQL文件
SOURCE /path/to/backup.sql;

八、MySQL常用命令与基础操作

8.1 MySQL数据库登录

# 本地登录(通过socket)
mysql -uroot -p -S /data/mysql/mysql3306/mysql.sock

# 远程登录
mysql -uroot -p -P3306 -h192.168.58.51
  • -u:指定用户名
  • -p:提示输入密码
  • -h:指定主机IP地址
  • -P:指定端口

8.2 MySQL数据库基础操作(DDL)

查看与切换数据库:

-- 查看所有数据库
SHOW DATABASES;

-- 使用(切换)数据库
USE 数据库名;

-- 查看当前使用的数据库
SELECT DATABASE();

创建与删除数据库:

-- 创建数据库(指定字符集)
CREATE DATABASE 数据库名 CHARSET=utf8mb4;

-- 删除数据库
DROP DATABASE 数据库名;

8.3 MySQL表的基础操作

查看与删除表:

-- 显示当前数据库所有表
SHOW TABLES;

-- 删除表
DROP TABLE 表名;

创建表:

CREATE TABLE 表名 (
    列名 类型 约束1 约束2,
    列名 类型 约束
);

示例:

CREATE TABLE emp (
    ename VARCHAR(10),
    hiredate DATE,
    sal DECIMAL(10,2),
    deptno INT(2)
);

查看表结构:

-- 查看表定义
DESC 表名;

-- 查看详细表定义(含创建语句)
SHOW CREATE TABLE 表名 \G;

修改表结构:

-- 修改字段类型
ALTER TABLE emp MODIFY ename VARCHAR(20);

-- 添加字段
ALTER TABLE emp ADD COLUMN age INT(3);

-- 删除字段
ALTER TABLE emp DROP COLUMN age;

-- 字段改名
ALTER TABLE emp CHANGE age age1 INT(4);

-- 修改表名
ALTER TABLE emp RENAME emp1;

8.4 MySQL数据操纵语句(DML)

插入数据:

-- 指定字段插入
INSERT INTO emp (ename, hiredate, sal, deptno) 
VALUES ('zhangsan', '2018-01-01', 2000, 1);

-- 不指定字段(按顺序全部插入)
INSERT INTO emp VALUES ('lisi', '2018-01-01', 2000, 1);

-- 批量插入
INSERT INTO dept VALUES (1, 'dept1'), (2, 'dept2');

更新与删除数据:

-- 修改记录
UPDATE emp SET sal=4000, deptno=2 WHERE ename='zhangsan';

-- 删除记录
DELETE FROM emp WHERE ename='zhangsan';

查询数据:

-- 查询所有记录
SELECT * FROM emp;

-- 查询不重复的记录
SELECT DISTINCT deptno FROM emp;

-- 条件查询
SELECT * FROM emp WHERE deptno=1 AND sal<3000;

-- 排序和限制(取前2条)
SELECT * FROM emp ORDER BY deptno DESC LIMIT 2;

-- 分页查询(从第0条开始取10条)
SELECT * FROM emp ORDER BY deptno DESC LIMIT 0,10;

8.5 MySQL字段约束

约束类型关键字说明
主键约束PRIMARY KEY唯一标识每一行,不能为NULL
唯一约束UNIQUE列中所有值唯一
非空约束NOT NULL列不能为空
默认约束DEFAULT未提供值时使用默认值
自动递增AUTO_INCREMENT自动生成唯一值
外键约束FOREIGN KEY建立和维护表间关系

8.6 MySQL系统变量管理

查询变量:

-- 查询会话变量(默认)
SHOW VARIABLES LIKE '%read_only%';
SHOW VARIABLES LIKE '%chara%';

-- 查询全局变量
SHOW GLOBAL VARIABLES LIKE '%read_only%';

修改变量:

-- 修改全局变量(影响后续新连接,重启失效)
SET GLOBAL character_set_client=utf8;

-- 修改会话变量(仅影响当前会话)
SET character_set_client=gbk;

查询状态变量(用于监控和性能分析):

SHOW SESSION STATUS LIKE '%Table_locks_immediate%';

九、MySQL用户与权限管理

9.1 创建用户

-- 方式一:使用CREATE USER
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

-- 示例
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'abc123';

⚠️ 注意:MySQL的账号由“用户名”和“登录主机”共同构成,两者组合才是一个完整账号。

9.2 授权管理

-- 授予权限
GRANT 权限 ON 数据库.表 TO '用户'@'主机' IDENTIFIED BY '密码';

-- 示例:授予test数据库的所有权限
GRANT ALL ON test.* TO 'user1'@'%' IDENTIFIED BY '123456';

-- 查看用户权限
SHOW GRANTS FOR 'user'@'localhost';

-- 撤销权限
REVOKE 权限 ON 数据库.表 FROM '用户'@'主机';

-- 示例:撤销update权限
REVOKE UPDATE ON *.* FROM 'lisi'@'localhost';

9.3 查看与删除用户

-- 查看所有用户
SELECT user, authentication_string, host FROM mysql.user;

-- 删除用户
DROP USER 'user'@'host';

-- 重命名用户
RENAME USER 'old_user'@'host' TO 'new_user'@'host';

9.4 修改密码

-- 修改当前登录用户密码
SET PASSWORD = PASSWORD('新密码');

-- 修改其他用户密码
SET PASSWORD FOR 'user'@'host' = PASSWORD('新密码');

9.5 MySQL忘记root密码的解决办法

# 1. 停止MySQL服务
systemctl stop mysqld.service

# 2. 在配置文件/etc/my.cnf的[mysqld]下添加
skip-grant-tables

# 3. 重启MySQL,无密码登录后修改密码
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE user='root';

# 4. 删除配置文件中skip-grant-tables参数,重启MySQL

十、MySQL备份与恢复

10.1 mysqldump全量备份

mysqldump 是MySQL自带的逻辑备份工具,通过生成SQL脚本来备份数据库。

备份单个数据库:

mysqldump -u 用户名 -p 数据库名 > 备份文件.sql

# 示例
mysqldump -u root -p mydb > mydb_backup.sql

备份所有数据库:

mysqldump -u root -p --all-databases > all_databases_backup.sql

备份特定表:

mysqldump -u root -p 数据库名 表名 > 表备份.sql

# 示例
mysqldump -u root -p mydb users > users_backup.sql

备份时加常用选项:

mysqldump --all-databases --master-data=2 --single-transaction \
  --routines --events --triggers > all_databases.sql

10.2 数据恢复

还原到指定数据库:

mysql -u 用户名 -p 数据库名 < 备份文件.sql

# 示例
mysql -u root -p mydb < mydb_backup.sql

创建新数据库并恢复:

# 先创建数据库
mysql -u root -p -e "CREATE DATABASE newdb;"
# 再恢复数据
mysql -u root -p newdb < mydb_backup.sql

恢复所有数据库:

mysql -u root -p < all_databases_backup.sql

10.3 备份注意事项

  • 备份频率:根据业务需求确定,重要数据建议定期备份
  • 备份文件存储:存放在安全位置,建议加密和访问控制
  • 测试恢复:定期测试备份文件的有效性
  • 性能影响:大规模备份建议在低峰时段进行
  • 备份和恢复过程中确保MySQL服务正在运行

十一、MySQL性能优化

11.1 核心性能参数

连接管理参数:

参数说明建议值
max_connections最大并发连接数并发用户数的1.2-1.5倍
thread_cache_size线程缓存数量根据Threads_created指标调整

内存配置参数:

参数说明建议值
innodb_buffer_pool_sizeInnoDB核心缓存区物理内存的50%-70%
key_buffer_sizeMyISAM索引缓存InnoDB为主时保持默认8MB

日志配置参数:

参数说明建议值
slow_query_log开启慢查询日志生产环境开启
long_query_time慢查询阈值0.5-2秒
innodb_log_file_size重做日志大小innodb_buffer_pool_size / 4

11.2 性能监控指标

  • QPS/TPS:每秒查询数/事务数,反映系统吞吐量
  • 连接使用率:Threads_connected / max_connections
  • 缓存命中率:InnoDB缓冲池命中率应 > 99%
  • 锁等待时间:Innodb_row_lock_waits 值过高需优化事务

11.3 诊断与调优工具

-- 查看运行状态
SHOW GLOBAL STATUS LIKE 'Threads%';

-- 查看InnoDB引擎状态
SHOW ENGINE INNODB STATUS\G

-- 查看当前参数值
SHOW VARIABLES LIKE 'max_connections';

-- 动态修改参数(重启失效)
SET GLOBAL max_connections = 500;

11.4 参数调优原则

  1. 循序渐进:每次只修改1-2个参数,观察效果
  2. 监控先行:优化前建立性能基线
  3. 因地制宜:根据工作负载调整配置
  4. 动态调整优先:先在线调整观察效果,再写入配置文件固化

十二、MySQL主从复制配置

12.1 环境准备

  • 两台服务器(Master和Slave),建议配置相同
  • 操作系统:Linux(如CentOS 7)
  • MySQL版本:5.7或更高,主从版本需一致
  • 确保两台服务器网络互通

12.2 主库配置(Master)

编辑配置文件 /etc/my.cnf:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row

重启MySQL服务后,创建复制用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

获取二进制日志位置:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- 记录 File 和 Position 的值

12.3 从库配置(Slave)

编辑配置文件 /etc/my.cnf:

[mysqld]
server-id=2
log-bin=mysql-bin
binlog-format=row
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1

12.4 数据同步与启动复制

# 在主库备份数据
mysqldump --all-databases --master-data=2 --single-transaction > all_databases.sql

# 传输到从库
scp all_databases.sql user@slave_ip:/path/to/backup/

# 在从库恢复
mysql < /path/to/backup/all_databases.sql

配置从库并启动:

CHANGE MASTER TO
    MASTER_HOST='主库IP',
    MASTER_USER='repl',
    MASTER_PASSWORD='密码',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=12345;

START SLAVE;

-- 检查复制状态
SHOW SLAVE STATUS\G

十三、日常运维与安全加固

13.1 安全加固建议

  1. 使用专用用户运行:使用mysql:mysql虚拟用户运行服务
  2. 删除匿名用户:DELETE FROM mysql.user WHERE User='';
  3. 删除测试数据库:DROP DATABASE test;
  4. 限制root远程访问:仅允许localhost登录
  5. 最小化权限原则:按需授予用户最小必要权限
  6. 禁用匿名账户:确保没有空用户名的账户

13.2 日志管理

MySQL日志类型包括:错误日志、通用查询日志、二进制日志、慢查询日志

日志类型说明配置参数
错误日志记录启动、停止及运行错误log_error
二进制日志记录DDL、DML等变更操作log_bin
慢查询日志记录超过阈值的SQLslow_query_log
通用查询日志记录所有连接和查询general_log

13.3 日常监控要点

  • 监控数据库连接数、CPU使用率、内存使用率、磁盘空间
  • 定期分析慢查询日志,优化SQL语句
  • 监控Threads_connected与max_connections的比率
  • 关注Innodb_row_lock_waits锁等待情况

13.4 多实例部署

MySQL支持在一台服务器上部署多个实例,每个实例通过不同的端口提供服务。各实例之间相互独立,拥有各自的datadir、port、socket和pid文件。

# 多实例部署时,每个实例使用独立的配置文件
/data/mysql/mysql3306/my3306.cnf  # 实例1(端口3306)
/data/mysql/mysql3307/my3307.cnf  # 实例2(端口3307)

通过以上步骤,你应该能在CentOS 7系统上顺利完成MySQL 5.7的二进制安装与配置。二进制安装方式相比源码编译更加快速便捷,同时保持了良好的可控性,非常适合生产环境部署。

建议在实际操作中注意以下几点:

  • 严格按照目录规范组织文件,便于后期维护和多实例管理
  • 初始化时根据安全需求选择 --initialize-insecure 或 --initialize
  • 遇到启动失败时,第一时间查看 error.log 错误日志定位问题

如果在安装过程中遇到问题,欢迎在评论区留言交流。

更多推荐