很多人安装 MySQL 只会用 yum 一键安装,真到了生产环境、自定义路径、多实例部署就频频踩坑:权限不对、启动失败、密码登不上、连接被拒绝……
这篇文章不讲花里胡哨,只讲 最规范、最安全、符合审计要求的二进制安装实战。从解压、配置、初始化、启停、改密到权限控制,一步一步带你走通,照着做就能直接上线,新手也能轻松学会!
1、预编译的二进制文件解压、改名
安装MySQL有多种方式,yum、二进制、docker等,下面以二进制文件安装方式进行说明
# 进入/home目录cd /home# 解压tar -xvf mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz# 改名,简单的名好记录mv mysql-8.0.40-linux-glibc2.28-x86_64 mysql8# 创建临时目录mkdir /home/mysql8/temp2、在 /home/mysql8 下新建 my.cnf,配置核心参数。
# 服务端核心配置[mysqld]basedir=/home/mysql8datadir=/home/mysql8/data socket=/home/mysql8/mysql.socklog-error=/home/mysql8/error.logtmpdir=/home/mysql8/tmpport=3308character-set-server=utf8mb4# 建议配置max_connections=2000innodb_buffer_pool_size=8Ginnodb_flush_log_at_trx_commit=1sync_binlog=1transaction-isolation=READ-COMMITTEDmax_execution_time=10000 # 客户端通用配置[client]default-character-set=utf8mb4socket=/home/mysql8/mysql.sock说明:
A、basedir:MySQL的基本目录;使用系统包管理器(如 yum、apt)安装MySQL可以不配置, 这类安装方式会将 MySQL 核心文件放在系统默认路径(如 /usr/local/mysql、/usr/bin 等),MySQL 启动时会自动识别这些默认路径 ;自定义安装路径强烈建议配置。
B、datadir:数据目录;后面建的数据库、表等业务数据都放这下面,要找个大盘。
C、socket: 定义本地客户端(特别是 mysql 命令行)连接 MySQL 的 Unix 套接字文件路径, 比 TCP/IP 协议(127.0.0.1:3306)更高效,是本地高效通信的核心配置。
D、log-error: 指定 MySQL 错误日志文件 的存放路径,是 MySQL 中最核心的日志配置之一 。若不配置则使用默认路径(如 /var/log/mysqld.log 或 /var/log/mysql/error.log)。
E、tmpdir: 指定 MySQL 临时文件的存放目录, 执行 ORDER BY、GROUP BY、DISTINCT 等语句时,若结果集超出 sort_buffer_size 内存限制,会生成临时排序文件,就放在此处。 多 MySQL 实例部署时,为每个实例配置独立的 tmpdir,避免不同实例的临时文件相互干扰、抢占磁盘资源。
F、上面的 【建议配置】不是必须的,但影响MySQL的性能和安全,建议根据实际情况进行配置。具体意义及更多参数配置见作者的另一篇文章《MySQL 30 个配置改完 TPS 翻 10 倍,结果内存纹丝不动:60% 稳如老狗》。
3、新建系统用户组及用户 mysql,用于启动 MySQL 服务
useradd -r -U -s /bin/false mysqlchown -R mysql:mysql /home/mysql8注:
A、-s /bin/false 表示设置用户的登录 Shell 为 /bin/false,即禁止该用户交互式登录系统,也就是说该用户是 "工具人",只能后台跑服务,不能登录系统搞事情。
B、考虑到安全、规范 和 审计要求,务必用专门的系统用户(如 mysql)启动mysql。不过,只是用系统用户mysql启动MySQL服务即可,下面的操作都是由 root 完成的。
4、初始化数据库(之前可能需要安装依赖包)
初始化数据库的作用是为空白 datadir(数据目录)创建系统库、系统表、默认用户、核心文件,完成实例的 初始化配置 。
初始化步骤
1. 检查前置条件(失败则终止)
A、检查 my.cnf 中指定的 datadir(数据目录)是否为空;如不为空则直接报错退出。
B、检查 --user 指定的用户对 datadir 目录是否有读写权限;如没有则直接报错退出。
C、验证配置文件的合法性:比如 port、socket 等核心参数是否合法;如不合法则直接报错退出。
2. 创建核心目录与文件
A、在 datadir 下创建系统库目录:mysql/(存储用户、权限相关表)、sys/(系统视图)、performance_schema/(性能监控)、information_schema/(元数据,内存表);
B、生成 InnoDB 核心文件:ibdata1(共享表空间)、ib_logfile0/ib_logfile1(重做日志)、auto.cnf(实例唯一 UUID);
C、创建临时文件目录(如 tmpdir 指定的目录),并设置正确的权限。
3. 初始化系统表(最核心)
向 mysql 库中写入基础表结构和数据。创建 user、db、tables_priv、columns_priv 等 30+ 个权限表;创建 plugin、procs_priv 等插件 / 存储过程权限表;初始化 information_schema(内存表,无需磁盘文件,记录元数据)。
4. 初始化插件与系统变量
A、加载默认认证插件(MySQL 8.0 默认为 caching_sha2_password);
B、初始化系统变量(如 max_connections、innodb_buffer_pool_size),优先使用 my.cnf 中的配置,无配置则用默认值 (如 max_connections=151、innodb_buffer_pool_size=128M) 。
初始化命令
/home/mysql8/bin/mysqld --defaults-file=/home/mysql8/my.cnf --initialize --user=root
说明:
A、初始化动作仅允许对 空的data目录 才能执行,若检测到目录内有文件(哪怕是之前初始化残留的系统文件、或你创建的业务数据文件),都会直接报错终止,避免误操作覆盖已有数据。
B、--initialize 会创建指定用户root,生成临时密码在 error.log 里用于首次登录 MySQL,登录后必须修改密码;还可以改为 --initialize-insecure,会创建指定用户root,密码为空。
C、上面用专门的系统用户 mysql 启动的MySQL服务,这里务必以 mysql 来初始化。
D、从 my.cnf 里读取参数,如 datadir、max_connections等,还可以在命令里直接设置
5、启动MySQL
启动MySQL有多种方式,下面从mysqld、mysqld_safe、service、systemctl 4种方式说明:
mysqld
启动命令:/home/mysql8/mysqld --defaults-file=/home/mysql8/my.cnf &
关闭命令:/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -uroot -p shutdown
特点:直接启动MySQL,无进程监控,日志需手动配置。
mysqld_safe
启动命令:/home/mysql8/mysqld_safe --defaults-file=/home/mysql8/my3306.cnf --user=root &
关闭命令:/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -u root -p shutdown
特点:自动重启崩溃的 mysqld,日志自动重定向到文件。
service
配置service启动:
vim /home/mysql8/support-files/mysql.server
修改数据目录 datadir=/home/mysql8/data
cp /home/mysql8/support-files/mysql.server /etc/init.d/mysqld8
启动命令:service mysqld8 start
关闭命令:service mysqld8 stop
systemctl
配置systemctl启动方式:
vim /etc/systemd/system/mysqld8.service
[Unit]Description=MySQL Server byDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlExecStart=/home/mysql8/bin/mysqld --defaults-file=/home/mysql8/my.cnfLimitNOFILE = 5000启动命令:systemctl start mysqld8.service
关闭命令:systemctl stop mysqld8.service
启动顺序
service --> mysqld_safe --> mysqld -->启动mysql
systemctl --> mysqld -->启动mysql
mysqld_safe --> mysqld -->启动mysql
mysqld --> 启动mysq
注:
A、上面4种方式最终都是使用 mysqld 进行启动MySQL的,如果没有走到 mysqld 这一步,是不会记录mysql的错误日志文件中。
B、/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -u root -p shutdown
上面这是通过 sock文件停止,效率最高;还可以通过 TCP/IP网络协议停止,需协议转换,稍慢,如下:
/home/mysql8/bin/mysqladmin -u root -p -P localhost -h 3306 shutdown
C、生产环境建议以 systemctl 方式启停。
6、使用临时密码登录MySQL,并修改密码
修改管理员密码有如下两种方式:
方式一
alter user root@'localhost' identified WITH mysql_native_password by '新密码';说明:

A、WITH mysql_native_password;指定用户认证插件 (MySQL8默认使用 caching_sha2_password 认证插件,一些老版本的客户端工具不支持)。
B、执行完无需执行flush privileges。
方式二
/home/mysql8/bin/mysqladmin -uroot -p旧密码 password '新密码' -S /home/mysql8/mysql.sock说明:执行完无需执行flush privileges。
7、允许固定机器通过root连接当前MySQL
/home/mysql8/bin/mysql -u root -p --socket=/home/mysql8/mysql.sockuse mysql;update user set host='限制IP' where user='root';GRANT ALL PRIVILEGES ON *.* TO 'root'@'限制IP' WITH GRANT OPTION;FLUSH PRIVILEGES; 说明:
A、由于这里直接使用 DML 修改了表 user 数据,没有修改内存数据,故需执行 flush。
B、root 用户权限过大,生产环境建议限制固定的IP才能使用 root 连接数据库。
C、root 用户主要是给 DBA 使用的。
8、为业务系统创建用户,并授予其某数据库的访问权限
-- 创建用户 elkCREATE USER 'elk'@'%' IDENTIFIED BY '实际密码';-- 授予用户 elk 对数据库 csm 的读写权限GRANT ALL PRIVILEGES ON csm.* TO 'elk'@'%';说明:elk 这种用户是专门给业务系统使用的,权限有限。业务系统不使用 root 用户,这里就实现了 DBA 和 业务 的权限配置,保证了数据库的安全。
总结
按照上面的步骤,我们收货了一个安全且高性能 MySQL服务,又可以了解每一步的意义和细节。