说明

本文要装的是 Oracle MySQL 和 Redis,不是 MariaDB。

Debian 自带仓库里的 default-mysql-server 实际会装成 MariaDB,不要用那个包。本机用 apt 装 MySQL 时,走 MySQL 官方 APT 源。

方式 Redis MySQL
A. 软件源 Debian 源 redis-server MySQL 官方 APT → mysql-community-server
B. Docker redis:8.8.2 mysql:9.7.2

密码示例:infra123!(请改成自己的)。

不要两套同时占 3306 / 6379。

前置:


方式 A:软件源安装(含密码配置)

先清掉可能装过的 MariaDB(如有)

若以前误装过 default-mysql-server / mariadb-*,先卸干净,避免抢端口和混淆:

bash
1sudo systemctl stop mariadb mysql 2>/dev/null || true
2sudo apt purge -y 'mariadb-*' 'default-mysql-*' 2>/dev/null || true
3sudo apt autoremove -y
4# 确认没有残留服务占 3306
5sudo ss -tlnp | grep 3306 || echo '3306 free'

安装 Redis(Debian 源)

bash
1sudo apt update
2sudo apt install -y redis-server
3sudo systemctl enable --now redis-server
4sudo systemctl status redis-server --no-pager

未设密码时:

bash
1redis-cli ping
2# PONG

配置 Redis 密码

bash
1sudo vim /etc/redis/redis.conf

建议:

conf
bind 127.0.0.1 -::1
requirepass infra123!
supervised systemd
appendonly yes
bash
1sudo systemctl restart redis-server
2
3redis-cli ping
4# (error) NOAUTH Authentication required.
5
6redis-cli -a 'infra123!' ping
7# PONG

或:

bash
1redis-cli
2127.0.0.1:6379> AUTH infra123!
3OK

数据默认在 /var/lib/redis/,配置在 /etc/redis/redis.conf。

添加 MySQL 官方 APT 源

Debian 仓库里没有真正的 mysql-server,需要 Oracle 的配置包:

bash
1sudo apt update
2sudo apt install -y wget gnupg lsb-release ca-certificates
3
4cd /tmp
5# 版本号以官网为准:https://dev.mysql.com/downloads/repo/apt/
6wget https://dev.mysql.com/get/mysql-apt-config_0.8.34-1_all.deb
7sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.34-1_all.deb

dpkg -i 若弹出交互界面:

  1. 选 MySQL Server & Cluster
  2. 选需要的系列(推荐 mysql-8.4-lts 或 mysql-9.7-lts,按项目要求)
  3. 确认 Debian 代号;若列表暂无 trixie,可选相近的 bookworm,或等官方完整支持后重配
  4. OK 退出

也可事后再改:

bash
1sudo dpkg-reconfigure mysql-apt-config
2sudo apt update

确认源里已是社区版 MySQL,而不是 MariaDB:

bash
1apt-cache policy mysql-community-server
2# Candidate 应来自 repo.mysql.com,而不是 mariadb

安装 MySQL Community Server

bash
1sudo apt update
2sudo apt install -y mysql-community-server

安装过程通常会提示设置 root 密码,直接设为例如 infra123!,认证插件选默认(MySQL 8+ 多为 caching_sha2_password)即可。

若安装未弹窗,装完后再设(见下一节)。

bash
1sudo systemctl enable --now mysql
2sudo systemctl status mysql --no-pager
3mysql --version
4# 应显示 MySQL Community Server,而不是 MariaDB

Debian 13 若启动报缺 libaio.so.1,可先装兼容库并做符号链接后再启:

bash
1sudo apt install -y libaio1t64
2sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 \
3  /usr/lib/x86_64-linux-gnu/libaio.so.1
4sudo systemctl restart mysql

配置 / 修改 MySQL root 密码

做法一:安全脚本

bash
1sudo mysql_secure_installation

按提示设 root 密码、关远程 root、删测试库等。

做法二:已能用 sudo 进库时(临时无密码或 socket)

bash
1sudo mysql
sql
1ALTER USER 'root'@'localhost' IDENTIFIED BY 'infra123!';
2FLUSH PRIVILEGES;
3EXIT;

做法三:忘记密码时(简要)

bash
1sudo systemctl stop mysql
2sudo mysqld --skip-grant-tables --user=mysql &
3mysql -u root
sql
1FLUSH PRIVILEGES;
2ALTER USER 'root'@'localhost' IDENTIFIED BY 'infra123!';
3FLUSH PRIVILEGES;
4EXIT;
bash
1sudo pkill mysqld
2sudo systemctl start mysql

验证:

bash
1mysql -uroot -p'infra123!' -e "SELECT VERSION();"
2# 版本字符串应含 MySQL,不含 MariaDB

建库与业务用户

bash
1mysql -uroot -p'infra123!'
sql
1CREATE DATABASE app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2CREATE USER 'app'@'localhost' IDENTIFIED BY 'infra123!';
3GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
4FLUSH PRIVILEGES;

临时远程连接(MySQL 8.0+)

仅在调试需要时开放,用完立刻收回。MySQL 8.0 要求 先建用户、再授权,不能再写成老的 GRANT ... IDENTIFIED BY 一条龙。

1)允许监听非本机(按需)

bash
1sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

临时改成:

conf
bind-address = 0.0.0.0
bash
1sudo systemctl restart mysql

若开了 UFW,再临时放行(示例):

