为什么 mysqldump 进入文件在 docker 容器中不起作用(带有不直观的错误消息)?

How come mysqldump into a file doesn't work within the docker container (with an unintuitive error message)?

当使用 mysql:5.7 docker 图像时,我通过执行 exec -it /bin/sh 进入 docker 容器以尝试转储数据库备份。我在 /share 上安装了一个卷,这是我试图保存转储文件的地方。

如果我执行以下操作:

mysqldump -u user -ppassword database

然后我成功地在屏幕上看到了数据库的转储。

如果我执行以下操作:

echo "hello world" > /share/dump.sql

然后我成功看到 /share/dump.sql 文件包含 hello world.

但如果我尝试将其组合成:

mysqldump -u user -ppassword database > /share/dump.sql

然后我得到一个看似无关的错误,说:

Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

显然这不是缺少权限的情况,因为我的 mysqldump 调用没有保存到文件中是有效的。那么,是什么给了?

对于任何想尝试的人,这里是相关的撰写文件:

version: '3.8'

services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./share:/share

volumes:
  db:

根据 mysqldump reference manual 权限要求“并且(从 MySQL 5.7.31 开始)如果未使用 --no-tablespaces 选项则进行处理”。

使用 --no-tablespaces 进行测试:

$ podman run --rm --name mysql57 -e MYSQL_DATABASE=database \
    -e MYSQL_USER=user -e MYSQL_PASSWORD=password \
    -e MYSQL_ROOT_PASSWORD=root -d  mysql:5.7

8411383e46549f4fd028ee27d74b4799f56e4b23b63321e2e445ebd7577bf411

执行官:

root@8411383e4654:/# mysqldump -u user -ppassword --no-tablespaces database
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- MySQL dump 10.13  Distrib 5.7.35, for Linux (x86_64)
--
-- Host: localhost    Database: database
-- ------------------------------------------------------
-- Server version   5.7.35

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2021-10-03  3:20:12

没错,没有错误。