未能在 Windows 10 上初始化 MySQL 数据库

Fails to initialize MySQL database on Windows 10

使用Laradock

系统信息:

当我 运行 docker-compose up -d mysql 时出现错误。以下是 docker 日志

[Note] Basedir set to /usr/

[Warning] The syntax '--symbolic-links/-s' is deprecated and will be removed in a future release

[Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.

[ERROR] --initialize specified but the data directory has files in it. Aborting.

[ERROR] Aborting

我尝试删除 ~/.laradock\data 下的 mysql 文件夹,但没有成功。

更新 1

MySQL laradock下的容器Dockerfile

mysql:
  build:
    context: ./mysql
    args:
      - MYSQL_VERSION=${MYSQL_VERSION}
  environment:
    - MYSQL_DATABASE=${MYSQL_DATABASE}
    - MYSQL_USER=${MYSQL_USER}
    - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    - TZ=${WORKSPACE_TIMEZONE}
  volumes:
    - ${DATA_SAVE_PATH}/mysql:/var/lib/mysql
    - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
  ports:
    - "${MYSQL_PORT}:3306"
  networks:
    - backend

MySQL Docker文件

ARG MYSQL_VERSION=8.0
FROM mysql:${MYSQL_VERSION}

MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>

#####################################
# Set Timezone
#####################################

ARG TZ=UTC
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN chown -R mysql:root /var/lib/mysql/

ADD my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

EXPOSE 3306

更新 2

删除 ~/.laradock/data 下的 mysql 文件夹后,出现以下错误。命令后,它会生成下图中的文件。当我重新运行回馈上面提到的之前的错误时

[Note] Basedir set to /usr/

[Warning] The syntax '--symbolic-links/-s' is deprecated and will be removed in a future release

[Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.

[Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive

[Warning] You need to use --log-bin to make --log-slave-updates work.

libnuma: Warning: /sys not mounted or invalid. Assuming one node: No such file or directory mbind: Operation not permitted

[ERROR] InnoDB: Operating system error number 22 in a file operation.

[ERROR] InnoDB: Error number 22 means 'Invalid argument'

[ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation

[ERROR] InnoDB: Cannot continue operation.

** 我在 windows 7 机器上试过它的工作。

我不确定,但试试这个 step.This 是因为数据文件夹。

尝试删除 docker 图片。使用 docker images 列出所有图像,然后使用 docker rmi imagename[= 删除 mysql & laradock mysql 22=]。不要忘记使用 docker 卷 rm 卷名 删除 docker 卷 同时转到 cd ~/.laradock/data 删除 mysql 文件夹。

然后尝试docker-组合mysql进行调试。如果没有错误,您可以尝试 docker-compose up -d mysql

我的 Windows 10 Enterprise 也有同样的问题,我找不到完美的解决方案,因为它似乎是我的 Windows 版本问题 - 我有 运行同样的图像在其他 windows(8 和 10 专业)上成功。我的临时解决方法是从 docker-compose 文件中完全删除 /var/lib/mysql 挂载,从而允许在容器本身中创建和修改数据库数据文件。

我使用 kitematics,它会在我想在容器上工作时重新启动并重新连接我创建的容器,这样我就不会在容器退出时丢失我的数据。如果你不使用 kitematics 这就是它的作用。 在 运行ning docker-compose 之后,图像将被创建,容器也将被创建到 运行 它,我避免在创建的图像上使用 运行 因为这将创建新容器 我坚持运行按顺序

docker ps -a                 # this command will get container_id of all container, those that are running and those that are not
docker start <container_id>  # start container from background
docker attach <container_id> # attach container to standard input

使用这些 docker 命令,即使在退出并重新启动后,我的数据仍保留在容器中

备份

现在每当我想移动数据时,我都会将我的容器提交到一个图像中并将图像保存到本地存储

docker commit <container_id> <backup_image_name>:<1_31_2017> # I use date to tag it
docker save -o <local_storage_tar_name> <backup_image_name>

恢复

每当我需要在我的计算机上或为新的编程实习生恢复 mysql 容器时

cd <dir_containing_the_tar_file>
docker load -o <local_storage_tar_name> 

此解决方案供您更新

 File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation

我希望这对某人有所帮助

禁用一体机

当我收到 AIO 错误时,这为我修复了它,就像我从 Virtualbox 的来宾 Debian OS 启动容器并在 [=55= 上的共享文件夹上创建数据库文件时所做的那样] 10.

问题似乎是共享文件夹不支持 AIO,或者至少 Windows 的某些版本不支持 AIO。在我的主机崩溃后,我从 Windows 10 Pro 转到 Home 后,这似乎发生在我身上。

详情:

这里有一些选项:

选项 1 - 像这样启动容器:

docker run -it mysql --innodb_use_native_aio=0

选项 2 - 将命令添加到您的 docker-compose 文件:

 command: --innodb_use_native_aio=0

在上下文中,这是我工作的相关部分 docker-compose.yml:

services:
   db:
     image: ${MYSQL_IMAGE}
     command: "--innodb_use_native_aio=0"
     volumes:
       - ${DB_DATA_PATH}:/var/lib/mysql
     ports:
        - ${MYSQL_PORT}:3306

选项 3 -- 在您的构建

中向您的 my.cnf 文件添加一个选项
innodb_use_native_aio=0

选项 4 - 不要将您的数据库保存在本地文件系统上。(会破坏您的数据库,不推荐)

只需删除 docker 配置中包含 mysql 数据库的卷。当然,如果您执行 docker-compose down 或以其他方式破坏您的容器,您的数据库将被删除,就是这样。

除了上面 AndrewD 的响应之外,您还应该更改 my.cnf 的权限,以便在启动时不会被忽略。你可以运行下面的命令,

sudo chmod 400 my.cnf

在运行宁docker-compose up -d

之前做这件事