1. 程式人生 > >實現LVM邏輯卷數據庫備份還原,二進制日誌文件分離存放

實現LVM邏輯卷數據庫備份還原,二進制日誌文件分離存放

實現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邏輯卷數據庫備份還原,二進制日誌文件分離存放