之前搭建了在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節點
之後在搭建其他的節點即完成冷還原