View Categories

重置 Docker 中 MariaDB 数据库 Root 密码

阅读时间: 3 分钟

在使用 Docker 部署 MariaDB 时,如果遗忘了 root 用户的密码,可以通过以下方法进行重置。本文将介绍完整的重置流程,并提供常见问题的解决方案。

前提条件 #

  • 已经安装并运行 Docker 和 MariaDB,例如 mariadb:latest
  • 能够通过 Docker 命令行管理容器,例如:sudo docker ps
  • 本文假设数据目录挂载在宿主机路径:/home/brimflow/mariadb.var-lib-mysql

一、备份数据库目录 #

为防止操作失误,建议先备份数据库目录:

Bash
sudo cp -r /home/brimflow/mariadb.var-lib-mysql /path/to/backup

二、重置密码步骤 #

1. 以安全模式启动临时容器 #

首先停止原 MariaDB 容器:

Bash
sudo docker stop <原容器名或容器ID>

然后,以跳过权限表的方式启动临时容器(mariadb-reset)以绕过密码验证:

Bash
sudo docker run --rm -it \
  --name mariadb-reset \
  -v /home/brimflow/mariadb.var-lib-mysql:/var/lib/mysql \
  --user mysql \
  --entrypoint mariadbd \
  mariadb:latest \
  --skip-grant-tables
  • -v:挂载数据目录,确保与原容器一致。
  • --user mysql:以 mysql 用户(UID 999)运行,避免以 root 运行导致错误。
  • --rm:容器退出后自动删除。
  • --skip-grant-tables:禁用权限检查,允许无密码登录。

启动后,命令行会显示日志并持续运行。日志最后通常显示:

Plaintext
mariadbd: ready for connections.
Version: '11.8.2-MariaDB-ubu2404'  socket: '/run/mysqld/mysqld.sock'  port: 3306

2. 登录 MariaDB 并重置密码 #

在另一个终端,进入临时容器(mariadb-reset)并登录 MariaDB:

Bash
sudo docker exec -it mariadb-reset mariadb

执行以下 SQL 语句重置 root 密码(请将 new-password 替换为你的新密码):

SQL
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password';

退出 SQL 并关闭 MariaDB:

SQL
EXIT;

3. 停止临时容器并启动原容器 #

停止临时容器:

Bash
sudo docker stop mariadb-reset

启动原容器:

Bash
sudo docker start <原容器名或容器ID>

验证新密码:

Bash
sudo docker exec -it <原容器名或容器ID> mariadb -u root -p

输入新密码,确认是否登录成功。

三、常见问题与解决方案 #

问题 1:数据目录权限错误 #

数据目录权限不正确,mysql 用户(UID 999)无权读写。尝试启动临时容器控制台通常会提示错误:

Plaintext
[ERROR] mariadbd: File '/var/lib/mysql/aria_log_control' not found (Errcode: 13 "Permission denied")
[ERROR] InnoDB: The data file './ibdata1' must be writable

检查并设置权限:

Bash
ls -l /home/brimflow/mariadb.var-lib-mysql

sudo chown -R 999:999 /home/brimflow/mariadb.var-lib-mysql
sudo chmod -R u+rwX /home/brimflow/mariadb.var-lib-mysql

然后重新运行临时容器。

问题 2:无法通过 mariadb 客户端登录 #

容器内可能缺少 mariadb 客户端,尝试使用 mysql 命令(兼容 MariaDB):

Bash
sudo docker exec -it <容器名或容器ID> mysql

问题 3:Root 无密码登录不起作用 #

可能的原因:

  • root 用户未使用 unix_socket 认证。
  • 通过 TCP/IP 连接,而非 socket。
  • 容器以 mysql 用户运行,unix_socket 要求 root 系统用户。

检查认证方式:

SQL
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';

启用 unix_socket(本地无密码登录):

SQL
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;
FLUSH PRIVILEGES;

测试本地 socket 登录:

Bash
sudo docker exec -it --user root <容器名或容器ID> mariadb -u root

注意事项 #

  • 备份:操作前始终备份数据目录。
  • 生产环境:避免使用 --skip-grant-tables 或无密码登录,否则数据库将处于极度不安全状态。
  • 版本兼容性:确保使用与原容器相同的 MariaDB 镜像版本(例如 mariadb:11.8.2)。

参考信息

MariaDB Doc:skip_grant_tables

更新 2025-08-17