實現LVM邏輯卷數據庫備份還原,二進制日誌文件分離存放
阿新 • • 發佈:2018-03-09
實現LVM邏輯卷快照數據備份還原首先需要做到的是就是數據庫文件,以及二進制日誌文件全部放在單獨的邏輯卷存儲。
實現LVM邏輯卷,數據,二進制日誌文件分離存放
一,創建邏輯卷步驟
(1),創建新分區
1,查看分區情況看看還剩多少空間
[root@centos7 backup]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 50G 0 part / ├─sda3 8:3 0 2G 0 part [SWAP] └─sda4 8:6 0 1G 0 part /app sr0 11:0 1 8.1G 0 rom #我這個磁盤200G,用了54G,還剩146G
2,創建1個新的分區,當做邏輯卷
fdisk /dev/sda
p 查看分區列表
n 創建分區
根據需要填寫
t 修改id為邏輯卷
8e
p 再次確認
3,同步分區
partprobe #centos7這條命令就可搞定
4,查看分區是否出來
[root@ansible-7 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 50G 0 part / ├─sda3 8:3 0 2G 0 part [SWAP] ├─sda4 8:4 0 512B 0 part ├─sda5 8:5 0 20G 0 part /app └─sda6 8:6 0 10G 0 part sr0 11:0 1 8.1G 0 rom
(2),創建邏輯卷
1,將新分區加入PV卷
#加入pv卷
[root@ansible-7 ~]#pvcreate /dev/sda6
#查看PV卷
[root@ansible-7 ~]#pvs
PV VG Fmt Attr PSize PFree
/dev/sda6 lvm2 --- 10.00g 10.00g
2,將PV卷加入卷組
#加入卷組 [root@ansible-7 ~]#vgcreate vg0 /dev/sda6 #查看卷組 [root@ansible-7 ~]# vgs VG #PV #LV #SN Attr VSize VFree vg0 1 0 0 wz--n- <10.00g <10.00g
3,創建存放數據以及二進制日誌文件的邏輯卷
#1,創建存放數據的邏輯卷
lvcreate -n mysqldata -L 3G vg0
#2,創建存放二進制日誌文件的邏輯卷
lvcreate -n binlog -L 2G vg0
#查看創建情況
[root@ansible-7 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
binlog vg0 -wi-a----- 2.00g
mysqldata vg0 -wi-a----- 3.00g
"註意:PV卷的空間一定不要用完,因為需要有存放快照的空間"
4,創建文件系統
mkfs.xfs /dev/vg0/mysqldata
mkfs.xfs /dev/vg0/binlog
(3),開機自動掛載
1,創建兩個文件分別當掛載點
mkdir -pv /mysql/data
mkdir -pv /mysql/binlog
2,修改/etc/fstab文件
blkid 查看兩個分區的UUID
#將兩分區按照這個順序填寫:UUID 掛載點 文件系統 defaults 0 0 即可
vim /etc/fstab
UUID=d30a59eb-9a20-4376-a6ed-d47cc4d66d05 /mysql/data xfs defaults 0 0
UUID=ef9c6374-a9e0-457f-895a-bf456be0ed96 /mysql/binlog xfs defaults 0 0
3,掛載
[root@ansible-7 ~]# mount -a
[root@ansible-7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 512B 0 part
├─sda5 8:5 0 20G 0 part /app
└─sda6 8:6 0 10G 0 part
├─vg0-mysqldata 253:0 0 3G 0 lvm /mysql/data
└─vg0-binlog 253:1 0 2G 0 lvm /mysql/binlog
sr0 11:0 1 8.1G 0 rom
二,實現數據以及二進制日誌分離
1,修改兩個目錄權限
chown -R mysql.mysql /mysql/
2,修改mysql配置文件
vim /etc/my.cnf
在[mysqld]這個語句塊下修改這兩項
[mysqld]
datadir=/mysql/data
log_bin=/mysql/binlog/mysql-binlog
3,重啟mariadb服務
systemctl restart mariadb
systemctl enable mariadb
4,查看端口是否打開
[root@ansible-7 ~]# ss -ntl |grep 3306
LISTEN 0 50 *:3306 *:*
備份步驟
一,記錄二進制日誌當前備份位置
1,鎖表防止備份時數據變動
flush tables with read lock;
2,記錄二進制日誌文件及事件位置
#1,刷新二進制日誌
flush logs;
#2,查看當前二進制日誌位置
show master status;
MariaDB [(none)]> show master logs;
+---------------------+-----------+
| Log_name | File_size |
+---------------------+-----------+
| mysql-binlog.000001 | 32644 |
| mysql-binlog.000002 | 31231291 |
| mysql-binlog.000003 | 245 |
+---------------------+-----------+
3 rows in set (0.00 sec)
3,將二進制日誌文件當前備份位置存入文件保存,用作以後恢復查看
#1,創建存放備份數據,以及日誌的目錄
[root@ansible-7 data]#mkdir /backup/binlog
[root@ansible-7 data]#mkdir /backup/data
#2,二進制日誌文件當前備份位置存放至/backup/binlog目錄裏
[root@ansible-7 ~]#mysql -uroot -p -e ‘show master logs‘ >/mysql/binlog/pos-`date +%F`.log
[root@ansible-7 ~]# cat /backup/binlog/pos-2018-03-07.log
Log_name File_size
mysql-binlog.000001 32644
mysql-binlog.000002 31231291
mysql-binlog.000003 245
二,創建邏輯卷快照
#1,創建快照
[root@ansible-7 data]#lvcreate -L 3G -s -p r -n mysqldata-snapshoot /dev/vg0/mysqldata
命令解析:
-L:指定邏輯卷大小
-s:指定該邏輯卷是快照
-p:指定權限,r表示只有讀權限
-n:指定該邏輯卷名字
/dav/vg0/mysqldata:表示針對該邏輯卷創建快照
#2,查看快照信息
[root@ansible-7 ~]# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/mysqldata-snapshoot
LV Name mysqldata-snapshoot
VG Name vg0
LV UUID CcaFOb-xLPT-pxh7-K9nP-MQP7-WFDm-gvPthA
LV Write Access read only
LV Creation host, time ansible-7, 2018-03-07 14:30:04 +0800
LV snapshot status active destination for mysqldata
LV Status available
# open 0
LV Size 3.00 GiB
Current LE 768
COW-table size 3.00 GiB
COW-table LE 768
Allocated to snapshot 0.00%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:4
三,釋放數據庫鎖,恢復用戶訪問
unlock tables;
四,掛載快照邏輯卷
#1,創建臨時掛載目錄
[root@ansible-7 data]#mkdir /snapshoot
#2,掛載
[root@ansible-7 data]#mount -o nouuid,norecovery /dev/vg0/mysqldata-snapshoot /snapshoot
"註意:xfs文件系統快照掛載需要指定nouuid,norecovery這兩個選項,ext4不需要"
五,拷貝數據,達到備份目的
tar cvf /backup/data/all-`date +%F`.tar /snapshoot
六,備份完成刪除快照邏輯卷
#1,取消掛載
[root@ansible-7 data]#umount /snapshoot
#2,刪除快照邏輯卷
[root@ansible-7 data]# lvremove /dev/vg0/mysqldata-snapshoot
Do you really want to remove active logical volume vg0/mysqldata-snapshoot? [y/n]: y
Logical volume "mysqldata-snapshoot" successfully removed
三,破壞數據庫還原
(一),停止服務刪除數據存放目錄
systemctl stop mariadb
rm -rf /mysql/data/*
(二),恢復全備份數據
#1,解壓縮
tar vxf /backup/data/all-2018-03-07.tar
#2,復制snapshoot目錄下的所有文件至/mysql/data/目錄下
cp -a snapshoot/* /mysql/data/
(三),用二進制日誌還原至最新狀態
1,查看之前存放在文件裏的備份位置
cat /backup/binlog/pos-2018-03-07.log
Log_name File_size
mysql-binlog.000001 32644
mysql-binlog.000002 31231291
mysql-binlog.000003 245
之前備份的位置是mysql-binlog.000002文件的 31231291位置
所以我們需要將mysql-binlog.000002日誌文件拷貝出來
2,重新生成二進制日誌文件,
MariaDB [(none)]>flush logs
3,查看當前二進制日誌文件位置
MariaDB [(none)]> show master logs;
+---------------------+-----------+
| Log_name | File_size |
+---------------------+-----------+
| mysql-binlog.000001 | 32644 |
| mysql-binlog.000002 | 312312 |
| mysql-binlog.000003 | 1212312 |
| mysql-binlog.000004 | 245 |
+---------------------+-----------+
3 rows in set (0.00 sec)
4,拷貝備份之後的相關二進制日誌文件
cp -a /mysql/binlog/mysql-binlog.000003 /backup/binlog/
cp -a /mysql/binlog/mysql-binlog.000004 /backup/binlog/
5,將之前備份之後的內容取出來
mysqlbinlog --start-position=245 mysql-binlog.000003 >bin.sql
mysqlbinlog mysql-binlog.000004 >> bin.sql
(四),啟動服務
systemctl start mariadb
(五),暫停記錄二進制日誌功能
set sql_log_bin=0;
(六),恢復二進制日誌裏的數據
MariaDB [(none)]> source /backup/binlog/bin.sql
(七),開啟記錄二進制日誌功能
set sql_log_bin=1;
(八),恢復完了就可把拷貝的二進制日誌文件刪掉了,以免影響下次恢復
實現LVM邏輯卷數據庫備份還原,二進制日誌文件分離存放