未能在 Windows 10 上初始化 MySQL 数据库
Fails to initialize MySQL database on Windows 10
使用Laradock
系统信息:
- Docker 版本:17.10.0-ce,构建 f4ffd25
- OS: Windows 10 家
当我 运行 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
之前做这件事
使用Laradock
系统信息:
- Docker 版本:17.10.0-ce,构建 f4ffd25
- OS: Windows 10 家
当我 运行 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