Heim  >  Artikel  >  Datenbank  >  Analysieren Sie Probleme im Zusammenhang mit der Wiederherstellung nach Startfehlern von MySQL-Containern

Analysieren Sie Probleme im Zusammenhang mit der Wiederherstellung nach Startfehlern von MySQL-Containern

藏色散人
藏色散人nach vorne
2021-09-13 16:45:463769Durchsuche

Nachdem ich gestern das NAS neu gestartet habe, stellte ich fest, dass das NAS heute Morgen erneut abgestürzt ist. Sie können nur das Herunterfahren und einen Neustart erzwingen.
Bevor ich den Docker-Container startete, habe ich den Speicher des MySQL-Containers auf 512 MB angepasst. Dann stellte ich tragischerweise fest, dass es nicht gestartet werden konnte. Später stellte ich fest, dass der Startfehler nicht daran lag, dass ich den Speicher angepasst hatte.

Sehen Sie sich das Protokoll an, die Anzeige sieht wie folgt aus:

2020-12-27T02:43:53.375776Z 0 mysqld: [Warnung] Die von der Welt beschreibbare Konfigurationsdatei „/etc/mysql/my.cnf“ wird ignoriert.
2020 -12-27T02 :43:53.375776Z 0 mysqld: Fehler bei realpath() auf '/var/lib/mysql-files' (Fehler 2 – Keine solche Datei oder kein solches Verzeichnis)
2020-12-27T02:43:53.375776Z 0 [FEHLER] [ MY-010095] [Server] Fehler beim Zugriff auf das Verzeichnis für --secure-file-priv. Stellen Sie sicher, dass das Verzeichnis existiert und für den MySQL-Server zugänglich ist: /var/lib/mysql-files
2020 -12-27T02 :43:53.376005Z 0 [FEHLER] [MY-010119] [Server] Abbruch

Baidu, die Lösung besteht darin, einen MySQL-Container erneut auszuführen und -v /mnt/md0 zum vorherigen hinzuzufügen Konfiguration /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

Jetzt kommt das Problem, als ich den MySQL-Container zuvor ausgeführt habe, habe ich den vollständigen Ausführungsbefehl nicht aufgezeichnet. Glücklicherweise können Sie es über das Rekcod-Tool anzeigen. Noch besser ist, dass dieses Tool über Docker ausgeführt werden kann. Da es sich bei meinem NAS-System nicht um eine Linux-Distribution handelt, können viele Tools wie npm und yum nicht installiert werden.

Informationen zur Verwendung von rekcod finden Sie unter Linuxea: So reproduzieren Sie den Befehl zum Anzeigen der Docker-Laufparameter

Kurz gesagt ist die Verwendung wie folgt:

1 Docker installiert 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 Verwendung:

[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;

Sie können meine Datenbankdatei sehen. Sie sind alle im Verzeichnis /mnt/md0/User/wzp/home/www/mysql/ abgelegt. Ich habe die Verzeichnisdateien überprüft und die Daten sollten nicht verloren gehen.

Also habe ich einen neuen MySQL2-Container erstellt, der Befehl lautet wie folgt

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

Dann geben Sie ein mysql2 und stellen Sie fest, dass es keine Anleitung zum Herstellen einer Verbindung zur Datenbank gibt.
docker exec -it mysql2 /bin/bash

Überprüfen Sie den MySQL-Status.

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
rrreee
Der Bildschirm druckt weiterhin. Fehler „./ibdata1“ kann nicht gesperrt werden: 11. Nur STRG-C kann eine Unterbrechung erzwingen. Nach der Suche auf Baidu gibt es zwei Möglichkeiten, dieses Problem zu lösen🎜1 Siehe MySQL [FEHLER] InnoDB: Sperre ./ibdata1 nicht möglich, Fehler: 11🎜Die Analyse dieses Artikels zeigt, dass der Fehler hauptsächlich auf Folgendes zurückzuführen ist Aus zwei Gründen ist es schade, dass die Methode im Artikel mein Problem nicht löst. 🎜🎜
  1. Unzureichendes Speicherplatzverzeichnis
  2. Die Datei ibdata1 ist von anderen Prozessen belegt
🎜🎜2 Siehe mysqld-Bericht InnoDB: ./ibdata1 konnte nicht gesperrt werden Fehler: 11Dieser Artikel hat mein Problem perfekt gelöst. Die folgenden Operationen wurden hauptsächlich durchgeführt. 🎜🎜2.1 Geben Sie zuerst das Verzeichnis ein, in dem sich meine MySQL-Datenbank befindet. 🎜cd /mnt/md0/User/wzp/home/www/mysql🎜🎜2.2 Benennen Sie dann ibdata1 und andere Dateien um und dann cp sie zurück. Ich verstehe nicht ganz, warum genau das gemacht wird. 🎜rrreee🎜2.3 Dann habe ich den vorherigen MySQL2-Container gelöscht, mit dem folgenden Befehl erneut einen MySQL2-Container ausgeführt und festgestellt, dass ich eine Verbindung zur MySQL-Datenbank herstellen konnte. 🎜rrreee🎜🎜Denken Sie, dass alles gut wird, sobald der MySQL-Container fertig ist? Nein, zu naiv! Es wartet noch eine weitere Folge auf mich. Ich habe gerade den MySQL-Container hier gelöst und plötzlich festgestellt, dass mein Wiki-Container ohne Grund fehlte. Glücklicherweise sind die Datenbankdateien vorhanden und alles kann wie zuvor wiederhergestellt werden. 🎜🎜1 Verwenden Sie die folgenden Befehle, um zwei neue Wikis zu erstellen🎜rrreee🎜2 Kopieren Sie dann die gesicherte LocalSettings.php-Datei und das Logobild in den Container, und schon sind Sie fertig. 🎜🎜PS: Wenn Sie den Stop-State-Container in der Docker-GUI-Schnittstelle bearbeiten, z. B. das Speicherlimit festlegen, wird tatsächlich ein neuer Container mit demselben Namen erstellt. Weil ich festgestellt habe, dass ich, nachdem ich dies getan hatte, beim Zugriff auf mein Wiki zur Neuinstallation aufgefordert wurde. 🎜🎜PS nochmal, MySQL-Backup muss sofort auf die Tagesordnung gesetzt werden. Das MySQL-Speicherlimit kann nicht allein durch den Container begrenzt werden, auch my.cnf muss entsprechend geändert werden. 🎜🎜🎜Empfohlenes Lernen: „🎜MySQL-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonAnalysieren Sie Probleme im Zusammenhang mit der Wiederherstellung nach Startfehlern von MySQL-Containern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen