问题

昨天下午本来要去吃下午茶,然后前端小伙伴突然说接口怎么崩了,我登上sentry一看,报错了

(2005, "Unknown MySQL server host 'mysql' (-3)")

啥意思啊,连不上数据库,host是mysql因为这是在docker环境里

直接ssh连上服务器查看,没啥问题呀,MySQL容器也正常运行着

奇怪

然后我重启了一波docker,结果发现MySQL容器没有正常重启?

手动docker stop一下,再重新docker compose up

结果寄了,服务恢复起来后MySQL数据全没了……

找原因

慌还是有点慌的,毕竟是生产数据,但我心里也明白数据不可能凭空消失,MySQL作为成熟的商用数据库,不可能犯这种低级错误,那问题八成就出在我们自己身上了…

果然,之前使用docker-compose编排容器的时候偷懒,没有给MySQL容器加上volume映射

现在强制stop的时候没有先commit,所以就导致容器数据“丢失”

我这里用了双引号,因为数据也并没有真正丢失,而是变成了一个orphan volume,(没人引用的卷?)

解决

那么情况就清楚了,现在我找到之前MySQL容器用到的这个volume,把里面的数据文件提取出来重新映射就好了

volume文件路径是/var/lib/docker/volumes/

里面有一堆volume文件夹,现在只能一个个慢慢看了

也可以执行du命令,根据大小来做一个预估

最终我找到了一个2.9G的目录,打开看到里面的数据就是MySQL的

那就好办了

cd到这个volume的目录中,把数据文件复制出来

cp -r _data /var/lib/mysql

然后修改之前的docker-compose.yml配置文件

version: "3"
services:
mysql:
image: daocloud.io/mysql
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=1234
expose:
- 3306

添加上volumes配置就好了~

重新启动容器

docker-compose up -V

我一开始不知道要加-V参数,映射了volume之后MySQL还一直没数据

后面看了文档才知道不加-V会一直使用原来的volume

小结

虽然是把数据给恢复起来了,但问题其实还没完全解决,到这里还留下一个疑问:一开始那个故障是怎么来的?MySQL容器为啥会莫名其妙无法连接?

这个问题暂时还不清楚,后续再看看binlog分析一下。

最后,这次出的故障带来几个教训

  • 不要偷懒,volume一定要提前映射好
  • docker知识匮乏,一知半解,得系统学一下
  • docker-compose的管理方式还是比较原始,是不是要找机会上更现代化的容器管理方式?

参考资料

一次生产环境的docker MySQL故障的更多相关文章

  1. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  2. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

  3. 生产环境下,MySQL大事务操作导致的回滚解决方案

    如果mysql中有正在执行的大事务DML语句,此时不能直接将该进程kill,否则会引发回滚,非常消耗数据库资源和性能,生产环境下会导致重大生产事故. 如果事务操作的语句非常之多,并且没有办法等待那么久 ...

  4. 生产环境下的mysql主从复制

    一.主mysql配置:1.配置my.cnf[mysqld]server-id = 10 #服务器标示log-bin= mysql-bin #二进制日志binlog-do-db=mydb #需要同步的数 ...

  5. Redash(开源轻量级商业智能) 生产环境部署及实践 (without docker)

    一直在调研一个轻量级开源的 BI 系统.之前我们生产环境使用的 aliyun 的 QuickBi,也调研了另外一个 airflow 的开源商业智能 superset.不得不承认 QuickBI 正在日 ...

  6. 结合Git实现Mysql差异备份,可用于生产环境

    埋头苦干多年一直没写过文章,今天突发狂想,为LNMP阵营贡献一些力量.就从平时工作过程中的心得和一些技巧分享出来.今天就猿们最熟悉的Mysql开始宅鸟的开篇博客文章.欢迎猿们拍砖.转载. 注意:宅鸟的 ...

  7. Docker标准化开发测试和生产环境

    对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...

  8. 从零搭建生产环境的ghost2.0博客

    当前安装过程是在ghost cli 1.9.2上的,由于ghost更新特别快,我安装我个人博客cmlanche.com的时候还是1.9.1,当时没碰到啥问题,到1.9.2就有一点点不一样了,所以要注意 ...

  9. 生产要不要开启MySQL查询缓存

    一.前言 在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议 ...

随机推荐

  1. 【转载】10个Web3D可视化精彩案例

    1.化学元素周期表 六种排列方式,炫酷动画效果,TWaver 3D轻松实现. 演示地址:http://demo.servasoft.com/che... 2.DNA螺旋图 DNA3D模型,包含几千个球 ...

  2. 手机上无法显示Toast信息

    关于手机上无法显示Toast信息, 是因为手机上的权限没有开, 在应用管理处将所有权限都打开,就可以显示了.

  3. Spark周总结(一)

    本周学习内容: 1.搭建虚拟机Spark环境 2.idea编写Scala脚本并在yarn上运行 总结: 这周是回家第一周,虽然没啥事,但是还是想放松放松,也是万事开头难,跟着教程做,但总有几步跟教程上 ...

  4. Java中数组的定义与使用(代码+例子)

    学习目标: 掌握一维数组的使用 学习内容: 1.一维数组的定义 数组(Array),是把具有 相同类型 的多个常量值 有序组织 起来的一种数据形式.这些按一定顺序排列的多个数据称为数组.而数组中的每一 ...

  5. 基于Apache组件,分析对象池原理

    池塘里养:Object: 一.设计与原理 1.基础案例 首先看一个基于common-pool2对象池组件的应用案例,主要有工厂类.对象池.对象三个核心角色,以及池化对象的使用流程: import or ...

  6. 【图像处理】Golang 获取JPG图像的宽高

    一.背景 有些业务需要判断图片的宽高,来做一些图片相关缩放,旋转等基础操作. 但是图片缩放,旋转,拼接等操作需要将图片从 JPG 格式转成 RGBA 格式操作,操作完毕后,再转回 JPG 图片. 那如 ...

  7. Nuxt 的介绍与安装

    Nuxt.js(一.介绍与安装) 1.为什么使用Nuxt 渐进式Vue.js框架给前后端分离带来无限的乐趣,越来越多的程序员选择Vue.在我们使用Vue框架的过程中不免会出现以下的一些问题: 如何更好 ...

  8. 约定编程与Sping AOP

    一.约定编程 Spring AOP是一种约定流程的编程,咱们可以先通过动态代理模式的实现来理解Spring AOP的概念. 代理的逻辑很简单,例如,当你需要采访一名儿童时,首先需要经过他父母的同意,在 ...

  9. Docker极简入门:使用Docker-Compose 运行网站浏览量统计Demo

    Docker-Compose 是一个可以对 Docker 容器集群的快速编排的工具,能够减轻您心智和手指的负担. 简单的来说 Docker-Compose 就是将你运行多个容器的命令编写到了一起,类似 ...

  10. Infrastructure 知识: DNS 命令: dig, host

    dig 基本用法: dig @server name type 或者用-t type来指定(更常见) dig @server -t type name 例子详解 # 最简单的使用 $ dig www. ...