mysqldump工具實現mysql數據庫的備份還原

簡介

冷、溫、熱備份 冷備:讀寫操做均不可進行 溫備:讀操做可執行;但寫操做不可執行 熱備:讀寫操做都可執行 MyISAM:溫備,不支持熱備 InnoDB:都支持 不論是熱備還原仍是冷備還原,還原時都須要停服務,禁止別人訪問 冷、溫、熱備份 冷備:讀寫操做均不可進行 溫備:讀操做可執行;但寫操做不可執行 熱備:讀寫操做都可執行 MyISAM:溫備,不支持熱備 InnoDB:都支持 不論是熱備還原仍是冷備還原,還原時都須要停服務,禁止別人訪問

備份工具

mysqldump:邏輯備份工具,適用全部存儲引擎,溫備;支持徹底或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份 xtrabackup:由Percona提供支持對InnoDB作熱備(物理備份)的工具,支持徹底備份、增量備份 mysqldump:邏輯備份工具,適用全部存儲引擎,溫備;支持徹底或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份 xtrabackup:由Percona提供支持對InnoDB作熱備(物理備份)的工具,支持徹底備份、增量備份

mysqldump參考

https://dev.mysql.com/doc/refman/5.7/en/mysqldump.htmlhtml

mysqldump通用選項用法

