CentOS 7.6基於lvm2快照備份恢復MariaDB

1、lvm快照原理:mysql

當一個snapshot建立時,僅拷貝原卷中數據的元數據,建立時並不會有數據的物理拷貝,所以snapshot的建立幾乎是實時的,當原捲上有寫操做執行時,snapshot跟蹤原卷塊的改變,這時原捲上將要改變的數據在改變以前被拷貝到snapshot預留的空間裏,所以這個原理的實現叫作寫時複製。在寫操做寫入塊以前,將原始數據移動到snapshot空間裏,這樣就保證了全部的數據在snapshot建立時保持一致。而對於snapshot的讀操做,若是讀取數據塊是沒有修改過的,那會將讀操做直接重定向到原捲上,若是要讀取已經修改過的塊,那就讀取拷貝到snapshot中的塊。建立snapshot的大小並不須要和原卷同樣大,其大小僅僅只須要考慮兩個方面:從shapshot建立到釋放這段時間內,估計塊的改變量有多大;數據更新的頻率。一旦snapshot記錄原卷塊變換的信息空間滿了,那這個snapshot馬上被釋放,沒法使用,從而致使這個snapshot無效。sql


2、基於lvm2快照執行備份恢復:shell

一、演示環境:數據庫

IPvim

操做系統服務器

數據庫版本less

安裝方式socket

數據目錄ide

默認存儲引擎測試

角色

192.168.1.145

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

/data/mariadb

InnoDB

備份

192.168.1.146

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

/var/lib/mysql

InnoDB

恢復

二、192.168.1.145主機新增一塊20G硬盤,建立兩個分區/dev/sdb1/dev/sdb2

# fdisk /dev/sdb --> n --> p --> 1 --> 回車 --> +10G --> t --> 8e --> p --> w --> # partx -a /dev/sdb

# fdisk /dev/sdb --> n --> p --> 2 --> 回車 --> 回車 --> t --> 2 --> 8e --> p --> w --> # partx -a /dev/sdb

192.168.1.145主機查看分區狀況:# fdisk -l /dev/sdb

image.png

三、192.168.1.145主機分別建立用於存放數據文件、事務日誌和二進制日誌的邏輯卷:

(1)建立pv# pvcreate /dev/sdb1 /dev/sdb2  # pvs

(2)建立vg# vgcreate myvg /dev/sdb1 /dev/sdb2  # vgs

(3)建立用於存放數據文件和事務日誌的lv# lvcreate -L 8G -n mariadb_data myvg  # lvs

(4)建立用於存放二進制日誌的lv# lvcreate -L 2G -n mariadb_binlogs myvg  # lvs

(5)建立文件系統:# mke2fs -t ext4 /dev/myvg/mariadb_data  # mke2fs -t ext4 /dev/myvg/mariadb_binlogs

(6)建立掛載目錄:# mkdir -pv /data/{mariadb,binlogs}

(7)開機自動掛載:# vim /etc/fstab

/dev/myvg/mariadb_data /data/mariadb ext4 defaults 0 0

/dev/myvg/mariadb_binlogs /data/binlogs ext4 defaults 0 0

(8)掛載分區:# mount -a  # mount | grep mariadb

image.png

(9)查看硬盤使用狀況:# df -Th | grep mariadb

image.png

四、兩個節點的服務器時間同步

五、192.168.1.145主機的server.cnf配置文件以下所示:

# cat /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/data/mariadb

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

log_bin=/data/binlogs/mysql-bin

binlog_format=mixed

sync_binlog=1

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

六、192.168.1.146主機的server.cnf配置文件以下所示:

# cat /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

log_bin=mysql-bin

binlog_format=mixed

sync_binlog=1

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

七、查看相關目錄中的文件:

# ls -lh /data/mariadb

image.png

# ls -lh /data/binlogs

image.png

八、查看192.168.1.145主機的初始二進制日誌信息:

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

九、192.168.1.145主機建立測試數據庫和表:

MariaDB [(none)]> create database db;

MariaDB [(none)]> use db;

MariaDB [db]> create table tb(id int,name varchar(10));

