>  기사  >  데이터 베이스  >  Mysql 컨테이너 시작 실패 복구 관련 문제 분석

Mysql 컨테이너 시작 실패 복구 관련 문제 분석

藏色散人
藏色散人앞으로
2021-09-13 16:45:463840검색

어제 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 [ERROR] [ MY-010095] [서버] --secure-file-priv에 대한 디렉터리에 액세스하지 못했습니다. 디렉터리가 존재하고 MySQL 서버에서 액세스할 수 있는지 확인하세요. 제공되는 값: /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/. -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

이제 문제가 발생합니다. 이전에 mysql 컨테이너를 실행할 때 전체 실행 명령을 기록하지 않았습니다. 다행히 rekcod 도구를 통해 볼 수 있습니다. 더 좋은 점은 이 도구가 docker를 통해 실행될 수 있다는 것입니다. 내 NAS 시스템은 Linux 배포판이 아니기 때문에 npm 및 yum과 같은 많은 도구를 설치할 수 없습니다.

rekcod 사용은 linuxea: docker run 매개변수를 보는 명령 재현 방법을 참조하세요.

간단히 사용법은 다음과 같습니다.

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 사용 방법:

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

내 데이터베이스 파일을 볼 수 있습니다. 모두 /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 상태를 확인하세요

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

루트 모드에서 mysqld를 시작하려면 다음 방법을 사용하세요 rrreee🎜화면이 계속 인쇄됩니다. ./ibdata1 오류를 잠글 수 없습니다. 11. CTRL-C만 강제로 중단할 수 있습니다. 바이두에서 검색해본 결과, 이 문제를 해결하는 방법은 두 가지가 있습니다🎜🎜1 mysql [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11 참조🎜이 글을 분석해 보면 오류의 원인은 주로 다음과 같습니다. 안타까운 두 가지 이유는 이 기사의 방법으로는 내 문제가 해결되지 않는다는 것입니다. 🎜🎜
  1. 디스크 공간이 부족한 디렉토리
  2. ibdata1 파일이 다른 프로세스에 의해 점유되고 있습니다.
🎜🎜2 mysqld 보고서 참조 InnoDB: Unable to lock ./ibdata1 오류: 11이 기사는 내 문제를 완벽하게 해결했습니다. 주로 다음과 같은 작업을 수행했습니다. 🎜🎜2.1 먼저 내 mysql 데이터베이스가 있는 디렉터리를 입력하세요. 🎜cd /mnt/md0/User/wzp/home/www/mysql🎜🎜2.2 그런 다음 ibdata1 및 기타 파일의 이름을 바꾼 다음 다시 보내주세요. 나는 이것이 정확히 왜 수행되는지 잘 이해하지 못합니다. 🎜rrreee🎜2.3 그러다가 이전 mysql2 컨테이너를 삭제하고 다음 명령어로 mysql2 컨테이너를 다시 실행해보니 mysql 데이터베이스에 접속이 되는 것을 발견했다. 🎜rrreee🎜🎜mysql 컨테이너가 준비되면 모든 것이 괜찮을 것이라고 생각하시나요? 아니, 너무 순진해요! 또 다른 에피소드가 기다리고 있어요. 여기서 방금 mysql 컨테이너를 해결했는데, 갑자기 내 위키 컨테이너가 아무 이유 없이 없어진 것을 발견했습니다. 다행히 데이터베이스 파일이 있고 모든 것이 이전처럼 복원될 수 있습니다. 🎜🎜1 다음 명령을 사용하여 두 개의 새로운 위키를 생성하세요🎜rrreee🎜2 그런 다음 백업된 LocalSettings.php 파일과 로고 이미지를 컨테이너에 복사하면 완료됩니다. 🎜🎜PS, 메모리 제한 설정과 같이 docker gui 인터페이스에서 중지 상태 컨테이너를 편집하면 실제로 동일한 이름의 새 컨테이너가 생성됩니다. 왜냐하면 이 작업을 수행한 후 내 위키에 액세스할 때 다시 설치하라는 메시지가 표시되었기 때문입니다. 🎜🎜PS 다시 말씀드리지만, mysql 백업은 즉시 의제에 포함되어야 합니다. Mysql 메모리 제한은 컨테이너만으로는 제한할 수 없으며 my.cnf도 그에 맞게 변경해야 합니다. 🎜🎜🎜추천 학습: "🎜mysql 비디오 튜토리얼🎜"🎜🎜

위 내용은 Mysql 컨테이너 시작 실패 복구 관련 문제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제