MySQL コンテナの起動障害の回復に関連する問題を分析する

藏色散人
リリース: 2021-09-13 16:45:46
転載
3834 人が閲覧しました

昨日NASを再起動したところ、今朝またNASがクラッシュしていることがわかりました。強制的にシャットダウンして再起動することのみ可能です。
Docker コンテナを開始する前に、mysql コンテナのメモリを 512M に調整しました。その後、残念なことに、起動できないことがわかりました。後でわかったのですが、起動できなかったのは私がメモリを調整したせいではなかったのです。

ログを表示すると、次のように表示されます:

2020-12-27T02:43:53.375776Z 0 mysqld: [警告] 世界中で書き込み可能な設定ファイル '/etc/mysql/my .cnf' は無視されます。
2020-12-27T02:43:53.375776Z 0 mysqld: '/var/lib/mysql-files' の realpath() でエラーが発生しました (エラー 2 - そのようなファイルまたはディレクトリはありません)
2020-12 -27T02:43:53.375776Z 0 [エラー] [MY-010095] [サーバー] --secure-file-priv のディレクトリにアクセスできませんでした。ディレクトリが存在し、MySQL サーバーからアクセスできることを確認してください。 value : /var /lib/mysql-files
2020-12-27T02:43:53.376005Z 0 [ERROR] [MY-010119] [Server] Aborting

Baidu、解決策は再実行です。 mysql コンテナを実行し、 -v /mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/ を前の設定に追加します。

ここで問題が発生します。以前に mysql コンテナを実行したとき、完全な実行コマンドを記録しませんでした。幸いなことに、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
ログイン後にコピー

次の方法を使用して mysqld を root モードで起動します

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 でのみ強制的に中断できます。 Baidu で検索したところ、この問題を解決するには 2 つの方法があります。

1 mysql を参照してください [エラー] InnoDB: ./ibdata1 をロックできません、エラー: 11
この記事の分析によると、エラーは次のとおりです。主に次の 2 つの理由が考えられますが、残念ながら、この記事の方法では問題を解決できません。

  1. ディスク容量ディレクトリが不十分です
  2. ibdata1 ファイルが他のプロセスによって占有されています

2 mysqld レポートを参照してください InnoDB: 使用不可./ibdata1 をロックするエラー: 11この記事は私の問題を完全に解決しました。主に以下の操作を行いました。

2.1 まず、mysql データベースが存在するディレクトリを入力します。
cd /mnt/md0/User/wzp/home/www/mysql

2.2 次に、 change ibdata1 ファイルの名前を変更した後、再度 cp を戻します。なぜこれが正確に行われるのか、私にはよくわかりません。

[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.3 次に、以前の mysql2 コンテナを削除し、次のコマンドで mysql2 コンテナを再度実行すると、mysql データベースに接続できることがわかりました。

[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;
ログイン後にコピー

mysql コンテナの準備ができたら、すべてがうまくいくと思いますか?いや、世間知らずすぎます! またエピソードが待っています。ここで mysql コンテナを解決したところ、突然、理由もなく wiki コンテナが見つからないことに気づきました。幸いなことに、データベース ファイルはそこにあるので、すべてを以前のように復元できます。

1 次のコマンドを使用して 2 つの新しい Wiki を作成します

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
ログイン後にコピー

2 次に、バックアップした LocalSettings.php ファイルとロゴ画像をコンテナにコピーすれば完了です。

PS、メモリ制限の設定など、docker gui インターフェイスで停止状態コンテナーを編集すると、実際には同じ名前の新しいコンテナーが作成されます。これを実行した後、Wiki にアクセスすると再インストールを求められることが判明したためです。

追記、mysql バックアップは直ちに議題に載せる必要があります。 mysql のメモリ制限はコンテナだけでは制限できないため、それに応じて my.cnf も変更する必要があります。

推奨学習: 「mysql ビデオ チュートリアル

以上がMySQL コンテナの起動障害の回復に関連する問題を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!