无法在Windows 10上初始化MySQL数据库

时间:2018-01-13 12:02:14

标签: mysql docker laradock

使用Laradock

系统信息:

  • Docker版本:17.10.0-ce,build f4ffd25
  • 操作系统:Windows 10 Home

当我运行docker-compose up -d mysql时,我收到了错误消息。以下是泊坞日志

  

[注意]基础设置为/ usr /

     

[警告]语法' - symbolic-links / -s'已弃用,将在以后的版本中删除

     

[警告]' NO_ZERO_DATE',' NO_ZERO_IN_DATE'和' ERROR_FOR_DIVISION_BY_ZERO' sql模式应该与严格模式一起使用。它们将在未来版本中与严格模式合并。

     

[错误] - 指定了初始化但数据目录中包含文件。中止。

     

[错误]正在中止

我尝试删除mysql下的~/.laradock\data文件夹并且无法正常工作。

更新1

laradock Dockerfile下的MySQL容器

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 Dockerfile

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

删除mysql下的~/.laradock/data文件夹后,我收到了以下错误消息。在命令之后,它生成下图中的文件。当我重新运行上面提到的上一个错误时。

  

[注意]基础设置为/ usr /

     

[警告]语法&#39; - symbolic-links / -s&#39;已弃用,将在以后的版本中删除

     

[警告]&#39; NO_ZERO_DATE&#39;,&#39; NO_ZERO_IN_DATE&#39;和&#39; ERROR_FOR_DIVISION_BY_ZERO&#39; sql模式应该与严格模式一起使用。它们将在未来版本中与严格模式合并。

     

[警告]设置lower_case_table_names = 2,因为/ var / lib / mysql /的文件系统不区分大小写

     

[警告]您需要使用--log-bin使--log-slave-updates有效。

     

libnuma:警告:/ sys未挂载或无效。假设有一个节点:没有这样的文件或目录   mbind:不允许操作

     

[ERROR]   InnoDB:文件操作中的操作系统错误号22。

     

[错误] InnoDB:错误号22表示   &#39;无效的参数&#39;

     

[错误] InnoDB:文件   ./ib_logfile101:&#39; aio write&#39;返回操作系统错误122.无法继续   操作

     <错误] [错误] InnoDB:不能   继续运作。

enter image description here

**我尝试在Windows 7机器上运行它。

4 个答案:

答案 0 :(得分:20)

禁用AIO

当我从Virtualbox的来宾Debian OS启动容器并在Windows 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 - 不要将数据库保留在本地文件系统上。(可以破坏您的数据库,不推荐)

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

答案 1 :(得分:2)

我的Windows 10企业版遇到了同样的问题,我无法找到完美的解决方案,因为它似乎是我的Windows版本问题 - 我在其他窗口上运行了相同的图像(8&amp; 10专业版) )成功。我的临时工作是完全从docker-compose文件中删除/ var / lib / mysql mount,允许在容器本身中创建和修改数据库数据文件。

我使用kitematics,它会重新启动并重新连接我创建的容器,只要我想在容器上工作,就像容器退出时我不会丢失数据一样。如果你不使用风筝,它就是这样做的。 在运行docker-compose之后,将创建图像并创建一个容器来运行它,我避免在创建的图像上使用run,因为这将创建新的容器 我坚持按顺序运行以下

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>

RESTORE

每当我需要在我的计算机上恢复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

我希望这有助于某人

答案 2 :(得分:1)

我不确定但请尝试此步骤。这是因为数据文件夹。

尝试删除泊坞窗图片。使用 docker images 列出所有图像,然后删除mysql&amp; laradock mysql使用 docker rmi imagename 。不要忘记使用 docker volume rm volumename 删除docker卷 还可以转到 cd~ / .laradock / data 删除mysql文件夹。

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

答案 3 :(得分:0)

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

sudo chmod 400 my.cnf

在运行docker-compose up -d

之前执行此操作