bash
1sudo ufw allow from 192.168.10.0/24 to any port 3306 proto tcp comment 'temp-mysql'
2sudo ufw reload

2)创建可从任意主机登录的 root(或专用账号)并授权

sql
1-- 1. 先创建用户(8.0 要求分开写)
2CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'infra123!';
3
4-- 2. 再授权
5GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
6
7-- 3. 刷新权限
8FLUSH PRIVILEGES;

更稳妥是用业务账号而不是 root@'%',例如:

sql
1CREATE USER IF NOT EXISTS 'app'@'%' IDENTIFIED BY 'infra123!';
2GRANT ALL PRIVILEGES ON app.* TO 'app'@'%';
3FLUSH PRIVILEGES;

其他机器测试:

bash
1mysql -h <本机局域网IP> -uroot -p'infra123!' -e "SELECT 1;"

3)用完撤销(务必做)

sql
1REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%';
2FLUSH PRIVILEGES;
3
4-- 若不再需要该账号,可直接删掉
5DROP USER IF EXISTS 'root'@'%';
6FLUSH PRIVILEGES;

然后把 bind-address 改回 127.0.0.1 并重启 MySQL;UFW 临时规则也删掉:

bash
1sudo ufw status numbered
2# sudo ufw delete <规则编号>
3sudo systemctl restart mysql

默认只绑本机(日常)

bash
1sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
conf
bind-address = 127.0.0.1
bash
1sudo systemctl restart mysql

apt 方式常用命令

bash
1sudo systemctl restart redis-server
2sudo journalctl -u redis-server -e
3
4sudo systemctl restart mysql
5sudo journalctl -u mysql -e

数据目录默认:/var/lib/mysql/;配置:/etc/mysql/。


方式 B:Docker 安装(固定版本 + datas 持久化)

服务 镜像 宿主机数据 端口 重启策略
MySQL mysql:9.7.2 ~/Workspace/datas/mysql 3306 unless-stopped
Redis redis:8.8.2 ~/Workspace/datas/redis 6379 unless-stopped

准备目录

bash
1mkdir -p ~/Workspace/datas/{mysql,redis}

从旧 volume 迁移时:

bash
1# sudo chown -R 999:999 ~/Workspace/datas/mysql
2# sudo chown -R 999:999 ~/Workspace/datas/redis

MySQL 9.7.2

bash
1docker run -d --name mysql \
2  -p 3306:3306 \
3  -e MYSQL_ROOT_PASSWORD='infra123!' \
4  -v /home/charlie/Workspace/datas/mysql:/var/lib/mysql \
5  --restart unless-stopped \
6  mysql:9.7.2
bash
1docker exec mysql mysqladmin ping -uroot -p'infra123!' --silent
2docker exec -it mysql mysql -uroot -p'infra123!'
sql
1SHOW DATABASES;
2CREATE DATABASE app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

连接:127.0.0.1:3306 / root / infra123!

临时远程时:SQL 与方式 A 的 A7 相同(CREATE USER 'root'@'%' → GRANT → FLUSH;用完 REVOKE / DROP USER)。Docker 侧把端口从 127.0.0.1:3306 临时改成 0.0.0.0:3306(或保持 3306:3306),UFW / DOCKER-USER 同步放开可信网段,用完改回。

Redis 8.8.2

官方镜像不会自动把 REDIS_PASSWORD 变成 requirepass,密码写在参数里,并开 AOF:

bash
1docker run -d --name redis \
2  -p 6379:6379 \
3  -e REDIS_PASSWORD='infra123!' \
4  -v /home/charlie/Workspace/datas/redis:/data \
5  --restart unless-stopped \
6  redis:8.8.2 \
7  --requirepass "infra123!" --appendonly yes
bash
1docker exec redis redis-cli -a 'infra123!' ping
2docker exec redis redis-cli -a 'infra123!' SET hello world
3ls -la ~/Workspace/datas/redis

Docker 运维

bash
1docker ps -a --filter name='mysql|redis'
2docker logs -f mysql
3docker restart mysql redis
4docker stop mysql redis && docker start mysql redis

删容器可保留数据:不要删 ~/Workspace/datas/{mysql,redis}。

从命名卷迁到 datas(可选)

bash
1docker stop mysql
2sudo rsync -aHAX /var/lib/docker/volumes/mysql_data/_data/ \
3  /home/charlie/Workspace/datas/mysql/
4sudo chown -R 999:999 /home/charlie/Workspace/datas/mysql
5docker rm mysql
6# 再按 B2 启动
7docker volume rm mysql_data   # 确认无误后

端口安全

仅本机访问时:

bash
1-p 127.0.0.1:3306:3306
2-p 127.0.0.1:6379:6379

怎么选

需求 建议
系统服务、systemctl 管理、官方 MySQL 方式 A(MySQL APT + Debian Redis)
版本钉死、数据放 Workspace/datas、好搬家 方式 B(Docker)

再次强调:不要用 apt install default-mysql-server,那会变成 MariaDB。

小结

方式 A: Redis → Debian redis-server + requirepass;MySQL → mysql-apt-config + mysql-community-server,安装时或 ALTER USER / mysql_secure_installation 设 root 密码。

方式 B: mysql:9.7.2 / redis:8.8.2,密码用环境变量或 --requirepass,数据 bind 到 ~/Workspace/datas,--restart unless-stopped。