web-dev-qa-db-fra.com

N'initialise pas la base de données MySQL sur Windows 10

Utilisation de Laradock

Information système:

  • Version Docker: 17.10.0-ce, build f4ffd25
  • Système d'exploitation: Windows 10 Home

Quand je lance docker-compose up -d mysql Je reçois une erreur. Voici les journaux de docker

[Remarque] Basedir défini sur/usr /

[Avertissement] La syntaxe '--symbolic-links/-s' est déconseillée et sera supprimée dans une prochaine version

[Avertissement] Les modes sql 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' et 'ERROR_FOR_DIVISION_BY_ZERO' doivent être utilisés avec le mode strict. Ils seront fusionnés avec le mode strict dans une future version.

[ERREUR] - initialiser spécifié mais le répertoire de données contient des fichiers. Abandon.

[ERREUR] Abandon

J'ai essayé de supprimer le dossier mysql sous ~/.laradock\data et n'a pas fonctionné.

Mise à jour 1

Conteneur MySQL sous 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 Dockerfile

ARG MYSQL_VERSION=8.0
FROM mysql:${MYSQL_VERSION}

MAINTAINER Mahmoud Zalt <[email protected]>

#####################################
# 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

Mise à jour 2

Après avoir supprimé le dossier mysql sous ~/.laradock/data Je reçois l'erreur suivante. Après la commande, il génère les fichiers dans l'image ci-dessous. Lorsque je réexécute en renvoyant l'erreur précédente mentionnée ci-dessus.

[Remarque] Basedir défini sur/usr /

[Avertissement] La syntaxe '--symbolic-links/-s' est déconseillée et sera supprimée dans une prochaine version

[Avertissement] Les modes sql 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' et 'ERROR_FOR_DIVISION_BY_ZERO' doivent être utilisés avec le mode strict. Ils seront fusionnés avec le mode strict dans une future version.

[Avertissement] Définition de lower_case_table_names = 2 car le système de fichiers pour/var/lib/mysql/ne respecte pas la casse

[Avertissement] Vous devez utiliser --log-bin pour faire fonctionner --log-slave-updates.

libnuma: Attention:/sys non monté ou invalide. En supposant un nœud: aucun fichier ou répertoire de ce type mbind: opération non autorisée

[ERREUR] InnoDB: Erreur du système d'exploitation numéro 22 dans une opération de fichier.

[ERREUR] InnoDB: l'erreur numéro 22 signifie "argument non valide"

[ERREUR] InnoDB: fichier ./ib_logfile101: 'aio write' a renvoyé l'erreur 122. Impossible de continuer l'opération

[ERREUR] InnoDB: impossible de continuer l'opération.

enter image description here

** J'ai essayé dans une machine Windows 7 et son fonctionnement.

11
Saumini Navaratnam

Désactiver AIO

Cela m'a corrigé lorsque j'ai eu l'erreur AIO comme vous l'avez fait lorsque je démarrais un conteneur à partir d'un système d'exploitation Debian invité à partir de Virtualbox et que je créais les fichiers de base de données sur un dossier partagé sur Windows 10.

Le problème semble être que AIO n'est pas pris en charge sur les dossiers partagés, ou au moins sur certaines versions de Windows. Cela semble s'être produit pour moi après que je suis passé de Windows 10 Pro à la maison après la panne de ma machine principale.

Pour plus de détails:

Voici quelques options:

Option 1 - démarrez le conteneur comme ceci:

docker run -it mysql --innodb_use_native_aio=0

Option 2 - ajoutez la commande à votre fichier docker-compose:

 command: --innodb_use_native_aio=0

Dans le contexte, c'est la partie pertinente de mon docker-compose.yml de travail:

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

Option 3 - ajoutez une option à votre fichier my.cnf dans votre build

innodb_use_native_aio=0

Option 4 - Ne persistez pas votre base de données sur le système de fichiers local (peut détruire votre base de données, non recommandé)

Supprimez simplement le volume dans votre configuration de docker qui contient votre base de données mysql. Bien sûr, votre base de données sera supprimée si vous faites un docker-composer ou détruisez votre conteneur, alors voilà.

23
AndrewD

J'ai eu le même problème avec mon Windows 10 Enterprise, je n'ai pas pu trouver de solution parfaite autour car il semble que ce soit mon problème de version Windows - j'ai réussi à exécuter la même image sur d'autres fenêtres (8 et 10 professionnels). Mon travail temporaire a consisté à supprimer le montage/var/lib/mysql entièrement du fichier docker-compose permettant aux fichiers de données de la base de données d'être créés et modifiés dans le conteneur lui-même.

J'utilise des trousses qui vont redémarrer et rattacher mon conteneur créé chaque fois que je veux travailler sur le conteneur, comme ça je ne perds pas mes données lorsque le conteneur se termine. Si vous n'utilisez pas de kitematics, c'est ce qu'il fait. Après avoir exécuté docker-compose, l'image sera créée et un conteneur sera créé pour l'exécuter également, j'évite d'utiliser l'exécution sur l'image créée, car cela créera un nouveau conteneur, je m'en tiens à l'exécution séquentielle suivante

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

Avec ces commandes docker, mes données ont été conservées dans le conteneur même après avoir quitté et redémarré

SAUVEGARDER

Maintenant, chaque fois que je souhaite déplacer les données, je vais valider mon conteneur dans une image et enregistrer l'image dans le stockage local

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>

RESTAURER

Chaque fois que je dois restaurer le conteneur mysql sur mon ordinateur ou pour un nouveau stagiaire en programmation

cd <dir_containing_the_tar_file>
docker load -o <local_storage_tar_name> 

Cette solution est pour votre mise à jour

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

J'espère que cela aide quelqu'un

2
Aderemi Dayo

Je ne suis pas sûr mais essayez cette étape car cela est dû au dossier de données.

Essayez de supprimer l'image docker. Liste toutes les images en utilisant images docker puis supprimez mysql et laradock mysql en utilisant docker rmi imagename. N'oubliez pas de supprimer le volume docker à l'aide de docker volume rm volumename Allez également à cd ~/.laradock/data supprimez le dossier mysql.

Essayez ensuite docker-compose up mysql pour le débogage. Si aucune erreur, vous pouvez essayer docker-compose up -d mysql

1
Decoder

En plus de la réponse ci-dessus par AndrewD , vous devez modifier l'autorisation sur le my.cnf afin qu'il ne soit pas ignoré lors du démarrage. Vous pouvez exécuter la commande ci-dessous,

Sudo chmod 400 my.cnf

Faites-le juste avant d'exécuter docker-compose up -d

0
anabeto93