mysqldump須要經過mysql協議鏈接數據庫,因此須要數據的用戶名和密碼而且有必定的權限 數據庫備份還原時,能夠關閉二進制日誌,還原數據庫的過程就是執行相關的sql語句 -B:能夠備份多個數據庫或者備份某一個數據庫 -A:備份全部數據庫(排除information_schema和performance_schema這個兩個數據庫) -E:備份相關的全部event scheduler事件調度(計劃任務) -R:備份全部存儲過程和自定義函數(當有-A選項時,不用加此項) --default-character-set=utf8:指定字符集 --master-data[=#]:此選項須啓用二進制日誌(備份的時候記錄二進制日誌的位置) 當=1時:所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1(CHANGE MASTER TO用於主從複製) 當=2時:有CHANGE MASTER TO語句,可是會被註釋掉;此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除 非開啓--single-transaction) -F:完成備份後生成新的二進制日誌;配合-A或-B選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction或-x, --master-data一塊兒使用實現,此時只刷新一第二天志 --compact:去掉註釋,適合調試,生產不使用 -d:只備份表結構,不備份表數據 -t:只備份數據,不備份create table -n:不備份create database,可被-A或-B覆蓋 --flush-privileges:備份mysql或相關時須要使用;刷新權限,讓權限強制生效 -f:忽略SQL錯誤,繼續執行 --hex-blob:使用十六進制符號轉儲二進制列,當有包括BINARY,VARBINARY,BLOB,BIT的數據類型的列時使用,避免亂碼;備份時若是有二進制數據,把二進制轉 換成十六進制存放在文本中,避免形成數據破壞 -q:不查詢緩存,直接輸出,加快備份速度;mysqldump備份時是執行一條條的select命令,數據庫會默認覺得是查詢數據庫,會走查詢緩存 [root@centos7 ~]# mysqldump -B db2 |gzip > /data/mysql_`date +%F`.sql.gz #備份默認只是在屏幕上打印,須要輸出到文件中,備份文件能夠進行壓縮 mysqldump須要經過mysql協議鏈接數據庫,因此須要數據的用戶名和密碼而且有必定的權限 數據庫備份還原時,能夠關閉二進制日誌,還原數據庫的過程就是執行相關的sql語句 -B:能夠備份多個數據庫或者備份某一個數據庫 -A:備份全部數據庫(排除information_schema和performance_schema這個兩個數據庫) -E:備份相關的全部event scheduler事件調度(計劃任務) -R:備份全部存儲過程和自定義函數(當有-A選項時,不用加此項) --default-character-set=utf8:指定字符集 --master-data[=#]:此選項須啓用二進制日誌(備份的時候記錄二進制日誌的位置) 當=1時:所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1(CHANGE MASTER TO用於主從複製) 當=2時:有CHANGE MASTER TO語句,可是會被註釋掉;此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除 非開啓--single-transaction) -F:完成備份後生成新的二進制日誌;配合-A或-B選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction或-x, --master-data一塊兒使用實現,此時只刷新一第二天志 --compact:去掉註釋,適合調試,生產不使用 -d:只備份表結構,不備份表數據 -t:只備份數據,不備份create table -n:不備份create database,可被-A或-B覆蓋 --flush-privileges:備份mysql或相關時須要使用;刷新權限,讓權限強制生效 -f:忽略SQL錯誤,繼續執行 --hex-blob:使用十六進制符號轉儲二進制列,當有包括BINARY,VARBINARY,BLOB,BIT的數據類型的列時使用,避免亂碼;備份時若是有二進制數據,把二進制轉 換成十六進制存放在文本中,避免形成數據破壞 -q:不查詢緩存,直接輸出,加快備份速度;mysqldump備份時是執行一條條的select命令,數據庫會默認覺得是查詢數據庫,會走查詢緩存 [root@centos7 ~]# mysqldump -B db2 |gzip > /data/mysql_`date +%F`.sql.gz #備份默認只是在屏幕上打印,須要輸出到文件中,備份文件能夠進行壓縮

mysqldump不一樣存儲引擎的不一樣選項用法

MyISAM備份選項:

支持溫備;不支持熱備,不支持事務,因此必須先鎖定要備份的庫,然後啓動備份操做鎖定方法以下: -x:加全局讀鎖,鎖定全部庫的全部表,同時加--singletransaction或--lock-tables選項會關閉此選項功能 -l:對於須要備份的每一個數據庫,在啓動備份以前分別鎖定其全部表,默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會形成數據不一致 注意:以上選項對InnoDB表同樣生效,實現溫備,但不推薦使用 支持溫備;不支持熱備,不支持事務,因此必須先鎖定要備份的庫,然後啓動備份操做鎖定方法以下: -x:加全局讀鎖,鎖定全部庫的全部表,同時加--singletransaction或--lock-tables選項會關閉此選項功能 -l:對於須要備份的每一個數據庫,在啓動備份以前分別鎖定其全部表,默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會形成數據不一致 注意:以上選項對InnoDB表同樣生效,實現溫備,但不推薦使用

InnoDB備份選項:

支持熱備,可用溫備但不建議用 --single-transaction:此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執行START TRANSACTION指令開啓事務;備份前開一個事務,以事務 的方式執行備份,配合可重複讀這個隔離級別(由於是可重複讀的隔離級別,因此在備份期間,雖然用戶有可能會更新數據,但系統備份的 數據仍是在用戶沒有更新數據時的樣子),以此保證備份在同一個時間點;事物能夠撤銷一些DML語言(在開啓事務期間,別人對數據的更 新,事務會自動撤銷,保證數據仍是在開始事務時的最初狀態),但撤銷不了DDL語言(drop、alter、create),隔離級別也同樣隔離不 了DDL語言,好比在別的事務中把表或者庫刪了,當前的事務中也看不到被刪除的表或者庫,因此要確保備份期間其餘鏈接儘可能不使用 DROP、RENAME、ALTER、TRUNCATE操做 此選項和--lock-tables(此選項隱含提交掛起的事務)選項是相互排斥 備份大型表時,建議將--single-transaction選項和--quick(-q)結合一塊兒使用 支持熱備,可用溫備但不建議用 --single-transaction:此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執行START TRANSACTION指令開啓事務;備份前開一個事務,以事務 的方式執行備份,配合可重複讀這個隔離級別(由於是可重複讀的隔離級別,因此在備份期間,雖然用戶有可能會更新數據,但系統備份的 數據仍是在用戶沒有更新數據時的樣子),以此保證備份在同一個時間點;事物能夠撤銷一些DML語言(在開啓事務期間,別人對數據的更 新,事務會自動撤銷,保證數據仍是在開始事務時的最初狀態),但撤銷不了DDL語言(drop、alter、create),隔離級別也同樣隔離不 了DDL語言,好比在別的事務中把表或者庫刪了,當前的事務中也看不到被刪除的表或者庫,因此要確保備份期間其餘鏈接儘可能不使用 DROP、RENAME、ALTER、TRUNCATE操做 此選項和--lock-tables(此選項隱含提交掛起的事務)選項是相互排斥 備份大型表時,建議將--single-transaction選項和--quick(-q)結合一塊兒使用

InnoDB建議備份策略

mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql #-A包含了-E和-R,有-A能夠不加-E、-R mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql #-A包含了-E和-R,有-A能夠不加-E、-R

MyISAM建議備份策略

mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql

mysqldump選擇數據庫進行備份的簡單腳本

方法一

[root@centos7 ~]# vim bakcup_database.sh #一個數據庫作一個備份 #!/bin/bash for db in `mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"`;do mysqldump -B $db | xz > /data/mysql-${db}-`date +%F`.sql.xz done [root@centos7 ~]# chmod +x bakcup_database.sh [root@centos7 ~]# ./bakcup_database.sh [root@centos7 ~]# vim bakcup_database.sh #一個數據庫作一個備份 #!/bin/bash for db in `mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"`;do mysqldump -B $db | xz > /data/mysql-${db}-`date +%F`.sql.xz done [root@centos7 ~]# chmod +x bakcup_database.sh [root@centos7 ~]# ./bakcup_database.sh

方法二

[root@centos7 ~]# mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"|sed -rn "s#(.*)#myqsldump -B \1 | xz > /data/mysql-\1-`date +%F`.sql.xz#p"|bash #sed是逐行進行處理的工具 [root@centos7 ~]# mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"|sed -rn "s#(.*)#myqsldump -B \1 | xz > /data/mysql-\1-`date +%F`.sql.xz#p"|bash #sed是逐行進行處理的工具

增量備份

0表示週日,以此類推;週一在週日徹底備份的基礎上作增量備份,至關於週一備份的是與週日數據發生變化的那部分數據;同理,週二備份的是與週一發生變化的數據;因此週一到週三的增量備份以前沒有對應關係;當週四發生數據庫故障,須要還原數據庫時,須要用到週日的徹底備份和周1、2、三的增量備份,週三和週三之間的數據須要用二進制日誌進行還原 0表示週日,以此類推;週一在週日徹底備份的基礎上作增量備份,至關於週一備份的是與週日數據發生變化的那部分數據;同理,週二備份的是與週一發生變化的數據;因此週一到週三的增量備份以前沒有對應關係;當週四發生數據庫故障,須要還原數據庫時,須要用到週日的徹底備份和周1、2、三的增量備份,週三和週三之間的數據須要用二進制日誌進行還原

差別備份

週日是徹底備份,週一作與週日發送數據變化的備份,週二的差別備份包含了週一的備份,週三的差別備份包含了周1、二的差別備份,因此差別備份是包含關係;當週四數據庫故障,須要備份還原時,須要用到週日的徹底備份和週三的差別備份,週三和週四之間缺乏的數據須要用二進制日誌進行數據還原 週日是徹底備份,週一作與週日發送數據變化的備份,週二的差別備份包含了週一的備份,週三的差別備份包含了周1、二的差別備份,因此差別備份是包含關係;當週四數據庫故障,須要備份還原時,須要用到週日的徹底備份和週三的差別備份,週三和週四之間缺乏的數據須要用二進制日誌進行數據還原

實現mysqldump備份還原

備份

[root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> create db3; #建立庫 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db3 | | mysql | | performance_schema | +--------------------+ MariaDB [(none)]> use db3; MariaDB [(none)]> create table t1(id int); #建立表t1,表內容爲空 [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=2 > /data/all.sql #作徹底備份而且記錄二進制日誌位置 [root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> use db3; MariaDB [db3]> insert t1 value(1),(2),(3); #往t1表裏面插入3條數據 MariaDB [db3]> drop table t1; #刪除t1表,進行還原準備 [root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> create db3; #建立庫 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db3 | | mysql | | performance_schema | +--------------------+ MariaDB [(none)]> use db3; MariaDB [(none)]> create table t1(id int); #建立表t1,表內容爲空 [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=2 > /data/all.sql #作徹底備份而且記錄二進制日誌位置 [root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> use db3; MariaDB [db3]> insert t1 value(1),(2),(3); #往t1表裏面插入3條數據 MariaDB [db3]> drop table t1; #刪除t1表,進行還原準備

還原

還原數據庫時,先中止mysql服務,防止別人訪問,避免產生數據衝突

[root@centos7 ~]# less /data/all.sql #查看徹底備份 -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=411; #找到這行,記錄了二進制日誌的位置,411以前爲作完的徹底備份,411以後則是未作備份(二進制日誌位置根據當時自身服務器的二進制日誌位置而定) [root@centos7 ~]# mysqlbinlog --start-position=411 /var/lib/mysql/mariadb-bin.000001 > /data/logbin.sql #從指定位置導出二進制日誌中的sql語句到一個.sql爲後綴的文件中(作二進制日誌備份) [root@centos7 ~]# vim /data/logbin.sql #編輯導出的文件 DROP TABLE `t1` /* generated by server */ #找到刪除表的那一行,把這行必須刪除;用二進制日誌備份還原數據庫必須刪除針對刪除表或者庫的sql語句,由於刪除表或庫的操做也會記錄到二進制日誌中 [root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> set sql_log_bin=off; #臨時關閉二進制日誌,避免還原過程產生大量的二進制日誌 MariaDB [(none)]> use db3; MariaDB [db3]> source /data/all.sql #先還原徹底備份;建立表是在徹底備份前建立的,往表添加內容是在徹底備份以後操做的,因此不能直接用二進制日誌還原,二進制日誌備份中沒有建立表的操做,須要配合徹底備份 MariaDB [db3]> select * from t1; #徹底備份還原完表的內容是空的 Empty set (0.00 sec) MariaDB [db3]> source /data/logbin.sql #導入二進制日誌備份 MariaDB [db3]> select * from t1; #導入二進制日誌備份以後,恢復 +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ [root@centos7 ~]# less /data/all.sql #查看徹底備份 -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=411; #找到這行,記錄了二進制日誌的位置,411以前爲作完的徹底備份,411以後則是未作備份(二進制日誌位置根據當時自身服務器的二進制日誌位置而定) [root@centos7 ~]# mysqlbinlog --start-position=411 /var/lib/mysql/mariadb-bin.000001 > /data/logbin.sql #從指定位置導出二進制日誌中的sql語句到一個.sql爲後綴的文件中(作二進制日誌備份) [root@centos7 ~]# vim /data/logbin.sql #編輯導出的文件 DROP TABLE `t1` /* generated by server */ #找到刪除表的那一行,把這行必須刪除;用二進制日誌備份還原數據庫必須刪除針對刪除表或者庫的sql語句,由於刪除表或庫的操做也會記錄到二進制日誌中 [root@centos7 ~]# mysql #進入mysql MariaDB [(none)]> set sql_log_bin=off; #臨時關閉二進制日誌,避免還原過程產生大量的二進制日誌 MariaDB [(none)]> use db3; MariaDB [db3]> source /data/all.sql #先還原徹底備份;建立表是在徹底備份前建立的,往表添加內容是在徹底備份以後操做的,因此不能直接用二進制日誌還原,二進制日誌備份中沒有建立表的操做,須要配合徹底備份 MariaDB [db3]> select * from t1; #徹底備份還原完表的內容是空的 Empty set (0.00 sec) MariaDB [db3]> source /data/logbin.sql #導入二進制日誌備份 MariaDB [db3]> select * from t1; #導入二進制日誌備份以後,恢復 +------+ | id | +------+ | 1 | | 2 | | 3 | +------+

備份還原完以後,恢復mysql服務訪問

相關文章
相關標籤/搜索