这篇文章主要介绍了Mysql容器启动失败恢复的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Mysql容器启动失败恢复案例

昨天重启完NAS后,今天早上发现NAS又死机了。只能再次强制关机,重启。
启动docker容器之前,我把mysql容器的内存调整了一下,调整成了512M。 然后就悲剧的发现启动不了了。后来发现,启动不了不是我调内存的关系。

查看日志,显示如下:

2020-12-27T02:43:53.375776Z 0 mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
2020-12-27T02:43:53.375776Z 0 mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2020-12-27T02:43:53.375776Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
2020-12-27T02:43:53.376005Z 0 [ERROR] [MY-010119] [Server] Aborting

百度了下,解决办法是重新run一个mysql容器,并且在之前的配置上加上-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

$dockerpullnexdrew/rekcod$aliasrekcod="dockerrun--rm-v/var/run/docker.sock:/var/run/docker.socknexdrew/rekcod"

2 使用方法:

[root@TNAS-012664~]#rekcodmysql==>mysql是我的容器名dockerrun--namemysql--runtimerunc-v/mnt/md0/User/wzp/home/www/mysql/:/var/lib/mysql-p3306:3306/tcp--netbridge--restartno-h39964e9e508a--expose3306/tcp--expose33060/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:/#mysqldstatusmysqld:[Warning]World-writableconfigfile'/etc/mysql/conf.d/docker.cnf'isignored.mysqld:[Warning]World-writableconfigfile'/etc/mysql/conf.d/mysql.cnf'isignored.2020-12-27T02:39:41.865252Z0[Warning][MY-011070][Server]'Disablingsymboliclinksusing--skip-symbolic-links(orequivalent)isthedefault.Considernotusingthisoptionasit'isdeprecatedandwillberemovedinafuturerelease.2020-12-27T02:39:41.865455Z0[System][MY-010116][Server]/usr/sbin/mysqld(mysqld8.0.20)startingasprocess1052020-12-27T02:39:41.871715Z0[ERROR][MY-010123][Server]Fatalerror:Pleaseread"Security"sectionofthemanualtofindouthowtorunmysqldasroot!2020-12-27T02:39:41.872541Z0[ERROR][MY-010119][Server]Aborting2020-12-27T02:39:41.872776Z0[System][MY-010910][Server]/usr/sbin/mysqld:Shutdowncomplete(mysqld8.0.20)MySQLCommunityServer-GPL.root@0e83698acbfb:/#Fatalerror:Pleaseread"Security"sectionofthemanualtofindouthowtorunmysqldasroot!^C

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

root@0e83698acbfb:/#mysqld--user=rootmysqld:[Warning]World-writableconfigfile'/etc/mysql/conf.d/docker.cnf'isignored.mysqld:[Warning]World-writableconfigfile'/etc/mysql/conf.d/mysql.cnf'isignored.2020-12-27T02:40:57.169719Z0[Warning][MY-011070][Server]'Disablingsymboliclinksusing--skip-symbolic-links(orequivalent)isthedefault.Considernotusingthisoptionasit'isdeprecatedandwillberemovedinafuturerelease.2020-12-27T02:40:57.169896Z0[System][MY-010116][Server]/usr/sbin/mysqld(mysqld8.0.20)startingasprocess1162020-12-27T02:40:57.184807Z1[System][MY-013576][InnoDB]InnoDBinitializationhasstarted.2020-12-27T02:40:57.241048Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:112020-12-27T02:40:58.241783Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:112020-12-27T02:40:59.242983Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:112020-12-27T02:41:00.244290Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:112020-12-27T02:41:01.245762Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:112020-12-27T02:41:02.247539Z1[ERROR][MY-012574][InnoDB]Unabletolock./ibdata1error:11

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

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

磁盘空间目录不足

ibdata1 文件被其他的进程占用

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

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

2.2 然后将ibdata1等文件重命名后,再cp回来。具体为什么要这么做,我也不太明白。

[root@TNAS-012664www]#cd/mnt/md0/User/wzp/home/www/mysql/[root@TNAS-012664mysql]#lsauto.cnfbinlog.indexclient-key.pemdci'#ib_16384_0.dblwr'ib_logfile0mauticnianbaoperformance_schemarobotshangbiaoundo_001zengbaikeca-key.pemcompany_worksdianzicaipiao'#ib_16384_1.dblwr'ib_logfile1mysqlniuwanprivate_key.pemsara_wikisjzt_ry6undo_002bigdatapaltfromca.pemcopyrightdatags_dataib_buffer_pool'#innodb_temp'mysql.ibdpachongpublic_key.pemserver-cert.pemsyswenshubinlog.000001client-cert.pemdb_huayunhy_dci_adminibdata1integratemysql_upgrade_infopachong2qianliu_wikiserver-key.pemucenter_huayunyyyuanqixiaoshuo[root@TNAS-012664mysql]#mvibdata1ibdata1.bak[root@TNAS-012664mysql]#mvib_logfile0ib_logfile0.bak[root@TNAS-012664mysql]#mvib_logfile1ib_logfile1.bak[root@TNAS-012664mysql]#cp-aibdata1.bakibdata1[root@TNAS-012664mysql]#cp-aib_logfile0.bakib_logfile0[root@TNAS-012664mysql]#cp-aib_logfile1.bakib_logfile1

2.3 然后我删除之前的mysql2 container,用下面的命令再次run一个mysql2容器,发现就可以连接mysql数据库了。

[root@TNAS-012664~]#dockerrun-d-p3306:3306-eMYSQL_ROOT_PASSWORD=123456--namemysql2-v/mnt/md0/User/wzp/home/www/mysql/:/var/lib/mysql-v/mnt/md0/User/wzp/home/www/mysql-files:/var/lib/mysql-files/mysql1e031247ea46e82f6205db68e7fb1b55389c87e5e2cb13517f9e1ac17d514509[root@TNAS-012664~]#dockerexec-itmysql2/bin/bashroot@1e031247ea46:/#mysql-uroot-pmysql:[Warning]World-writableconfigfile'/etc/mysql/my.cnf'isignored.Enterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis8Serverversion:8.0.20MySQLCommunityServer-GPLCopyright(c)2000,2020,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>showdatabases;


以为mysql容器好了就万事大吉了? No,too naive! 还有一个小插曲等着我呢。这边刚把mysql容器解决好,突然又发现我的wiki容器莫名其妙没了。不过好在,数据库文件在,一切还能恢复如初。

1 用以下的命令新建两个wiki

dockerrun--namesarawiki--linkmysql2:mysql-p8086:80-dsarawang85/mediawiki:1.0.0dockerrun--nameqianliuwiki--linkmysql2:mysql-p8083:80-dsarawang85/mediawiki:1.0.0

2 然后把备份好的LocalSettings.php 文件和Logo图片copy 进容器,搞定。

PS,如果在docker gui界面编辑stop状态的容器,比如设置内存限制,实际是会新建一个同名的容器。因为我发现我这样做了后,访问我的wiki,又提示我重新安装。

再次PS,mysql 备份得立即提上日程。mysql 内存限制不能单单通过容器来限制,my.cnf也得做响应更改。

感谢你能够认真阅读完这篇文章,希望小编分享的“Mysql容器启动失败恢复的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!