問題描述:
- 需要將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知識雜學:
- 先購買一臺服務器,我們用阿里云的服務器就好了。登錄阿里云官網購買即可,購買后我們登錄到控制條的云服務器ECS創(chuàng)建一個實例(ECS 即 Elastic Compute Service 可彈性伸縮的服務),創(chuàng)建實例后即代表我們擁有了一臺屬于我們自己的Linux服務器,后面我們的操作都在此實例進行,然后對實例進行密碼重置。
- 如何操作Linux服務器:我在阿里云那邊創(chuàng)建完成實例、密碼重置后。我該如何在自己Mac電腦上操作這臺Linux服務器呢?我們識別Linux服務器是通過公網IP來識別,就如沒人身份證號一樣,我們通過ssh登錄此ip即可登錄這個服務器。
登錄服務:ssh root@4.11.2x1.10 - 題外話:剛才好奇看了下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,選擇鏈接遠程服務器

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

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

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

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

接下來就是進行Mac本地和Linux數據傳輸流程
1) 先進入到遠程服務器目錄

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

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

開始恢復
_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
這個解壓出來的文件還是不能用,后綴還不是frm和ibd,繼續(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ù)研究解決吧。
- 首先我看了下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版本是8版本,所以需要 nmcli 命令進行管理網絡。
- 雖然服務器重啟問題解決了,但是我還是無法查看我備份出的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