以下文章來自微信官方賬號——數據與云,作者包楊。
一、概述
如果Linux操作系統宕機,無法啟動,救援安裝的系統不起作用,這臺機器上的MySQL數據還能恢復嗎?如果有,如何恢復?這個問題我們來做個實驗。
二、環境介紹
準備兩臺虛擬機,虛擬機軟件是virtualbox。
IP 192.168.56.81 MySQL在這個虛擬機上運行,然后模擬這個機器崩潰,然后拯救MySQL數據。
“81”上的文件:
“81”上的MySQL數據庫:
IP 192.168.56.71該虛擬機為新機,未來需要將“81”上的數據庫遷移到“71”上。
三、開始實驗
刪除“81”機器上的/boot目錄文件,然后強制重新引導。
此時系統啟動失敗,報錯: file '/grup 2/i386-PC/normal . mod '未找到。
關閉故障虛擬機“81”并選擇強制退出。
將故障虛擬機“81”的硬盤掛載到新虛擬機“71”上,啟動新虛擬機“71”。
從lsblk可以看出,sdb是新掛載的磁盤。
建立一個掛載點,掛載一個新磁盤,并提示mount:未知文件系統類型“lvm2 _ member”
[r
oot@oracletest ~]# mkdir /newmnt[root@oracletest ~]# mount /dev/sdb2 /newmnt
mount: unknown filesystem type 'LVM2_member'
這是因為/dev/sdb2是一個物理卷,不能直接掛載,需要掛載該物理卷對應的邏輯卷。
查看邏輯卷(這個可能需要等一會才查看得到),可以看到LV Status為NOT available。
使用vgchange -ay /dev/vg激活邏輯卷組(vg是邏輯卷組名字),可以看到LV Status為available。
掛載邏輯卷,可以看到文件已經找回來了。
[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 ]
可以看到數據庫的表也找回來了!
四、總結
只要沒有刪除數據庫的數據文件,即使系統起不來了,我們仍然可以將系統的盤拆下來掛到新的機器上,將數據拷貝出來。
養成備份的習慣,正式、仿真、開發、測試環境都需要。
楊豹,國泰君安專職DBA,熱愛Oracle、MySQL數據庫技術,熟悉shell,python編程,熟悉zabbix監控。