在使用 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