記錄Linux中Mysql恢復xxx_qp.xb格式數據

問題描述:

  • 需要將qp.xb文件內部分數據恢復到數據庫,需要恢復到MySQL中可用,服務器知識趨向于0,摸索進行吧。

思考:

Q:這種qp.xb格式的數據是如何生成的?
A: qp.xb文件生成過程是,先經過 qpress 壓縮,后經過 xbstream 打包。生成的,所以我們還原過程即 先解包再解壓。

Q:既然qp.xb數據是先壓縮再打包形成的,那是通過什么軟件進行的壓縮解壓?
A:Xtrabackup 軟件進行的壓縮,此軟件目前只支持Linux系統(tǒng),所以我們只能在Linux系統(tǒng)云服務器進行此類操作了。

Q:解壓這份數據,都需要哪些過程呢?
A:首先需要準備解壓軟件Xtrabackup,通過此軟件解壓成 frm 和 ibd格式的數據,其次將frm格式數據恢復為Mysql數據可讀的格式即可。

Q:既然只能在Linux系統(tǒng)上面操作,那Linux是什么?我是小白兔,我只是一直聽說服務器服務器,但是并不完全了解到底是什么。。。。
A:簡單說,就是另一臺不同于Win和Macos 系統(tǒng)的電腦。在這里都是通過抽象的命令行對Linux電腦進行操作。下面會介紹如何獲取一臺Linux服務器,如何通過Mac登錄到Linux服務器進行簡單的操作。創(chuàng)建文件夾、下載軟件、安裝軟件等一些簡單操作,來滿足咱們數據恢復。

Linux知識雜學:

  1. 先購買一臺服務器,我們用阿里云的服務器就好了。登錄阿里云官網購買即可,購買后我們登錄到控制條的云服務器ECS創(chuàng)建一個實例(ECS 即 Elastic Compute Service 可彈性伸縮的服務),創(chuàng)建實例后即代表我們擁有了一臺屬于我們自己的Linux服務器,后面我們的操作都在此實例進行,然后對實例進行密碼重置。
  2. 如何操作Linux服務器:我在阿里云那邊創(chuàng)建完成實例、密碼重置后。我該如何在自己Mac電腦上操作這臺Linux服務器呢?我們識別Linux服務器是通過公網IP來識別,就如沒人身份證號一樣,我們通過ssh登錄此ip即可登錄這個服務器。
    登錄服務:ssh root@4.11.2x1.10
  3. 題外話:剛才好奇看了下ssh由來。簡單來說,這些服務器需要通過shell來控制,shell里面封裝了那些常用的命令,常用的bash、zsh、oh my zsh等,ssh就是可以遠程控制shell進而來控制服務器。mac系統(tǒng)子代ssh的終端,win系統(tǒng)自帶的cmd。

用到的命令:

//通過ssh登錄遠程服務器
ssh root@47.11.21x.16x

//啟動mysql
systemctl start mysqld.service

// 查看mysql狀態(tài)
systemctl status mysqld.service

// 登錄數據庫:
mysql -uroot -p

// 查看初始密碼
grep "password" /var/log/mysqld.log

// 修改數據庫密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'testTest11.....';

//創(chuàng)建數據庫
create database prod_coin_db;


// 刪除軟件安裝包緩存
yum clean packages


// 查看現有云盤容量
fdisk -l

// 查詢所有磁盤
df -h

// 內存使用情況,通過m來顯示
free -m

// 當前文件下按大小排序
ls -Shl

// 查看 文件夾下面大小
ls -lh

// 查看Linux下文件的權限
 ls -l


// 查看linux系統(tǒng)版本信息
lsb_release -a

// 刪除某個空文件夾
rmdir  xxx

// 刪除如果不是空文件夾,上面命令會報錯
rm -rf xxxx

// 可以在單個命令中刪除多個目錄,如下面的命令所示。命令刪除所有目錄和它們的子目錄,而不提示刪除。
rm -rf dir1 dir2 dir3

// 可以使用下面的命令來移動目錄內的文件
mv <filename> <path_of _destination_directory>

//復制某個文件到某個文件夾下面.如果文件存在會提示覆蓋
cp address.frm /var/lib/mysql/wordpress/

//復制某個文件夾到某個文件夾下面
cp -r 文件夾A路徑 文件夾B路徑
  • 查看log日志的命令 less命令
// less 打開所需查看文件
less 文件名路徑

//less 翻頁
空格

//less 跳轉到最后一行
shift + g

  • SFTP本地Mac和服務器傳數據相關
// 查看服務器路徑
pwd

//  查看本地電腦路徑
lpwd

// 進入Linux文件方法
cd  xxx

// 進入本地服務文件路徑的方法
lcd  xxx

//上傳本地文件到服務器
put -r * 

get命令
get xxx //xxxxxxlinux 系統(tǒng)中想要下載下來的文件的路徑
get -r xxx 與get xxx不同的是-r可以下載文件夾

途中發(fā)現Linux上面云盤容量不夠,對云盤進行了一次擴容,可是購買擴了容量,可實際可用還是不對,后面根據阿里云官方文檔操作才完成了。

阿里云擴容:https://help.aliyun.com/document_detail/111738.html

qp.xb數據解壓流程

安裝數據庫Mysql

(1) 執(zhí)行以下命令,下載并安裝MySQL。

wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm &&
yum -y install mysql57-community-release-el7-10.noarch.rpm &&
yum -y install mysql-community-server

(2) 執(zhí)行以下命令,啟動MySQL數據庫。

systemctl start mysqld.service

(3) 執(zhí)行以下命令,查看MySQL初始密碼。

grep "password" /var/log/mysqld.log

(4) 執(zhí)行以下命令,登錄數據庫。

mysql -uroot -p

(5) 執(zhí)行以下命令,修改MySQL默認密碼。

set global validate_password_policy=0;  #修改密碼安全策略為低(只校驗密碼長度,至少8位)。
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';

(6) 執(zhí)行以下命令,授予root用戶遠程管理權限。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';

(7) 輸入exit退出數據庫。

systemctl命令管理mysql,簡單貼一下吧。

啟動mysql服務

systemctl start mysqld.service

停止mysql服務

systemctl stop mysqld.service

重啟mysql服務

systemctl restart mysqld.service

查看mysql服務當前狀態(tài)

systemctl status mysqld.service

設置mysql服務開機自啟動

systemctl enable mysqld.service

停止mysql服務開機自啟動

systemctl disable mysqld.service

安裝解壓用到的qpress軟件

wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar"
tar xvf qpress-11-linux-x64.tar
chmod 775 qpress
cp qpress /usr/bin

安裝xtrabackup##

重點:需要先查看自己MySQL版本,根據對應版本安裝對應xtrabackup,否則會由于依賴庫的原因報錯。我之前按照如下版本執(zhí)行,發(fā)現后面版本不匹配而無法使用。(我的MySQL版本 5.7.41 對應下載xtrabackup的2.4.14)

錯誤版本流程:

先下載24-2.4.9-1版本

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
  • 再安裝
 yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

結果發(fā)現無法安裝,報
libgcrypt.so.11(GCRYPT_1.2)(64bit)的錯誤,后面根據如下文章重新安裝了一下。
參照文章:https://blog.csdn.net/qq_34779067/article/details/106193421

(1).先檢查本地是否有l(wèi)ibgcrypt183的安裝包

[root@localhost tools]# rpm -qa |grep libgcrypt
libgcrypt-1.8.3-4.el8.x86_64

(2). 如本地安裝了libgcrypt183,就下載下方的包
https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.14/binary/tarball/percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt183.tar.gz

(3). 剛才下載的tar壓縮包,我們需要解壓配置后再安裝使用

(1) tar xf percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt183.tar.gz
(2) mv percona-xtrabackup-2.4.14-Linux-x86_64 /usr/local/xtrabackup
(3) echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >> /etc/profile
(4) source /etc/profile

(4).檢測是否安裝成功

[root@iZbp125ohgv1547khtesvuZ ~]# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/var/lib/mysql 
xtrabackup version 2.4.14 based on MySQL server 5.7.19 Linux (x86_64) (revision id: ef675d4)

至此所需要的全部軟件安裝完成

本地Mac數據上傳Linux服務器

此次我們使用的SFTP協議進行數據傳輸,SFTP的好處是:對命令和數據進行加密,防止密碼和敏感信息通過網絡公開傳輸
使用SFTP的真正原因是,Mac自帶的terminal可以直接使用SFTP,避免再下FTP客戶端了。

首先使用SFTP登錄服務器

1) 打開terminal
2)點擊上面shell,選擇鏈接遠程服務器

截屏2023-03-08 下午4.55.48.png

3)選擇安全文件傳輸sftp,點擊右邊服務器下的加號添加你要連接的遠程服務器ip地址

截屏2023-03-08 下午4.56.47.png

4)輸入想要連接的ip地址或者服務器名稱


截屏2023-03-08 下午4.57.36.png

5)選中服務器,輸入服務器對應的用戶名,點擊連接。(注意:此處用戶名必須寫root)

截屏2023-03-08 下午4.58.12.png

6)首次連接一個服務器會讓你確認(Are you sure you want to continute connecting(yes/no)),你輸入yes然后回車就可以了

輸入密碼,連接成功

截屏2023-03-08 下午4.59.43.png

接下來就是進行Mac本地和Linux數據傳輸流程

1) 先進入到遠程服務器目錄

截屏2023-03-08 下午5.01.38.png

2)再進入本地要上傳的目錄


截屏2023-03-08 下午5.02.30.png

3)執(zhí)行put命令,將本地文件上傳到遠端


截屏2023-03-08 下午5.03.14.png

開始恢復

_qp.xb 后綴文件執(zhí)行

cat <數據備份文件名> | xbstream -x -v -C /home/mysql/data

(說個有趣的點:原來可以邊解邊刪。由于云盤容量還是不夠,只能解一部分就快速刪除一部分,留下自己需要的表即可)

這里的/home/mysql/data我們沒有這個文件夾,最好就直接先新建一下,這樣后面很多的命令就不用改很多代碼,如果你實在受不了新建這樣一個文件夾,你可以做完之后刪除掉就好了。

你可以cd到你的qp.xb文件的路徑下,或者指定路徑執(zhí)行,這樣執(zhí)行完就會在/home/mysql/data下面有解壓出的文件夾。然后再執(zhí)行解壓

## MySQL 5.6/5.7解壓
innobackupex --decompress --remove-original /home/mysql/data

這個解壓出來的文件還是不能用,后綴還不是frmibd,繼續(xù)解壓

## MySQL 5.6/5.7
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

問題出現:至此我們的數據已經順利解析到 ibd frm 格式,按照下面流程走下去,給mysql設置讀取文件權限,指定數據庫文件就可以看到數據但是,我失敗了。具體原因還在排查,先寫完正常流程吧

這個執(zhí)行完成,應該就是你的數據庫真實的文件了,下面需要把用戶和權限組設置給mysql,這樣啟動起來mysql才有讀寫的權限。

chown -R mysql:mysql /home/mysql/data
mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

這句話理解起來其實很簡單,就是指定配置的啟動MySQL。指定了MySQL的數據庫文件存儲文件夾,這樣就能讀取到你的備份文件了。
但是這里有幾個坑需要注意,?不要試圖把你的備份文件直接拷貝到mysql的本身的數據庫存儲文件夾/var/lib/mysql/,直接替換是不行的。

----------------------------華麗分割線-----------------書接上回 ----------------------------
上次說到,我們給Linux安裝好解壓軟件,已經成功吧qp.xb格式解壓成frm、ibd格式,但是我們給MySQL指定數據庫的時候無法識別,繼續(xù)研究解決吧。

  1. 首先我看了下mysql本身數據庫存儲文件夾/var/lib/mysql里的數據,看到他們格式跟我解壓出來的一樣,但是普遍都多出一個db.opt文件,查了下這個只是存放默認字符集,不影響數據庫運行。

突然想到是不是需要重啟MySQL,學習了下systemctl控制MySQL,然后關閉重啟。發(fā)現報錯如下:

[root@iZbp125ohgv1547khtesv ~]# systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

Linux 重啟MySQL報錯

可由于我的Linux版本是8版本,所以需要 nmcli 命令進行管理網絡。

  1. 雖然服務器重啟問題解決了,但是我還是無法查看我備份出的frm數據庫,我想到把這些數據copy到已有可讀的數據庫下面,然后添加了權限,可是后面發(fā)現雖然數據庫可以讀,但是里面表都無法讀取,不知道什么原因

----------------------------華麗分割線-----------------書接上回 ----------------------------

偶然間發(fā)現切換數據庫指向后重啟數據庫需要輸入密碼,習慣輸了密碼后提示不對,才突然意識到數據庫指向成功了?,F在問題就是找到原密碼,可是原密碼試了好幾個都不對,現在就是繞過這個原密碼看能不能解出數據。
更改了 /etc/my.cnf 路徑下的文件,設置登錄服務器跳過密碼輸入,成功了。在圖書館喜極而泣。。。。。

參考文章:
https://www.cnblogs.com/shenjp/p/16579161.html
https://blog.csdn.net/qq_34779067/article/details/106193421
https://blog.csdn.net/weixin_41979605/article/details/118496138
https://zhuanlan.zhihu.com/p/559462499
可惜密碼一直不對,干脆跳過密碼了
https://blog.csdn.net/beichengqing/article/details/127057564

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容