docker環境下MYSQL PXC叢集熱備份和還原
之前搭建了在docker上搭建了一套MySQL的PXC叢集,當時沒有做備份處理,今天搭建了一套備份方案。
MySQL的資料備份方式有很多種,如自帶的MySQLDUMP命令,或者直接拷貝資料檔案等等方式,但是這些方式都是系統的冷備份,即需要停機服務進行備份,這種方式我沒有采用。
本次備份方案是熱備份,MySQL的熱備份的方式有兩種:1、LVM 2、xtrabackup
lvm是Linux自帶的一種,通過對某一個分割槽建立快照進行備份,所以可以備份多種資料庫。但是缺點是會對資料庫加鎖,使得資料庫在備份區間只讀不可寫,生產環境這是不允許的。
xtrabackup是percona公司的開源免費的MySQL備份工具,在熱備份上不需要鎖表進行備份,所以一般MySQL上備份採用xtrabackup,它還有個優勢是備份資料是被壓縮過的,會減小磁碟壓力。
備份方式兩種:全量、增量,一般一週一次全量備份,一天一次增量備份。
由於PXC安裝在docker上的,備份方式和單機備份有一些差異:
1、備份資料docker服務上需要有資料卷對映到MySQL-PXC的backup備份資料夾。具體在搭建pxc筆記中有。
2、要進入docker中MySQL上安裝xtrabackup進行資料備份,不是在宿主機上安裝
由於PXC各個節點資料節點都是一致的,所以只需要進入一個節點進行備份就行了。
方法:
進入節點 docker exec -it node2 /bin/bash 更新update apt-get update
如果執行這一步update時候報錯,如以下錯誤:
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
這代表進入這個node2服務中的時候沒有許可權操作,所以我們要給到root使用者進入服務
方式:
退出當前服務
ctrl+d
重新以root角色進入docker服務,隨便進入一個節點,這裡我進入node1
docker exec -it -u 0 node1 /bin/bash
執行update更新
apt-get update
安裝xtrabackup
apt-get install percona-xtrabackup-24
安裝完後進行全量備份:
innobackupex --user=root --password=MySQL密碼 /data/backup/full
執行完後自動開始全量備份
檢查全量備份:
切換到全量備份資料夾
cd /data/backup/full
檢視
ls
退出docker服務,由於有目錄對映,所以宿主機上也會看到檔案,具體方法:
檢視宿主機備份的資料目錄在哪:
docker inspect backup
切換到該資料夾
cd /var/lib/docker/volumes/backup/_data
檢視
ls
發現有backup目錄,進入backup目錄裡面的full目錄中檢視,發現有全量備份檔案
全量備份完成。
還原:
MySQL的資料還原方式不像備份一樣,MySQL資料還原只有冷還原,docker服務和單機節點差異是,docker還原的時候需要把docker的PXC叢集解散掉,刪除各個節點,之後新建一個新的節點並 進行冷還原,最後新建其他節點和當前節點進行資料同步;
docker stop掉各個節點
docker rm刪掉各個節點
docker volume rm刪掉各個資料卷,這裡刪掉的是pxc服務的資料卷不是backup備份檔案資料卷,千萬別用刪除孤卷命令,因為解散pxc後backup卷也是孤捲了,刪除孤卷命令會把備份資料也刪掉了
新建一個新節點,命令和搭建pxc叢集一致
進入該節點
docker exec -it -u 0 node1 bash
安裝xtrabackup
執行MySQL資料清空指令
rm -rf /var/lib/mysql/*
執行還原命令
innodackupex --user=root --password=密碼 --apply-back /data/backup/full/備份檔名/
這裡的--apply-back引數指的是回滾掉全量備份之間產生的事務差異資料
退出容器,重啟docker節點
之後在搭建其他的節點即完成冷還原