Maison  >  Article  >  base de données  >  Analyser les problèmes liés à la récupération après échec de démarrage du conteneur Mysql

Analyser les problèmes liés à la récupération après échec de démarrage du conteneur Mysql

藏色散人
藏色散人avant
2021-09-13 16:45:463840parcourir

Après avoir redémarré le NAS hier, j'ai constaté que le NAS tombait à nouveau en panne ce matin. Vous pouvez uniquement forcer l'arrêt et redémarrer.
Avant de démarrer le conteneur docker, j'ai ajusté la mémoire du conteneur mysql à 512 Mo. Puis, tragiquement, j'ai découvert qu'il ne pouvait pas démarrer. Plus tard, j'ai découvert que l'échec du démarrage n'était pas dû à un ajustement de la mémoire.

Affichez le journal, l'affichage est le suivant :

2020-12-27T02:43:53.375776Z 0 mysqld : [Avertissement] Le fichier de configuration accessible en écriture mondiale '/etc/mysql/my.cnf' est ignoré.
2020 -12-27T02 :43:53.375776Z 0 mysqld : Erreur sur realpath() sur '/var/lib/mysql-files' (Erreur 2 - Aucun fichier ou répertoire de ce type)
2020-12-27T02:43:53.375776Z 0 [ERREUR] [ MY-010095] [Serveur] Échec de l'accès au répertoire pour --secure-file-priv Veuillez vous assurer que ce répertoire existe et est accessible par le serveur MySQL : /var/lib/mysql-files
2020. -12-27T02 :43:53.376005Z 0 [ERREUR] [MY-010119] [Serveur] Abandon

Baidu, la solution est de réexécuter un conteneur MySQL et d'ajouter -v /mnt/md0 au précédent configuration /User/wzp/home/www/mysql-files:/var/lib/mysql-files/. -v /mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/

现在问题来了,之前run mysql容器时,我并没有记录下完整的run 命令。还好,通过rekcod工具可以查看。更喜的是,这个工具可以通过docker来运行。因为我的NAS的系统不是发行版的linux,npm,yum好多工具都没法安装。

关于rekcod的使用可以参考linuxea:如何复现查看docker run参数命令

简单来说,用法如下:

1 docker 安装rekcod

$ docker pull nexdrew/rekcod
$ alias rekcod="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod"

2 使用方法:

[root@TNAS-012664 ~]# rekcod mysql ==>mysql是我的容器名
docker run --name mysql --runtime runc -v /mnt/md0/User/wzp/home/www/mysql/:/var/lib/mysql -p 3306:3306/tcp --net bridge --restart no -h 39964e9e508a --expose 3306/tcp --expose 33060/tcp -e 'MYSQL_ROOT_PASSWORD=123456' -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' -e 'GOSU_VERSION=1.12' -e 'MYSQL_MAJOR=5.7' -e 'MYSQL_VERSION=5.7.30-1debian10' -d -t -i --entrypoint "docker-entrypoint.sh" mysql 'mysqld'

可以看到我的数据库文件都是放在/mnt/md0/User/wzp/home/www/mysql/目录下,我查看了下该目录文件,数据应该是没有丢失的。

于是,我新建了mysql2 容器,命令如下
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  --name mysql2 -v /mnt/md0/User/wzp/home/www/mysql/:/var/lib/mysql  -v /mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/    mysql

然后,进入mysql2,发现没法连接数据库
docker exec -it mysql2 /bin/bash

查看mysql 状态

root@0e83698acbfb:/# mysqld status
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/docker.cnf' is ignored.
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.
2020-12-27T02:39:41.865252Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-12-27T02:39:41.865455Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 105
2020-12-27T02:39:41.871715Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2020-12-27T02:39:41.872541Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-12-27T02:39:41.872776Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
root@0e83698acbfb:/# Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!^C

用以下方法以root方式启动mysqld

root@0e83698acbfb:/# mysqld --user=root
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/docker.cnf' is ignored.
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.
2020-12-27T02:40:57.169719Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-12-27T02:40:57.169896Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 116
2020-12-27T02:40:57.184807Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-27T02:40:57.241048Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
2020-12-27T02:40:58.241783Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
2020-12-27T02:40:59.242983Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
2020-12-27T02:41:00.244290Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
2020-12-27T02:41:01.245762Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
2020-12-27T02:41:02.247539Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11

屏幕一直打印Unable to lock ./ibdata1 error: 11,只能CTRL-C强制中断。百度了下,有两个方式来解决该问题

1 参考mysql之 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
该文章分析,导致该error主要是以下两个原因,很可惜,文章中的方法并不能解决我的问题。

  1. 磁盘空间目录不足
  2. ibdata1 文件被其他的进程占用

2 参考mysqld报InnoDB: Unable to lock ./ibdata1 error: 11这篇文章完美解决了我的问题。主要进行了以下操作。

2.1 首先,进入我的mysql数据库所在目录
cd /mnt/md0/User/wzp/home/www/mysql

Voici maintenant le problème. Lorsque j'ai exécuté le conteneur MySQL auparavant, je n'ai pas enregistré la commande d'exécution complète. Heureusement, vous pouvez le visualiser via l'outil rekcod. Mieux encore, cet outil peut être exécuté via Docker. Étant donné que mon système NAS n'est pas une distribution Linux, de nombreux outils comme npm et yum ne peuvent pas être installés.

Pour l'utilisation de rekcod, veuillez vous référer à Linuxea : Comment reproduire la commande pour afficher les paramètres d'exécution de Docker

En bref, l'utilisation est la suivante :

1 Docker install rekcod

[root@TNAS-012664 www]# cd /mnt/md0/User/wzp/home/www/mysql/
[root@TNAS-012664 mysql]# ls
 auto.cnf          binlog.index      client-key.pem   dci            '#ib_16384_0.dblwr'   ib_logfile0     mautic               nianbao    performance_schema   robot             shangbiao          undo_001         zeng
 baike             ca-key.pem        company_works    dianzicaipiao  '#ib_16384_1.dblwr'   ib_logfile1     mysql                niuwan     private_key.pem      sara_wiki         sjzt_ry6           undo_002
 bigdatapaltfrom   ca.pem            copyrightdata    gs_data         ib_buffer_pool      '#innodb_temp'   mysql.ibd            pachong    public_key.pem       server-cert.pem   sys                wenshu
 binlog.000001     client-cert.pem   db_huayun        hy_dci_admin    ibdata1              integrate       mysql_upgrade_info   pachong2   qianliu_wiki         server-key.pem    ucenter_huayunyy   yuanqixiaoshuo
[root@TNAS-012664 mysql]# mv ibdata1 ibdata1.bak
[root@TNAS-012664 mysql]# mv ib_logfile0 ib_logfile0.bak
[root@TNAS-012664 mysql]# mv ib_logfile1 ib_logfile1.bak
[root@TNAS-012664 mysql]# cp -a ibdata1.bak ibdata1
[root@TNAS-012664 mysql]# cp -a ib_logfile0.bak ib_logfile0
[root@TNAS-012664 mysql]# cp -a ib_logfile1.bak ib_logfile1

2 Comment utiliser :

[root@TNAS-012664 ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  --name mysql2 -v /mnt/md0/User/wzp/home/www/mysql/:/var/lib/mysql  -v /mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/    mysql
1e031247ea46e82f6205db68e7fb1b55389c87e5e2cb13517f9e1ac17d514509
[root@TNAS-012664 ~]# docker exec -it mysql2 /bin/bash
root@1e031247ea46:/# mysql -uroot -p
mysql: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

Vous pouvez voir mon fichier de base de données. Ils sont tous placés dans le répertoire /mnt/md0/User/wzp/home/www/mysql/. J'ai vérifié les fichiers du répertoire et les données ne doivent pas être perdues.

Donc, j'ai créé un nouveau conteneur mysql2, la commande est la suivante

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 -v /mnt/md0/User/wzp/home /www/mysql /:/var/lib/mysql -v /mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/ mysql

Ensuite, entrez mysql2 et constatez qu'il n'y a pas de Comment se connecter à la base de données
docker exec -it mysql2 /bin/bash

Vérifiez l'état de mysql

docker run --name sarawiki --link mysql2:mysql -p 8086:80 -d sarawang85/mediawiki:1.0.0
docker run --name qianliuwiki --link mysql2:mysql -p 8083:80 -d sarawang85/mediawiki:1.0.0

Utilisez la méthode suivante pour démarrer mysqld en mode root rrreee🎜L'écran continue d'imprimer Impossible de verrouiller Erreur ./ibdata1 : 11. Seul CTRL-C peut forcer une interruption. Après une recherche sur Baidu, il existe deux façons de résoudre ce problème🎜🎜1 Reportez-vous à mysql [ERREUR] InnoDB : Impossible de verrouiller ./ibdata1, erreur : 11🎜L'analyse de cet article montre que l'erreur est principalement due aux éléments suivants deux raisons, ce qui est dommage, la méthode de l'article ne résout pas mon problème. 🎜🎜
  1. Répertoire d'espace disque insuffisant
  2. Le fichier ibdata1 est occupé par d'autres processus
🎜🎜2 Reportez-vous au rapport mysqld InnoDB : Impossible de verrouiller ./ibdata1 erreur : 11Cet ​​article a parfaitement résolu mon problème. Les opérations suivantes ont été principalement réalisées. 🎜🎜2.1 Tout d'abord, entrez dans le répertoire où se trouve ma base de données mysql 🎜cd /mnt/md0/User/wzp/home/www/mysql🎜🎜2.2 Renommez ensuite ibdata1 et les autres fichiers, puis cp-les en retour. Je ne comprends pas très bien pourquoi cela est fait exactement. 🎜rrreee🎜2.3 Ensuite, j'ai supprimé le conteneur mysql2 précédent, j'ai réexécuté un conteneur mysql2 avec la commande suivante et j'ai découvert que je pouvais me connecter à la base de données mysql. 🎜rrreee🎜🎜Vous pensez que tout ira bien une fois le conteneur mysql prêt ? Non, trop naïf ! Il y a un autre épisode qui m'attend. Je viens de résoudre le conteneur mysql ici, et tout à coup j'ai découvert que mon conteneur wiki manquait sans raison. Heureusement, les fichiers de la base de données sont là et tout peut être restauré comme avant. 🎜🎜1 Utilisez les commandes suivantes pour créer deux nouveaux wikis🎜rrreee🎜2 Copiez ensuite le fichier LocalSettings.php sauvegardé et l'image du logo dans le conteneur, et vous avez terminé. 🎜🎜PS, si vous modifiez le conteneur d'état d'arrêt dans l'interface graphique du docker, par exemple en définissant la limite de mémoire, un nouveau conteneur avec le même nom sera en fait créé. Parce que j'ai découvert qu'après avoir fait cela, j'étais invité à réinstaller lorsque j'accédais à mon wiki. 🎜🎜PS encore, la sauvegarde mysql doit être mise à l'ordre du jour immédiatement. La limite de mémoire de MySQL ne peut pas être limitée par le seul conteneur, my.cnf doit également être modifié en conséquence. 🎜🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo mysql🎜"🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer