Appearance
01|安装与连接
要在服务器上用 MySQL 存数据,第一件事是装一个 MySQL 实例让它跑起来。云上的 RDS 点几下就有了,但自己装一个,会踩到几个具体的坑:配了参数起不来、目录权限不对报错、启动后不知道初始密码。
本篇从零装一个 MySQL,把这些坑的位置讲清楚。当前生产推荐版本是 MySQL 8.4 LTS(8.0 已于 2026 年 4 月停止支持,5.7 更早)。
一、两种安装方式
装 MySQL 有两种主流方式:
| 方式 | 特点 | 适合 |
|---|---|---|
| 系统包安装 | 快,一行命令;版本跟系统仓库走 | 测试、快速试用 |
| 二进制包安装 | 版本自己掌控、路径统一、不依赖系统仓库 | 生产 |
生产环境统一用二进制包——版本固定、升级时清楚换的是哪个版本。包安装的版本受系统仓库限制,可能装到老版本,升级也混乱。测试想快速跑起来可以用包安装。
二、包安装:先跑起来
包安装最快。装之前先加 MySQL 官方仓库(系统自带的仓库版本可能旧):
bash
# RHEL / Rocky
yum install -y https://repo.mysql.com/mysql84-community-release-el9.rpm
yum install -y mysql-community-server
# Debian / Ubuntu
apt update && apt install -y mysql-server装完,文件散落在系统各处。几个路径要记住,后面排查要用:
| 路径 | 装什么 |
|---|---|
/etc/my.cnf | 配置入口 |
/var/lib/mysql | 数据目录(存表、日志) |
/var/log/mysqld.log | 错误日志 |
记不住用命令查安装了哪些文件:
bash
rpm -ql mysql-community-server | head # RHEL
dpkg -L mysql-server | head # Debian启动:
bash
systemctl start mysqld
systemctl enable mysqld包安装的 MySQL 首次启动时会自动初始化数据目录、生成一个临时 root 密码。去日志里找:
bash
grep 'temporary password' /var/log/mysqld.log拿到这串密码,才能登录。
三、二进制安装:生产的方式
生产用二进制包,版本和路径自己掌控。从 MySQL 官网下载 8.4 的二进制包(mysql-8.4.x-linux-glibc2.28-x86_64.tar.xz)。
解压和建用户
bash
# 解压
tar -xf mysql-8.4.x-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
ln -s /usr/local/mysql-8.4.x-* /usr/local/mysql
# 建专用用户(MySQL 进程以这个身份跑,不需要人登录)
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql为什么建单独的 mysql 用户而不是用 root 跑?MySQL 是长期跑的服务,以 root 跑风险大——一旦 MySQL 被攻破,攻击者直接拿到 root。用低权限的 mysql 用户跑,就算被攻破也只能动 mysql 能动的文件。-s /sbin/nologin 让这个用户不能登录 shell,只是个进程身份。
规划数据目录
数据、日志、临时文件分开存,便于管理和备份:
bash
mkdir -p /data/mysql/{data,logs,tmp}
chown -R mysql:mysql /data/mysql/data 和 /var 分开是常见做法——/var 可能和系统盘在一起,/data 单独挂盘,数据盘满了不影响系统。
初始化数据目录
bash
/usr/local/mysql/bin/mysqld \
--initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data/mysql/data这个命令建系统表、生成初始 root 密码(输出在屏幕上,或写到错误日志)。这个命令只在第一次执行——重新跑一次会让已有数据全部丢失。 临时密码形如:
text
A temporary password is generated for root@localhost: xQwe9_abcDkL记下这串,等下登录用。
四、配置文件
MySQL 启动时读配置文件。二进制安装的配置文件放 /etc/my.cnf:
ini
# /etc/my.cnf
[mysqld]
server_id=1
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/data
socket=/data/mysql/tmp/mysql.sock
pid-file=/data/mysql/tmp/mysqld.pid
log_error=/data/mysql/logs/error.log
character_set_server=utf8mb4
collation_server=utf8mb4_0900_ai_ci
max_connections=500
innodb_buffer_pool_size=1G
log_bin=/data/mysql/logs/mysql-bin
binlog_format=ROW
binlog_expire_logs_seconds=604800几个容易踩的参数单独说:
character_set_server=utf8mb4——别写成 utf8。MySQL 里的 utf8 是残缺的,最多存 3 字节,存 emoji(😊,4 字节)会报错。utf8mb4 才是完整的 UTF-8。新装的库一定要用 utf8mb4,否则后面存 emoji 时才发现要改字符集,很麻烦。
innodb_buffer_pool_size——InnoDB 把热数据缓存在内存里,这块大小直接决定查询是从内存取(快)还是读磁盘(慢)。一般给到机器可用内存的 60%-70%。给小了查询慢,给大了挤占系统其他进程。
log_bin + binlog_format=ROW——开启 binlog 才能做时间点恢复和主从复制。ROW 格式记录每行数据的变化,比老的 STATEMENT 格式精确,是现在的主推。
改配置的风险
MySQL 没有 nginx -t 那种配置检查命令。改完配置只能通过重启验证。生产改配置前必须备份旧文件,在低峰窗口重启:
bash
cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F)五、启动和第一次登录
二进制安装要手动启动(或写 systemd unit,这里先手动跑通):
bash
/usr/local/mysql/bin/mysqld_safe --user=mysql &用临时密码登录:
bash
mysql -uroot -p输临时密码进去。第一件事改密码:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';8.4 默认密码策略要求高强度——大小写+数字+特殊字符+一定长度。设太简单会报错 Your password does not satisfy the current policy requirements。
六、几个日志各管各的
第一次接触 MySQL 会被一堆"xx log"搞晕。它们是不同的人记不同的账:
| 日志 | 记什么 | 什么时候用 |
|---|---|---|
| 错误日志(error log) | 启动失败、崩溃恢复、连接被拒、复制断了 | 排查问题的第一站 |
| binlog | 每一笔数据变更 | 主从复制、时间点恢复 |
| redo log(InnoDB 内部) | 改过的页还没刷回磁盘 | 崩溃恢复,自动的,不用碰 |
| undo log(InnoDB 内部) | 修改前的老数据 | 事务回滚、MVCC,自动的 |
日常最常用前两个:错误日志排查问题、binlog 做恢复。redo 和 undo 是 InnoDB 自己维护的,运维一般不直接操作,知道它们存在就行。
错误日志路径在配置里写的 /data/mysql/logs/error.log,启动失败先看它:
bash
tail -n 100 /data/mysql/logs/error.log七、客户端连接
本机连接用 socket(不走网络,最快):
bash
mysql -uroot -p不加 -h 默认走 socket。远程连接要走网络,指定主机和端口:
bash
mysql -h 192.168.1.10 -P 3306 -u ops -p但默认 root 只能本机连(root@localhost),远程连不上。要远程连得建允许远程的账号——这是下一篇账号权限的内容。
八、新装实例的基础安全
刚装好的实例有几个默认的不安全项要清理:
sql
-- 看现在有哪些账号
SELECT user, host FROM mysql.user;
-- 删匿名用户(默认可能有,能无密码连)
DROP USER IF EXISTS ''@'localhost';
-- 删 test 库(默认权限太宽,任何人都能访问)
DROP DATABASE IF EXISTS test;''@'localhost' 是匿名账号——用户名是空串,意味着不用密码就能连进来。生产环境绝不能留。
九、日常管理命令
装好之后,几个天天会用的命令:
bash
# 检测实例是否活着
mysqladmin -uroot -p ping
# 返回 mysqld is alive 就是活的
# 查某个参数的值
mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"
# 查当前连接数
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"-e 后面跟 SQL,执行完就退出,不用进交互模式。脚本里常用。
装好之后
MySQL 跑起来了、能连上了、基础安全做了。但里面还没有业务数据——没有库、没有表。下一篇讲怎么建库建表,把数据存进去。