mysql備份與還原
備份:副本,備份的目的是爲了防止數據丟失或者數據庫出現問題時,進行恢復(備份存放在另一個盤)
備份類型:
熱備份、溫備份和冷備份
熱備份:讀寫不受影響
溫備份:僅可以執行讀操作
冷備份:離線備份,讀寫操作均中止
物理備份與邏輯備份
物理備份:複製數據文件
邏輯備份:將數據導出至文本文件中
完全備份、增量備份和差異備份
完全備份:備份全部數據
增量備份:僅備份上次完全備份或增量備份以後的變化的數據
差異備份:僅備份上次完全備份以後的變化的數據
還原:
備份什麼:以Mysql爲例
數據、配置文件、二進制日誌(用於即時點還原)、事務日誌
熱備份:
MyISAM:溫備份
InnoDB:xtrabackup,mysqldump
Mysql
物理備份:速度快
邏輯備份:速度慢、丟失浮點數精度,方便使用文本處理工具直接對其處理、可移植能力強
備份策略:完全+增量;完全+差異
Mysql備份工具
mysqldump:邏輯備份工具,MyISAM(溫)、InnoDB(熱)
mysqlhotcopy:物理備份工具、溫備份
文件系統工具
cp:冷備
lv:邏輯卷的快照功能,幾乎熱備
mysql>FLUSH TABLES;
mysql>LOCK TABLES
一、mysqldump工具使用
mysqldump直接備份與還原 (mysqldump DB_name [tb1] [tb2]可以備份單個數據庫或表)
[root@shitouji ~]# mysqldump -uroot -p students >students.sql
[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs blog wp_options --single-transaction >/boot/wp_options.sql #備份指定庫某張表
- 單張表的備份可以使用select * into outfile '存放路徑及名稱' from 表名 #select * into outfile '/root/test.txt' from test;
- 還原時使用load data infile '存放路徑及名稱' into table 表名 #load data infile '/root/test.txt' into table test;
[root@shitouji ~]# ls
jiaowu.sql mysql-community-5.7.21-1.el7.src.rpm rpmbuild sh sources students.sql
[root@shitouji ~]# mysql test < students.sql
[root@shitouji ~]# mysql -uroot -p 庫名< students.sql
問:如果備份時,有其它用戶在進行寫時,會帶來什麼問題?
會帶時間點的不一致
因此,要進行加鎖,並且進行二進行日誌滾動(滾動日誌,備份時才知道從什麼時候開始時行)
--master-data={0|1|2}
0:不記錄二進制日誌文件及路位置
1:以CHANGE MASTER TO 的方式記錄位置,可用於恢復後直接啓動從服務
2:以CHANGE MASTER TO 的方式記錄位置,但默認是註釋的
--lock-all-tables:鎖定所有表
--flush-logs:執行日誌flush
如果指定庫中的表類型均爲INNODB,可使用--single-transaction啓動熱備
備份多個庫
--all-databases:備份所有庫
--databases DB_NAME,DB_NAME,...:備份指定庫
--events
--routines
--triggers
備份策略:每週完全+每天增量
完全備份:mysqldump
增量符合:備份二進制日誌文件(先執行flush logs進行日誌滾動)
[root@shitouji data]# mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /boot/alldata.sql
Enter password:
[root@shitouji data]# mysqlbinlog mysql-bin.000001 > /boot/1.sql #二進制日誌備份
如果庫中所有的表都是Innodb引擎,則可以進行熱備份
show table status; #查看庫中所有表的信息(包括表的所用引擎)
[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs --databases blog --single-transaction >/boot/blog.sql
#使用--single-transaction選項時,不需要再使用 --lock-all-tables來鎖定表,--single-transaction選項會自動進行鎖定,在備份時,保存的文件最好是有時間格式/boot/blog`date +%F%H%M%S`.sql
還原操作
[root@shitouji shitouji]# mysql -uroot -p < blog.sql #備份庫還原
二、基於LVM快照備份
前提,數據要在邏輯捲上,且邏輯卷所在的卷組必須有足夠的空間使用快照,.數據文件和事物日誌要在同一個捲上。
原理:LVM中snapshot通過“寫時複製”(copy on write) 來實現,即當一個snapshot創建的時候,僅拷貝原始卷裏數據的元數據(meta-data);創建的時候,並不會有數據的物理拷貝,因此snapshot的創建幾乎是實時的,當原始捲上有寫操作執行時,snapshot跟蹤原始卷塊的改變,這個時候原始捲上將要改變的數據在改變之前被拷貝到snapshot預留的空間裏。
操作步驟:
- 打開會話,施加讀鎖,鎖定所有表
- mysql>flush tables with read lock;
- mysql>flush logs;
- 通過另一個終端,保存二進制日誌文件及相關位置信息
- $mysql -uroot -p -e ‘show master status\G;’ > /path/to/master.info
- 創建快照卷
- #lvcreate -L 50M -s -p r -n lv_name /path/to/source_lv
- -s|--snapshot:指定創建快照
- [-p|--permission {r|rw}]:設定創建的快照具有被讀或讀寫特性
- -n:指定快照名字
- 釋放鎖
- mysql>unlock tables;
- 掛載快照卷,備份
- $mount /path/to/lv_name /mnt
- $cp -a /mysql/* /backup/full-backup
- 刪除快照卷
- umount /mnt
- lvremove --froce /path/to/lv_name
- 增量備份二進制日誌
- $cat /path/to/master.info;查看當前二進制日誌位置
- $mysqlbinlog --start-position=107 mysql-bin.000005 >/backup/bak.sql
- 當一個事務跨越不同的二進制文件時,開啓通過時間備份--start-datetime
- $mysqlbinlog --start-datetime=’2016-05-06 14:55:34’ mysql-bin.00005 mysql-bin.000006 > /backup/bak-`date +%F-%H-%M-%S`.sql
還原:
- $cp -a /backup/fullbak /mysql 注意mysql目錄下的文件屬主是mysql
- $/etc/init.d/mysqld restart
- mysql>set sql_log_bin=0;關閉二進制日誌
- mysql>source /backup/bak-`date +%F-%H-%M-%S`.sql;還原數據
- mysql>set sql_log_bin=1;
xtrabackup工具
xtrabackup 常用選項
- --user =root #使用什麼用戶
- --password= #用戶密碼
- --port= #端口號
- --socket= #套接字
- --target-dir=name #指定備份路徑
--backup #與--target-dir - --copy-back
注意事項,mysql5.7後xtrabackup工具得使用2.4版本及以上,mariadb10.3版本以上,不支持xtarbackup工具,可以使用mariabackup工具
備份innobackupex --port=3306 --socket=/tmp/mysql.sock --user=root --datadir=/app/mysqldb /home/backup
xtrabackup使用參照https://www.cnblogs.com/imweihao/p/7290026.html