一、问题背景:

某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火。我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年。由于宿主机的根目录硬盘空间不够,运维的同事想把oracle数据文件迁移至别的硬盘上。但不知什么原因,容器丢失,运维的同事想重建新的oracle容器。

二、分析问题:

第一步就是看操作历史,以便于全面了解同事都做了哪些操作。通过history命令,分析历史操作,得到以下信息:

1.oracle容器实例是于今年4月份创建,容器名为oracle11g,影射端口为1521,未指定挂载卷;

2.oracle11g容器未被删除,但现在通过docker ps -a却找不到;

3.同事将容器目录下的oradata文件夹mv到了另一块硬盘上;

4.宿主机的根目录空间只剩下3个G;

5.同事尝试创建新的oracle容器,并指定挂载mv出来的数据文件;

仅有数据文件是很难把数据库服务跑起来的,故找回容器oracle11g是解决问题的关键。由于同事已经记录了oracle11g容器的ID,于是找到了容器的所在目录:/mnt/docker-data/containers/,发现容器文件还在。

接着分析历史操作,又发现同事改了docker容器目录containers下oracle11g的hostconfig.json文件,于是推断此项操作是导致容器丢失的关键。

于是,将hostconfig.json文件恢复,重新启动docker服务:

# systemctl restart docker

重启成功之后,通过docker ps -a已经可以找到oracle11g这个容器了。

尝试启动oracle11g:

# docker start oracle11g;

启动成功!于是进入容器,检查数据库状态:

# docker exec -it oracle11g bash   //进入容器
$ source /home/oracle/.bash_profile   //引用环境变量
$ sqlplus / as sysdba   //进入数据库实例
> shutdown immediate //关闭数据库
> startup   //启动数据库

启动数据库时,报错,提示数据文件需要恢复。此问题是由于同事已将容器中的数据文件/oradata通过mv操作转移到了其它硬盘。

至此,问题已很清楚。以下问题需要得到解决:

1.docker的Root_dir是在宿主机的根目录下,目前可用空间仅3G,需要把docker的数据目录改为有更多硬盘空间的目录:/NET_FS;

2.需要根据现有的oracle11g容器创建新的镜像,以通过挂载的方式引用mv出来的数据文件(也可以把数据文件拷备至容器原有的数据文件所在的位置,但是否可行待验证);

三、解决过程:

先解决第2个问题,根据现有容器创建新的镜像:

# docker export oracle11g /NET_FS/oracle11g_image.tar //导出容器,漫长的等待。

容器导出成功后,由于docker所在的文件系统已无多余空间可用,故再调整docker的Root_dir目录:

# systemctl stop docker //停止docker服务;
# cp -R /mnt/docker-data /NET_FS/lib/docker/      //拷备现有的docker数据文件至新的文件系统

整个docker数据文件约100G,经过漫长的等等之后,拷备完成。接下来修改Root_dir参数:

# vim /etc/docker/daemon.json  //添加以下内容
{"data-root": "/NET_FS/lib/docker/docker-data"}

启动docker服务:

# systemctl start docker  //启动服务
# docker info |grep Root   //检验数据文件目录修改是否生效
# docker ps  //查看容器运行状态
# df -h   //也可以通过此命令看到docker的目录已经生效

docker服务正常,其它的容器也正常运行。接下来,将刚才导出的容器,导入为新的镜像:

# cat /NET_FS/oracle11g_image.tar |docker import - oracle11g:v3 //导入容器为镜像
# docker images  //查看镜像,新的镜像已成功添加。

根据镜像创建新的容器,并挂载指定的oracle数据文件:

# docker run -d --name oracle11g_new -p 1521:1521 -v /NET_FS/oradata /oradata oracle11g:v3 /bin/bash 

容器创建成功,接下来进入容器,启动数据库:

# docker exec -it oracle11g_new bash    //进入容器
$ source /home/oracle/.bash_profile   //引用环境变量
$ sqlplus / as sysdba   //进入数据库实例
> shutdown immediate //关闭数据库
> startup   //启动数据库

数据库顺利启动!经过业务验证,系统已经恢复,至此故障得到解决。

四、总结与反思:

通过此次故障修复,有以下几点反思:

1.生产环境的一切操作要谨慎,随时准备好回退方案。如本例中,在转移数据库数据文件时,用的是mv,非cp;

2.除非知道自己在做什么,否则最好考虑清楚再下手。本例中容器的hostconfig.json文件被修改后,导致找不到容器,同事以为容器“丢失”;

3.线上环境没有预先规划好资源。本例中docker是直接安装至根目录下的,但根目录只有50G的空间,对于生产环境来说,这个空间肯定是不够用的。

4.宿主机没有使用LVM逻辑卷管理,导致后期扩容困难。

5.运维操作不规范,如没有制定妥善的扩容方案,运维人员操作也存在操作风险。

五、写在最后:

在故障处理期间,相关同事已经做好了数据丢失的心理准备,这种压力是特别大的。但幸好问题得到解决,数据也没有丢失。通过此次事件,我也汲取教训,认真反思和总结,以求工作中避免发生不可挽回的事故。

.net千万级数据导出_记一次解决docker下oracle数据库故障事例相关推荐

  1. oracle查看数据库是否恢复成功_记一次解决docker下oracle数据库故障事例

    一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...

  2. oracle 数据 导出 excel 自动分多个文件,从oracle数据库中导出大量数据到excel中为什么自动分成了好几个excel文件《excel表格新手入门》...

    EXCEL中一个单元格中多行文本如何导入或复制到SQL SERVER 数据库表中? 保留换行符保存进数据表啊,读取出来显示的时候根据需要进行转换就行了,比如要在网页上显示,可以把换行符转换成HTML的 ...

  3. linux下oracle导出12705,llinux下Oracle数据库的单个表导出导入

    昨晚又是一个晚睡之夜,Oracle数据库,真是不熟,操作也仅限简单的导出导入,建库等!其实只是一个很简单的问题,却一度让我沉思..下面就写下处理过程,供大家参考! 事情的原委是这样:用户的库,要在一个 ...

  4. oracle 在数据库打开状态下进行备份时_下面描述不正确的是,Oracle数据库DBA面试题50道及答案_经典...

    Oracle数据库DBA面试题50道及答案_经典 1. 解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备 ...

  5. oracle左连接没用_一周零基础学完Oracle数据库第三天02

    四. 多表查询 1 什么是多表查询 多表查询:当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询.根据 不同表中的数据之间的关系查询相关联的数据. 多表链接方式: 内连接:连接两个表,通过相 ...

  6. 千万级数据导出Excel

    翻了好久都没找到java 实现easyExcel动态创建sheet,那写一个. 要知道以 .xlsx结尾的excel文件每个sheet 只能写104万左右的数据量, 如果想要写入500W条数据到exc ...

  7. dos导入mysql数据库表_用DOS命令在Linux下mysql数据库的导入导出操作

    模板堂给大家讲解下在linux下导入导出数据库的方法 便于备份ECSHOP数据库: 1.导入数据库 在命令行下输入: mysql -u username -p test 说明:username是数据库 ...

  8. mysql native数据同步_记一次MySQL(5.7版本)数据库的主从同步和备份

    我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像阿 ...

  9. mysql 总停止运行_记一次解决MySQL经常停止运行的问题 | kTWO-个人博客

    问题背景 在多个月之前,也就是服务器刚刚搭建的时候,标题中的MySQL问题就出现了,很是奇怪,博客过一段时间就毫无征兆的挂掉了,提示连接数据库失败,然后重新启动一下MySQL服务就又可以正常运行了.但 ...

最新文章

  1. IEDA与activiti不兼容等等安装错误问题的解决方案
  2. java多线程封装_Java 多线程处理任务的封装
  3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
  4. webpack自动化构建脚本指令npm run dev/build
  5. 手机局域网html,手机遥控电脑开机神器!局域网唤醒App
  6. python3+selenium入门12-警告框处理
  7. 《MLB棒球创造营》:走近棒球运动·洛杉矶天使队
  8. OAI SDR LTE 基站部署
  9. ISO26262-道路车辆功能安全
  10. 12张图带你轻松了解 calico 6种场景下宿主机和pod互访的iptables规则链流转情况【下】
  11. HTML5 Canvas编写五彩连珠(1):预览
  12. 使用飞信api接口实现短信发送(只能发送好友)
  13. 远程桌面协议(RDP)工具 FreeRDP
  14. Elixir-Pattern matching
  15. Java将数字金额转为大写
  16. WebDAV之葫芦儿•派盘+Notability
  17. 好生意还是好故事,这或是快递最后100米的真相
  18. Java抽象类为什么不能被实例化?
  19. HTML圆形立体感轮播图,jQuery超酷响应式圆形图片轮播图特效
  20. 51单片机 Proteus仿真 测烟雾浓度显示 报警器 烟雾报警 PCF8591 MQ-4

热门文章

  1. 【推荐】“水果”公司的复兴 (乔布斯和苹果公司)---Google黑板报
  2. java请求注释_求达人给java代码【注释】!!请求尽量详细,万分感谢!!
  3. dlp防泄密系统卸载_怎样做好数据防泄密?奥赛系统早知道
  4. 小程序中 使用fixed自定义弹窗时,底部长页面禁止滚动
  5. centos7 geenplum5.x postgis开源版本编译
  6. linux基于域的虚拟目录,RHELAS4.0 apache配置之我的小结(虚拟目录,虚拟主机)
  7. static class 静态类(Java)
  8. IDEA全文搜索排除无用的文件夹
  9. cmd oracle 连接实例_C#连接Oracle数据库的实例方法
  10. 2013年c语言课后作业答案,2013年计算机二级C语言课后模拟题三及答案