Mysql - 操作系統宕機,mysql數據找回記錄


一、概述

如果linux操作系統宕機,啟動不了,救援模式(rescue installed system)也行不通的時候,那么該機器上的mysql數據還能恢復嗎?如果能,怎么恢復呢,帶着這個問題做個實驗。
 

二、環境介紹

准備兩台虛擬機,虛擬機軟件為virtualbox
ip 192.168.56.81 該虛擬機上面運行了mysql,后面模擬這個機器奔潰,然后將mysql數據搶救回來
 
81上的文件
1.png
 
81上的mysql數據庫
2.png
 
ip 192.168.56.71 該虛擬機為新機器,后面需要將81上的數據庫遷移到71這個機器上
 

三、開始實驗

刪除81機器上的/boot目錄文件,然后強制重啟
3.png
 
這時候系統就啟動失敗,報error: file '/grup2/i386-pc/normal.mod' not found.
4.png
 
關閉故障虛擬機81,選擇強制退出
5.png
 
將故障虛擬機81的硬盤掛載到新的虛擬機71上,啟動新的虛擬機71
圖片6.png
 
通過lsblk能看到sdb就是新掛載的磁盤
7.1.png
 
建立掛載點,掛載新的磁盤,提示mount: unknown filesystem type 'LVM2_member'

[root@oracletest ~]# mkdir /newmnt
[root@oracletest ~]# mount /dev/sdb2 /newmnt
mount: unknown filesystem type 'LVM2_member'

這是因為/dev/sdb2是一個物理卷,不能直接掛載,需要掛載該物理卷對應的邏輯卷
查看邏輯卷(這個可能需要等一會才查看得到),可以看到LV Status為NOT available
8.png
 
使用vgchange -ay /dev/vg激活邏輯卷組(vg是邏輯卷組名字),可以看到LV Status為available
9.png
 
掛載邏輯卷,可以看到文件已經找回來了

[root@oracletest ~]# mount /dev/vg/lvroot /newmnt
[root@oracletest ~]# cd /newmnt
[root@oracletest newmnt]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@oracletest newmnt]# cd /newmnt/root
[root@oracletest root]# ls
important.txt  install.sh  mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz
[root@oracletest root]# cat important.txt 
this is important text!

 

接下來是恢復mysql數據庫,原理很簡單,跟遷移mysql沒區別,就是將原mysql文件遷移到新的目錄,然后起庫

 
首先在新的虛擬機71上面安裝跟故障虛擬機中相同版本的mysql(安裝過程略)
 
查看原mysql的參數文件,確定mysql日志文件和數據文件的目錄

[root@oracletest root]# cat /newmnt/etc/my.cnf
[mysqld]
# basic settings #
...
basedir = /usr/local/mysql
datadir = /opt/mydata/data
tmpdir = /opt/mydata/tmp
log_bin = /opt/mydata/log/binlog/binlog
...

 
查看原mysql的數據文件

[root@oracletest root]# cd /newmnt/opt/mydata/
[root@oracletest mydata]# ll
total 12
drwxr-xr-x 6 995 1000 4096 Feb 11 14:03 data
drwxr-xr-x 4 995 1000 4096 Feb 11 14:03 log
drwxr-xr-x 2 995 1000 4096 Feb 11 14:03 tmp

 
創建相關目錄

mkdir -p /opt/mydata/data
mkdir -p /opt/mydata/tmp
mkdir -p /opt/mydata/log/binlog
chown -R mysql:mysql /opt/mydata

 
拷貝mysql文件到對應的目錄

cp -r /newmnt/etc/my.cnf /etc
cp -r /newmnt/opt/mydata/data /opt/mydata/
cp -r /newmnt/opt/mydata/log/binlog /opt/mydata/log/
chown -R mysql:mysql /opt/mydata # 這一步的目的是由於原始文件在掛到新的機器上時所屬用戶和所屬組會丟失,需要重新更改成mysql組

 
啟動mysql

[root@oracletest ~]# service mysql start
Starting MySQL.2021-04-08T11:39:26.437943Z mysqld_safe error: log-error set to '/opt/mydata/log/error.log', however file don't exists. Create writable for user 'mysql'.
The server quit without updating PID file (/opt/mydata/data[FAILED]est.pid).

 
報錯,說沒有error.log,那就創建一個,再啟動mysql

[root@oracletest ~]# touch /opt/mydata/log/error.log
[root@oracletest ~]# chown -R mysql:mysql /opt/mydata/log/error.log
[root@oracletest ~]# service mysql start
Starting MySQL..      [  OK  ]

 
可以看到數據庫的表也找回來了
10.png
 

四、總結

  1. 只要沒有刪除數據庫的數據文件,即使系統起不來了,我們仍然可以將系統的盤拆下來掛到新的機器上,將數據拷貝出來
  2. 養成備份的習慣,正式、仿真、開發、測試環境都需要,除非這個庫完全丟了也無所謂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM