oracle查看数据库是否恢复成功_记一次解决docker下oracle数据库故障事例
一、問題背景:
某個項目的線上環境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.運維操作不規范,如沒有制定妥善的擴容方案,運維人員操作也存在操作風險。
五、寫在最后:
在故障處理期間,相關同事已經做好了數據丟失的心理準備,這種壓力是特別大的。但幸好問題得到解決,數據也沒有丟失。通過此次事件,我也汲取教訓,認真反思和總結,以求工作中避免發生不可挽回的事故。
總結
以上是生活随笔為你收集整理的oracle查看数据库是否恢复成功_记一次解决docker下oracle数据库故障事例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的号怎么老是被封号没有开三方
- 下一篇: 秘密使者剧情介绍