41、mysql備份工具lvm-snapshot實戰
邏輯卷快照是原卷的另一個訪問路徑,剛建立的邏輯卷快照是沒有資料的,所有的訪問都指向原卷,當原卷中的資料需要修改前,先前資料複製到邏輯卷快照中,
以後訪問資料,未修改的資料來自原卷,被修改過的資料來著邏輯卷快照。邏輯卷快照僅僅是能提供時間一致性的檔案訪問通路。
lvm-snapshot:基於LVM快照的備份
1.事務日誌(ib_logfile#)跟資料檔案必須在同一個捲上,否則無法保證二者在時間點上的一致性
2.建立快照卷之前,要請求mysql的全域性鎖,在快照建立完成之後釋放鎖
3.在請求全域性鎖完成之後,做一次日誌滾動;做二進位制日誌檔案及位置標記(手動進行)
即時點還原場景:
hellodb使用的InnoDB儲存引擎,在做過一次完備後,之後又有過資料的變動,變動後的資料還未來得及做備份,伺服器硬體故障崩潰。
處理過程:
新機器上重新安裝系統,部署mysql資料庫。先用之前的完備做恢復,再根據二進位制日誌進行即時點恢復,恢復系統崩潰時的資料庫狀態。
準備過程
service mysqld stop
vim /etc/my.cnf
log-bin=/mydata/binlog/log-bin
chown -R mysql.mysql /mydata/binlog/
service mysqld restart
sed -i 's/MyISAM/InnoDB/' hellodb.sql
mysql -uroot -p < hellodb.sql
mysql
SHOW DATABASES;
SHOW TABLE STATUS FROM hellodb\G;
備份步驟:
1.請求全域性鎖,並滾動日誌
FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
2.做二進位制日誌檔案及位置標記(手動進行)
mysql -e 'SHOW MASTER STATUS' > /mydata/backups/binlog.pos
cat /mydata/backups/binlog.pos
File Position Binlog_Do_DB Binlog_Ignore_DB
log-bin.000004 107
3.建立快照卷
lvcreate -L 100M -s -n hellodb-snap -p r /dev/mapper/vg_mysql-data
4釋放全域性鎖
mysql
UNLOCK TABLES;
5、插入新資料
mysql
USE hellodb;
CREATE TABLE newtb(ID INT);
INSERT INTO newtb VALUES (1),(2),(3),(4),(5);
SELECT * FROM newtb;
6掛載快照並備份
mount /dev/mapper/vg_mysql-hellodb--snap /mnt/ -o ro
cd /mydata/backups/
tar zcvf all.tar.gz /mnt/*
mysqlbinlog --start-position=107 /mydata/binlog/log-bin.000004 > /mydata/backups/binlog.sql
scp /mydata/backups/all.tar.gz [email protected]:/mydata/backups
scp /mydata/backups/binlog.sql [email protected]:/mydata/backups
umount /mnt
7.備份完成之後,刪除快照卷
lvremove /dev/mapper/vg_mysql-hellodb--snap
在一臺新的機器上恢復
service mysqld stop
rm -rf /mydata/data/*
cd /mydata/data
tar zxvf /mydata/backups/all.tar.gz -C ./
mv mnt/* ./
rm -rf mnt/
service mysqld start
mysql
SET SESSION sql_log_bin=0; (關閉二進位制日誌)
SOURCE /mydata/backups/binlog.sql;
SET SESSION sql_log_bin=1;
恢復注意事項:
1.二進位制日誌儲存好
提取備份之後的所有時間至某sql指令碼中
2,還原資料,修改許可權及屬主屬組等,並啟動mysql
3、做即時點還原
mylvbackup:perl指令碼,快速基於LVM備份mysql