Skip to content

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 跑起来了、能连上了、基础安全做了。但里面还没有业务数据——没有库、没有表。下一篇讲怎么建库建表,把数据存进去。