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
三、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
(9)查看硬盤使用狀況:# df -Th | grep mariadb
四、兩個節點的服務器時間同步
五、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
# ls -lh /data/binlogs
八、查看192.168.1.145主機的初始二進制日誌信息:
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
九、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;
MariaDB [db]> show master status;
備註:建立測試數據庫和表的操做已記入二進制日誌中
十、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
十二、查看數據目錄大小:# 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;
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
1九、192.168.1.145主機進行增量備份前先滾動二進制日誌,生成一個新文件:
# mysqladmin -uroot -p flush-binary-log
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
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;
2三、查看192.168.1.146主機的初始二進制日誌信息:
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
2四、192.168.1.146主機關閉會話級別二進制日誌:
MariaDB [(none)]> show variables like 'sql_log_bin';
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> show variables like 'sql_log_bin';
2五、192.168.1.146主機導入增量備份incre_2019-05-21.sql,根據二進制日誌進行時間點恢復,將全量備份以後的修改操做進行重放,所有導入操做執行成功後開啓會話級別二進制日誌:
MariaDB [(none)]> source /backup/incre_2019-05-21.sql
MariaDB [db]> select * from tb;
MariaDB [db]> show master status;
備註:二進制日誌中事件位置沒有發生變化,說明導入操做沒有記入二進制日誌中
MariaDB [db]> set sql_log_bin=1;
MariaDB [db]> show variables like 'sql_log_bin';
備註:從快照卷中備份數據,從原卷中讀取二進制日誌