MariaDB [db]> insert into tb values(1,'張三'),(2,'李四'),(3,'王五'),(4,'趙六');

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show master status;

image.png

備註:建立測試數據庫和表的操做已記入二進制日誌中

十、192.168.1.145主機請求在全部表中施加讀鎖,MariaDB數據庫只能讀不能寫:

MariaDB [db]> flush tables with read lock;

十一、192.168.1.145主機滾動二進制日誌文件,並記錄二進制日誌文件及其事件位置:

MariaDB [db]> flush logs;

MariaDB [db]> \! mkdir -pv /backup

新開一個Xshell窗口,執行以下命令:

# mysql -uroot -p -e 'show master status;' > /backup/pos_`date +%F`.txt

# cat /backup/pos_2019-05-21.txt

image.png

十二、查看數據目錄大小:# du -sh /data/mariadb --> 122M

1三、爲邏輯卷建立快照卷:# lvcreate -L 200M -s -p r -n mariadb-snap /dev/myvg/mariadb_data

備註:二進制日誌所在的邏輯卷無需建立快照卷

1四、釋放全局讀鎖:

MariaDB [db]> unlock tables;

1五、掛載快照卷,複製數據至192.168.1.146主機進行備份:

# mount -r /dev/myvg/mariadb-snap /mnt

# ls /mnt

# scp -rp /mnt/* 192.168.1.146:/var/lib/mysql/

1六、192.168.1.146主機修改/var/lib/mysql中子目錄的屬主屬組,並重啓mariadb服務:

# chown -R mysql.mysql /var/lib/mysql

# systemctl restart mariadb.service

1七、備份完成後,192.168.1.145主機刪除快照卷:

# umount /mnt

# lvremove /dev/myvg/mariadb-snap

# lvs

1八、192.168.1.145主機在全量備份後執行以下修改操做:

MariaDB [db]> insert into tb values(5,'jack'),(6,'mary');

MariaDB [db]> delete from tb where id=3;

MariaDB [db]> update tb set name='keyso' where id=2;

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show binary logs;

image.png

MariaDB [db]> show master status;

image.png

1九、192.168.1.145主機進行增量備份前先滾動二進制日誌,生成一個新文件:

# mysqladmin -uroot -p flush-binary-log

MariaDB [db]> show binary logs;

image.png

MariaDB [db]> show master status;

image.png

20、192.168.1.145主機經過mysqlbinlog導出sql語句,進行增量備份:

# mysqlbinlog -uroot -p /data/binlogs/`cat /backup/pos_2019-05-21.txt | grep mysql-bin | awk '{print $1}'` | less

# mysqlbinlog -uroot -p /data/binlogs/`cat /backup/pos_2019-05-21.txt | grep mysql-bin | awk '{print $1}'` > /backup/incre_`date +%F`.sql

2一、192.168.1.145主機/backup目錄中的incre_2019-05-21.sql複製至192.168.1.146主機/backup目錄中:

# scp /backup/incre_2019-05-21.sql root@192.168.1.146:/backup

2二、192.168.1.146主機查看db數據庫中tb表數據:

# mysql -uroot -p

MariaDB [(none)]> select * from db.tb;

image.png

2三、查看192.168.1.146主機的初始二進制日誌信息:

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

2四、192.168.1.146主機關閉會話級別二進制日誌:

MariaDB [(none)]> show variables like 'sql_log_bin';

image.png

MariaDB [(none)]> set sql_log_bin=0;

MariaDB [(none)]> show variables like 'sql_log_bin';

image.png

2五、192.168.1.146主機導入增量備份incre_2019-05-21.sql,根據二進制日誌進行時間點恢復,將全量備份以後的修改操做進行重放,所有導入操做執行成功後開啓會話級別二進制日誌:

MariaDB [(none)]> source /backup/incre_2019-05-21.sql

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show master status;

image.png

備註:二進制日誌中事件位置沒有發生變化,說明導入操做沒有記入二進制日誌中

MariaDB [db]> set sql_log_bin=1;

MariaDB [db]> show variables like 'sql_log_bin';

image.png

備註:從快照卷中備份數據,從原卷中讀取二進制日誌

相關文章
相關標籤/搜索