---
title: 重置 Docker 中 MariaDB 数据库 Root 密码
description: 在使用 Docker 部署 MariaDB 时，如果遗忘了 root 用户的密码…
url: "https://brimflow.xyz/docs/operations/reset-mariadb-root-password-docker/"
updated: "2025-10-19"
category: 运维
---

# 重置 Docker 中 MariaDB 数据库 Root 密码

在使用 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](https://mariadb.com/docs/server/server-management/variables-and-modes/server-system-variables#skip_grant_tables)
