模版網(wǎng)站后期可以更換圖片嗎seo和sem的區(qū)別
一、MySQL備份恢復(fù)
1.1 MySQL日志管理
數(shù)據(jù)庫(kù)中數(shù)據(jù)丟失或被破壞可能原因
誤刪除數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)工作時(shí),意外斷電或程序意外終止
由于病毒造成的數(shù)據(jù)庫(kù)損壞或丟失
文件系統(tǒng)損壞后,系統(tǒng)進(jìn)行自檢操作
升級(jí)數(shù)據(jù)庫(kù)時(shí),命令語(yǔ)句不嚴(yán)格
設(shè)備故障等等
自然災(zāi)害
盜竊
MySQL日志
日志類型
MySQL有幾個(gè)不同的日志文件,可以幫助你找出mysqld內(nèi)部發(fā)生的事情:
日志文件 | 記入文件中的信息類型 |
---|---|
錯(cuò)誤日志 | 記錄啟動(dòng)、運(yùn)行或停止時(shí)出現(xiàn)的問題。 |
查詢?nèi)罩?/td> | 記錄建立的客戶端連接和執(zhí)行的語(yǔ)句。 |
二進(jìn)制日志 | 記錄所有更改數(shù)據(jù)的語(yǔ)句。主要用于復(fù)制和即時(shí)點(diǎn)恢復(fù)。 |
慢日志 | 記錄所有執(zhí)行時(shí)間超過long_query_time秒的所有查詢或不使用索引的查詢。 |
事務(wù)日志 | 記錄InnoDB等支持事務(wù)的存儲(chǔ)引擎執(zhí)行事務(wù)時(shí)產(chǎn)生的日志。 |
默認(rèn)情況下,所有日志創(chuàng)建于mysqld數(shù)據(jù)目錄中。通過刷新日志,你可以強(qiáng)制 mysqld來(lái)關(guān)閉和重新打開日志文件(或者在某些情況下切換到一個(gè)新的日志)。當(dāng)你執(zhí)行一個(gè)FLUSH LOGS語(yǔ)句或執(zhí)行mysqladmin flush-logs或mysqladmin refresh時(shí),出現(xiàn)日志刷新。如果你正使用MySQL復(fù)制功能,從復(fù)制服務(wù)器將維護(hù)更多日志文件,被稱為接替日志。
錯(cuò)誤日志
錯(cuò)誤日志主要記錄如下幾種日志:服務(wù)器啟動(dòng)和關(guān)閉過程中的信息服務(wù)器運(yùn)行過程中的錯(cuò)誤信息事件調(diào)度器運(yùn)行一個(gè)時(shí)間是產(chǎn)生的信息在從服務(wù)器上啟動(dòng)從服務(wù)器進(jìn)程是產(chǎn)生的信息
錯(cuò)誤日志定義:
可以用--log-error[=file_name]選項(xiàng)來(lái)指定mysqld保存錯(cuò)誤日志文件的位置。如果沒有給定file_name值,mysqld使用錯(cuò)誤日志名host_name.err 并在數(shù)據(jù)目錄中寫入日志文件。如果你執(zhí)行FLUSH LOGS,錯(cuò)誤日志用-old重新命名后綴并且mysqld創(chuàng)建一個(gè)新的空日志文件。(如果未給出--log-error選項(xiàng),則不會(huì)重新命名)。
查看當(dāng)前錯(cuò)誤日志配置mysql> SHOW GLOBAL VARIABLES LIKE '%log_error%';是否記錄警告日志mysql> SHOW GLOBAL VARIABLES LIKE '%log_warnings%';
通用查詢?nèi)罩?/p>
啟動(dòng)開關(guān):general_log={ON|OFF}
日志文件變量:general_log_file[=/PATH/TO/file]
全局日志開關(guān):log={ON|OFF} 該開關(guān)打開后,所有日志都會(huì)被啟用
記錄類型:log_output={TABLE|FILE|NONE}:
因此,要啟用通用查詢?nèi)罩?#xff0c;需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果沒有指定,默認(rèn)名是host_name.log。
看看上述幾個(gè)值的默認(rèn)配置:SHOW GLOBAL VARIABLES LIKE '%general_log%';mysql> SHOW GLOBAL VARIABLES LIKE '%log_output%';
慢查詢?nèi)罩?/p>
MySQL如果啟用了slow_query_log=ON選項(xiàng),就會(huì)記錄執(zhí)行時(shí)間超過long_query_time的查詢(初使表鎖定的時(shí)間不算作執(zhí)行時(shí)間)。日志記錄文件為slow_query_log_file[=file_name],如果沒有給出file_name值, 默認(rèn)為主機(jī)名,后綴為-slow.log。如果給出了文件名,但不是絕對(duì)路徑名,文件則寫入數(shù)據(jù)目錄。
默認(rèn)與慢查詢相關(guān)變量:
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
默認(rèn)沒有啟用慢查詢,為了服務(wù)器調(diào)優(yōu),建議開啟
開啟方法:
SET GLOBAL slow_query_log=ON; 當(dāng)前生效,永久有效配置文件中設(shè)置
使用mysqldumpslow命令獲得日志中顯示的查詢摘要來(lái)處理慢查詢?nèi)罩?# mysqldumpslow slow.log
那么多久算是慢呢?
如果查詢時(shí)長(zhǎng)超過long_query_time的定義值(默認(rèn)10秒),即為慢查詢:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
二進(jìn)制日志
二進(jìn)制日志啟動(dòng)開關(guān):log-bin [= file_name]
在5.6及以上版本一定要手動(dòng)指定。5.6以下版本默認(rèn)file_name為$datadir/mysqld-binlog
查看二進(jìn)制日志的工具為:mysqlbinlog
二進(jìn)制日志包含了所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)(例如,沒有匹配任何行的一個(gè)DELETE)的所有語(yǔ)句
語(yǔ)句以“事件”的形式保存,它描述數(shù)據(jù)更改。二進(jìn)制日志還包含關(guān)于每個(gè)更新數(shù)據(jù)庫(kù)的語(yǔ)句的執(zhí)行時(shí)間信息。它不包含沒有修改任何數(shù)據(jù)的語(yǔ)句。
二進(jìn)制日志的主要目的是在數(shù)據(jù)庫(kù)存在故障時(shí),恢復(fù)時(shí)能夠最大可能地更新數(shù)據(jù)庫(kù)(即時(shí)點(diǎn)恢復(fù)),因?yàn)槎M(jìn)制日志包含備份后進(jìn)行的所有更新。二進(jìn)制日志還用于在主復(fù)制服務(wù)器上記錄所有將發(fā)送給從服務(wù)器的語(yǔ)句。
二進(jìn)制日志是記錄執(zhí)行的語(yǔ)句還是執(zhí)行后的結(jié)果數(shù)據(jù)呢?
第一種情況:假如一個(gè)表有10萬(wàn)行數(shù)據(jù),而現(xiàn)在要執(zhí)行一個(gè)如下語(yǔ)句將amount字段的值全部在原來(lái)的基礎(chǔ)上增加1000:
UPDATE sales.january SET amount=amount+1000;
此時(shí)如果要記錄執(zhí)行后的結(jié)果數(shù)據(jù)的話,日志會(huì)非常大。
因此在這種情況下應(yīng)記錄執(zhí)行語(yǔ)句。這種方式就是基于語(yǔ)句的二進(jìn)制日志。
第二種情況:如果向某個(gè)字段插入的是當(dāng)前的時(shí)間呢?如下:
INSERT INTO tb SET Birthdate=CURRENT_TIME();
此時(shí)就不能記錄語(yǔ)句了,因?yàn)椴煌瑫r(shí)間執(zhí)行的結(jié)果是不一樣的。這是應(yīng)該記錄這一行的值,這種就是基于行(row)的二進(jìn)制日志。
在有些情況,可能會(huì)結(jié)合兩種方式來(lái)記錄,這種叫做混合方式的二進(jìn)制日志。二進(jìn)制日志的管理日志滾動(dòng)
在my.cnf中設(shè)定max_binlog_size = 200M,表示限制二進(jìn)制日志最大尺寸為200M,超過200M后進(jìn)行滾動(dòng)。MySQL的滾動(dòng)方式與其他日志不太一樣,滾動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)新的編號(hào)大1的日志用于記錄最新的日志,而原日志名字不會(huì)被改變。
每次重啟MySQL服務(wù),日志都會(huì)自動(dòng)滾動(dòng)一次。
另外如果需要手動(dòng)滾動(dòng),則使用命令 mysql> FLUSH LOGS;
日志查看
查看有哪些二進(jìn)制日志文件:mysql> SHOW BINARY LOGS;
查看當(dāng)前正在使用的是哪一個(gè)二進(jìn)制日志文件:mysql> SHOW MASTER STATUS;
查看二進(jìn)制日志內(nèi)容:mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002';##該語(yǔ)句還可以加上Position(位置),指定顯示從哪個(gè)Position(位置)開始:mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203;
使用命令mysqlbinlog查看二進(jìn)制日志內(nèi)容:mysqlbinlog [options] log-files
使用二進(jìn)制日志還原數(shù)據(jù):使用mysqlbinlog讀取需要的日志內(nèi)容,使用標(biāo)準(zhǔn)輸入重定向到一個(gè)sql文件,然后在mysql服務(wù)器上導(dǎo)入即可,如下:[root@localhost mysql]# mysqlbinlog mysqld-binlog.000002 >/root/temp_date.sql
刪除二進(jìn)制日志文件:
二進(jìn)制日志文件不能直接刪除的,如果使用rm等命令直接刪除日志文件,可能導(dǎo)致數(shù)據(jù)庫(kù)的崩潰。
必須使用命令PURGE刪除日志,語(yǔ)法如下:PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
用reset master命令刪除所有日志,新日志重新從000001開始編號(hào)
用purge master logs to 'filename.******' 命令可以刪除指定編號(hào)前的所有日志
1.2 MySQL備份
1.2.1 備份類型
熱備份、溫備份、冷備份 (根據(jù)服務(wù)器狀態(tài))熱備份:讀、寫不受影響;溫備份:僅可以執(zhí)行讀操作;冷備份:離線備份;讀、寫操作均中止;物理備份與邏輯備份 (從對(duì)象來(lái)分)物理備份:復(fù)制數(shù)據(jù)文件;邏輯備份:將數(shù)據(jù)導(dǎo)出至文本文件中;完全備份、增量備份、差異備份 (從數(shù)據(jù)收集來(lái)分)完全備份:備份全部數(shù)據(jù);增量備份:僅備份上次完全備份或增量備份以后變化的數(shù)據(jù);差異備份:僅備份上次完全備份以來(lái)變化的數(shù)據(jù);
邏輯備份優(yōu)缺點(diǎn)
邏輯備份的優(yōu)點(diǎn):在備份速度上兩種備份要取決于不同的存儲(chǔ)引擎物理備份的還原速度非???。但是物理備份的最小粒度只能做到表邏輯備份保存的結(jié)構(gòu)通常都是純ASCII的,所以我們可以使用文本處理工具來(lái)處理邏輯備份有非常強(qiáng)的兼容性,而物理備份則對(duì)版本要求非常高邏輯備份也對(duì)保持?jǐn)?shù)據(jù)的安全性有保證邏輯備份的缺點(diǎn):邏輯備份要對(duì)RDBMS產(chǎn)生額外的壓力,而裸備份無(wú)壓力邏輯備份的結(jié)果可能要比源文件更大。所以很多人都對(duì)備份的內(nèi)容進(jìn)行壓縮邏輯備份可能會(huì)丟失浮點(diǎn)數(shù)的精度信息
1.2.2 備份內(nèi)容
數(shù)據(jù)文件
日志文件(比如事務(wù)日志,二進(jìn)制日志)
存儲(chǔ)過程,存儲(chǔ)函數(shù),觸發(fā)器
配置文件(十分重要,各個(gè)配置文件都要備份)
用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份的腳本,數(shù)據(jù)庫(kù)自身清理的Crontab等……
1.2.3 備份工具
MySQL自帶的備份工具mysqldump 邏輯備份工具,支持所有引擎,MyISAM引擎是溫備,InnoDB引擎是熱備,備份速度中速,還原速度非常非常慢,但是在實(shí)現(xiàn)還原的時(shí)候,具有很大的操作余地。具有很好的彈性。mysqlhotcopy 物理備份工具,但只支持MyISAM引擎,基本上屬于冷備的范疇,物理備份,速度比較快。文件系統(tǒng)備份工具cp 冷備份,支持所有引擎,復(fù)制命令,只能實(shí)現(xiàn)冷備,物理備份。使用歸檔工具,cp命令,對(duì)其進(jìn)行備份的,備份速度快,還原速度幾乎最快,但是靈活度很低,可以跨系統(tǒng),但是跨平臺(tái)能力很差。lvm 幾乎是熱備份,支持所有引擎,基于快照(LVM,ZFS)的物理備份,速度非常快,幾乎是熱備。只影響數(shù)據(jù)幾秒鐘而已。但是創(chuàng)建快照的過程本身就影響到了數(shù)據(jù)庫(kù)在線的使用,所以備份速度比較快,恢復(fù)速度比較快,沒有什么彈性空間,而且LVM的限制:不能對(duì)多個(gè)邏輯卷同一時(shí)間進(jìn)行備份,所以數(shù)據(jù)文件和事務(wù)日志等各種文件必須放在同一個(gè)LVM上。而ZFS則非常好的可以在多邏輯卷之間備份。其它工具ibbackup 商業(yè)工具 MyISAM是溫備份,InnoDB是熱備份 ,備份和還原速度都很快,這個(gè)軟件它的每服務(wù)器授權(quán)版本是5000美元。xtrabackup 開源工具 MyISAM是溫備份,InnoDB是熱備份 ,是ibbackup商業(yè)工具的替代工具。mysqlbackup ORACLE公司也提供了針對(duì)企業(yè)的備份軟件MySQL Enterprise Backup簡(jiǎn)稱:mysqlbackup。MySQL企業(yè)備份工具執(zhí)行在線“熱備“,無(wú)阻塞的MySQL數(shù)據(jù)庫(kù)備份。全備份可以在所有InnoDB數(shù)據(jù)庫(kù)上執(zhí)行,而無(wú)需中斷MySQL查詢或更新。此外,支持增量備份,只備份自上次備份后有變化的數(shù)據(jù)。另外部分備份,支持特定的表或表空間按需要進(jìn)行備份。
1.2.4 備份策略
策略一:直接拷貝數(shù)據(jù)庫(kù)文件當(dāng)你使用直接備份方法時(shí),必須保證表不在被使用。如果服務(wù)器在你正在拷貝一個(gè)表時(shí)改變它,拷貝就失去意義。保證你的拷貝完整性的最好方法是關(guān)閉服務(wù)器,拷貝文件,然后重啟服務(wù)器。當(dāng)你完成了備份時(shí),需要重啟服務(wù)器(如果關(guān)閉了它)或釋放加在表上的鎖定(如果你讓服務(wù)器運(yùn)行)。要用直接拷貝文件把一個(gè)數(shù)據(jù)庫(kù)從一臺(tái)機(jī)器拷貝到另一臺(tái)機(jī)器上,只是將文件拷貝到另一臺(tái)服務(wù)器主機(jī)的適當(dāng)數(shù)據(jù)目錄下即可。
要確保文件是MyIASM格式或兩臺(tái)機(jī)器有相同的硬件結(jié)構(gòu),否則你的數(shù)據(jù)庫(kù)在另一臺(tái)主機(jī)上有奇怪的內(nèi)容。(文件系統(tǒng)備份工具 cp)(適合小型數(shù)據(jù)庫(kù),是最可靠的)
1、停止MySQL服務(wù)器。
2、直接復(fù)制整個(gè)數(shù)據(jù)庫(kù)目錄。注意:使用這種方法最好還原到相同版本服務(wù)器中,不同版本可能不兼容。
3、目標(biāo)服務(wù)器上還原。
4、目標(biāo)服務(wù)器數(shù)據(jù)庫(kù)目錄授權(quán),重啟服務(wù)器測(cè)試。
策略二:mysqldump備份數(shù)據(jù)庫(kù)(完全備份+增加備份,速度相對(duì)較慢,適合中小型數(shù)據(jù)庫(kù))(MyISAM是溫備份,InnoDB是熱備份)
mysqldump 是采用SQL級(jí)別的備份機(jī)制,它將數(shù)據(jù)表導(dǎo)成 SQL 腳本文件,在不同的 MySQL 版本之間升級(jí)時(shí)相對(duì)比較合適,這也是最常用的備份方法。
備份策略可以這么定:第一次完全備份,每天一次增量備份,每周再做一次完全備份,如此一直重復(fù)。而對(duì)于重要的且繁忙的系統(tǒng)來(lái)說,則可能需要每天一次全量備份,每小時(shí)一次增量備份,甚至更頻繁。為了不影響線上業(yè)務(wù),實(shí)現(xiàn)在線備份,并且能增量備份,最好的辦法就是采用主從復(fù)制機(jī)制(replication),在 slave 機(jī)器上做備份。示例一:備份恢復(fù)單個(gè)數(shù)據(jù)庫(kù)
備份:mydqldump -u 用戶 –p’密碼’ –default-character-set=Iatin1 數(shù)據(jù)庫(kù)名 [|gzip] > 備份文件名
示例:mysqldump -uroot -p'123456' --default-character-set=utf8 -B school > /tmp/school.$(date +%F).sql
注意:-B 作用:創(chuàng)建數(shù)據(jù)庫(kù)和切換到數(shù)據(jù)庫(kù),恢復(fù)時(shí)不用創(chuàng)建數(shù)據(jù)庫(kù)和刪表。備份多個(gè)庫(kù),-B 數(shù)據(jù)庫(kù)1 數(shù)據(jù)庫(kù)2 ...
恢復(fù):
1)MySQL中用source命令
2)mysql命令恢復(fù)示例二:備份恢復(fù)單個(gè)表
備份:mysqldump -u 用戶名 -p 數(shù)據(jù)庫(kù)名 表名 > 備份的文件名
示例:mysqldump -uroot -p school Books > /tmp/Books.$(date +%F).sql
備份多個(gè)表:mysqldump -u 用戶名 -p 數(shù)據(jù)庫(kù)名 表名1 表名2 > 備份的文件名示例三:備份數(shù)據(jù)結(jié)構(gòu)
-d只備份庫(kù)結(jié)構(gòu),不包含數(shù)據(jù)內(nèi)容示例四:增量備份
前提: 1)my.cnf,是要開啟MySQL log-bin日志功能,重啟MySQL log_bin = /data/mysql/data/mysql-bin2)存在一個(gè)完全備份,生產(chǎn)環(huán)境一般凌晨某個(gè)時(shí)刻進(jìn)行全備
示例:mysqldump -uroot -p --default-character-set=utf8 --single-transaction -F -B school |gzip > /server/backup/school_$(date +%F).sql.gzInnoDB 表在備份時(shí),通常啟用選項(xiàng) --single-transaction 來(lái)保證備份的一致性
MySQL增量恢復(fù)案例圖解
準(zhǔn)備數(shù)據(jù)庫(kù)和表
create database it DEFAULT CHARACTER SET utf8;
=======================================================
學(xué)生表:Student(Sno,Sname,Ssex,Ssage,Ssdept)
-------------------(學(xué)號(hào)-主鍵,姓名,性別,年齡,所在系)
=======================================================
CREATE TABLE `Student` (`Sno` int(10) NOT NULL COMMENT '學(xué)號(hào)', `Sname` varchar(16) NOT NULL COMMENT '姓名',`Ssex` char(2) NOT NULL COMMENT '性別', `Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '學(xué)生年齡',`Sdept` varchar(16) DEFAULT 'NULL' COMMENT '學(xué)生所在系別', PRIMARY KEY (`Sno`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;表中插入數(shù)據(jù)
INSERT INTO `Student` VALUES (1, '陸亞', '男', 24, '計(jì)算機(jī)網(wǎng)絡(luò)'),(2, 'tom', '男', 26, '英語(yǔ)'),(3, '張陽(yáng)', '男', 21, '物流管理'), (4, 'alex', '女', 22, '電子商務(wù)');
半夜零點(diǎn)手工全備
模擬半夜零點(diǎn)全備 date -s "20161208"
mysqldump -uroot -p123456 -F -B it --default-character-set=utf8 --single-transaction -e | gzip > /server/backup/mysql_backup_`date +%F`.sql.gz
備份后繼續(xù)插入數(shù)據(jù):
INSERT INTO Student values(0005,'xumubin','男',29,'中文專業(yè)'),(0006,'wangzhao','男',21,'導(dǎo)彈專業(yè)');
模擬用戶破壞數(shù)據(jù):
drop database it;增量備份--恢復(fù)過程
1、檢查凌晨備份
2、檢查全備后的所有binlog
# ls -lrt /usr/local/mysql/data/mysql-bin.*
3、立即刷新并備份出binlog
mysqladmin -uroot -p flush-logs
cp /usr/local/mysql/data/mysql-bin.000004 /server/backup/
提示:根據(jù)時(shí)間點(diǎn)及前一個(gè)binlog可以知道發(fā)現(xiàn)問題時(shí)刻前binlog日志為mysql-bin.000004
4、恢復(fù)binlog生成sql語(yǔ)句
mysqlbinlog mysql-bin.000004 > bin.log
5、恢復(fù)凌晨備份
6、恢復(fù)增量備份mysqlbinlog增量恢復(fù)方式
基于時(shí)間點(diǎn)恢復(fù)
1)指定開始時(shí)間到結(jié)束時(shí)間
myslbinlog mysqlbin.000008 --start-datetime=’2014-10-45 01:10:46’ --stop-datetime=’2014-10-45 03:10:46’-r time.sql
2)指定開始時(shí)間到文件結(jié)束
myslbinlog mysqlbin.000008 --start-datetime=’2014-10-45 01:10:46’ -d esen -r time.sql
3)從文件開頭到指定結(jié)束時(shí)間
myslbinlog mysqlbin.000008 --stop-datetime=’2014-10-45 03:10:46’ -d esen -r time.sql基于位置點(diǎn)的增量恢復(fù)
1)指定開始位置到結(jié)束位置
myslbinlog mysqlbin.000008 --start-position=510 --stop-position=1312 -r pos.sql
2)指定開始位置到文件結(jié)束
myslbinlog mysqlbin.000008 --start-position=510 -r pos.sql
3)從文件開始位置到指定結(jié)束位置
myslbinlog mysqlbin.000008 --stop-position=1312 -r pos.sql
高級(jí)備份參數(shù):
-R 備份存儲(chǔ)過程及函數(shù)
--triggers 備份觸發(fā)器
-E 備份事件
-F 在備份開始時(shí),刷新一個(gè)新binlog日志
--master-data=2以注釋的形式,保存?zhèn)浞蓍_始時(shí)間點(diǎn)的binlog的狀態(tài)信息示例:[root@mysql mysql]# mysqldump -uroot -p -A -R --triggers --master-data=2 > /tmp/full.sql[root@mysql mysql]# grep 'CHANGE MASTER' /tmp/full.sql | head -1-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=766;功能:(1)在備份時(shí),會(huì)自動(dòng)記錄,二進(jìn)制日志文件名和位置號(hào)0 默認(rèn)值1 以change master to命令形式,可以用作主從復(fù)制2 以注釋的形式記錄,備份時(shí)刻的文件名+postion號(hào)(2) 自動(dòng)鎖表(3)如果配合--single-transaction,只對(duì)非InnoDB表進(jìn)行鎖表備份,InnoDB表進(jìn)行“熱“”備,實(shí)際上是實(shí)現(xiàn)快照備份。--single-transactioninnodb 存儲(chǔ)引擎開啟熱備(快照備份)功能 master-data可以自動(dòng)加鎖(1)在不加--single-transaction ,啟動(dòng)所有表的溫備份,所有表都鎖定(1)加上--single-transaction ,對(duì)innodb進(jìn)行快照備份,對(duì)非innodb表可以實(shí)現(xiàn)自動(dòng)鎖表功能示例: 備份必加參數(shù)mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql--set-gtid-purged=autoauto , onoff 使用場(chǎng)景:1. --set-gtid-purged=OFF,可以使用在日常備份參數(shù)中.mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql2. auto , on:在構(gòu)建主從復(fù)制環(huán)境時(shí)需要的參數(shù)配置mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=ON >/data/backup/full.sql--max-allowed-packet=#mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M >/data/backup/full.sql--max-allowed-packet=# The maximum packet length to send to or receive from server.
binlog日志的GTID新特性
1、 GTID 介紹
1> 什么是GTID
GTID(Global Transaction ID),全局事務(wù)標(biāo)識(shí)符。是對(duì)于一個(gè)已提交事務(wù)的編號(hào),并且是一個(gè)全局唯一的編號(hào)。
它是MySQL 5.6加入的一個(gè)強(qiáng)大特性,目的在于能夠?qū)崿F(xiàn)主從自動(dòng)定位和切換,而不像以前需要指定文件和位置。
2> GTID的格式與存儲(chǔ)
- 單個(gè)GTID
GTID與主庫(kù)上提交的每個(gè)事務(wù)相關(guān)聯(lián)。此標(biāo)識(shí)符不僅對(duì)發(fā)起事務(wù)的庫(kù)是唯一的,而且在給定復(fù)制拓?fù)渲械乃袔?kù)中都是唯一的。GTID用冒號(hào)分隔的一對(duì)坐標(biāo)表示,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23
前一部分是主庫(kù)的server_uuid,后面一部分是主庫(kù)上按提交事務(wù)的順序確定的序列號(hào),提交的事務(wù)序號(hào)從1開始。
GTID = server_uuid :transaction_id
2)GTID集
GTID集是包括一個(gè)或多個(gè)單個(gè)GTID或GTID范圍的集合。源自同一服務(wù)器的一系列GTID可以折疊為單個(gè)表達(dá)式,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-321
上面的示例表示源自server_uuid為8eed0f5b-6f9b-11e9-94a9-005056a57a4e服務(wù)器的第1到第321個(gè)事務(wù)。源自同一服務(wù)器的多個(gè)單GTID或GTID范圍可以同時(shí)包含在由冒號(hào)分隔的單個(gè)表達(dá)式中,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-3:11:47-49
3)mysql.gtid_executed表
mysql.gtid_executed表結(jié)構(gòu)如下:
mysql> desc mysql.gtid_executed;
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| source_uuid | char(36) | NO | PRI | NULL | |
| interval_start | bigint(20) | NO | PRI | NULL | |
| interval_end | bigint(20) | NO | | NULL | |
+----------------+------------+------+-----+---------+-------+
mysql.gtid_executed表記錄的是服務(wù)器上已經(jīng)執(zhí)行事務(wù)的GTID。三個(gè)字段分別表示發(fā)起事務(wù)的服務(wù)器UUID、UUID集的起始和結(jié)束事務(wù)ID。對(duì)于單個(gè)GTID,后兩個(gè)字段的值相同。
2> 版本支持
5.6 版本新加的特性,5.7中做了加強(qiáng)
5.6 中不開啟,沒有這個(gè)功能.
5.7 中的GTID,即使不開也會(huì)有自動(dòng)生成
SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.01 sec)
3> 如何開啟
vim /etc/my.cnfgtid-mode=on
enforce-gtid-consistency=true
重啟服務(wù)查看:
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.00 sec)
4> DDL和DML語(yǔ)句查看gtid
DDL一個(gè)語(yǔ)句產(chǎn)生一個(gè)gtid
mysql> create database db3;
Query OK, 1 row affected (0.00 sec)mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000013 | 310 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
mysql> use db3
Database changed
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.01 sec)mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 471 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)mysql> create table t2 (id int);
Query OK, 0 rows affected (0.01 sec)mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 632 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)mysql> create table t3 (id int);
Query OK, 0 rows affected (0.01 sec)mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 793 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
DML一個(gè)事務(wù)產(chǎn)生一個(gè)gtid
mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t1 values(1);
Query OK, 1 row affected (0.02 sec)mysql> insert into t1 values(2);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 1128 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-5 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 1379 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
2、基于GTID進(jìn)行查看binlog
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000013';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000013 | 4 | Format_desc | 123 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 |
| mysql-bin.000013 | 123 | Previous_gtids | 123 | 154 | |
| mysql-bin.000013 | 154 | Gtid | 123 | 219 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:1' |
| mysql-bin.000013 | 219 | Query | 123 | 310 | create database db3 |
| mysql-bin.000013 | 310 | Gtid | 123 | 375 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:2' |
| mysql-bin.000013 | 375 | Query | 123 | 471 | use `db3`; create table t1 (id int) |
| mysql-bin.000013 | 471 | Gtid | 123 | 536 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:3' |
| mysql-bin.000013 | 536 | Query | 123 | 632 | use `db3`; create table t2 (id int) |
| mysql-bin.000013 | 632 | Gtid | 123 | 697 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:4' |
| mysql-bin.000013 | 697 | Query | 123 | 793 | use `db3`; create table t3 (id int) |
| mysql-bin.000013 | 793 | Gtid | 123 | 858 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:5' |
| mysql-bin.000013 | 858 | Query | 123 | 929 | BEGIN |
| mysql-bin.000013 | 929 | Table_map | 123 | 973 | table_id: 108 (db3.t1) |
| mysql-bin.000013 | 973 | Write_rows | 123 | 1013 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000013 | 1013 | Table_map | 123 | 1057 | table_id: 108 (db3.t1) |
| mysql-bin.000013 | 1057 | Write_rows | 123 | 1097 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000013 | 1097 | Xid | 123 | 1128 | COMMIT /* xid=21 */ |
| mysql-bin.000013 | 1128 | Gtid | 123 | 1193 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:6' |
| mysql-bin.000013 | 1193 | Query | 123 | 1264 | BEGIN |
| mysql-bin.000013 | 1264 | Table_map | 123 | 1308 | table_id: 109 (db3.t2) |
| mysql-bin.000013 | 1308 | Write_rows | 123 | 1348 | table_id: 109 flags: STMT_END_F |
| mysql-bin.000013 | 1348 | Xid | 123 | 1379 | COMMIT /* xid=26 */ |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
22 rows in set (0.00 sec)
具備GTID后,截取查看某些事務(wù)日志:
–include-gtids
–exclude-gtids
示例:演示跨binlog文件截取日志。
第一次操作:
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000013 | 1379 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)mysql> create database gtid;
Query OK, 1 row affected (0.01 sec)mysql> use gtid
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t1 values(1);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
第二次操作:
mysql> create table t2(id int);
Query OK, 0 rows affected (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
第三次操作:
mysql> create table t3(id int);
Query OK, 0 rows affected (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t3 values(1);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.01 sec)mysql> drop database gtid;
Query OK, 3 rows affected (0.01 sec)
使用binlog日志恢復(fù)誤刪除的gitd數(shù)據(jù)庫(kù)。
首先要確定gtid的起始和結(jié)束。
mysql> show binlog events in 'mysql-bin.000013';
...
| mysql-bin.000013 | 1379 | Gtid | 123 | 1444 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:7' |
| mysql-bin.000013 | 1444 | Query | 123 | 1538 | create database gtid
...開始:
文件:mysql-bin.000013
gtid:'6181523d-bc2e-11ea-a78b-000c2921146:7'
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000015 | 766 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-14 |
+------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)mysql> show binlog events in 'mysql-bin.000015';
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| mysql-bin.000015 | 4 | Format_desc | 123 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 |
| mysql-bin.000015 | 123 | Previous_gtids | 123 | 194 | 6181523d-bc2e-11ea-a78b-000c29221146:1-11 |
| mysql-bin.000015 | 194 | Gtid | 123 | 259 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:12' |
| mysql-bin.000015 | 259 | Query | 123 | 356 | use `gtid`; create table t3(id int) |
| mysql-bin.000015 | 356 | Gtid | 123 | 421 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:13' |
| mysql-bin.000015 | 421 | Query | 123 | 493 | BEGIN |
| mysql-bin.000015 | 493 | Table_map | 123 | 538 | table_id: 112 (gtid.t3) |
| mysql-bin.000015 | 538 | Write_rows | 123 | 578 | table_id: 112 flags: STMT_END_F |
| mysql-bin.000015 | 578 | Xid | 123 | 609 | COMMIT /* xid=50 */ |
| mysql-bin.000015 | 609 | Gtid | 123 | 674 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:14' |
| mysql-bin.000015 | 674 | Query | 123 | 766 | drop database gtid |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
11 rows in set (0.00 sec)確定結(jié)束:
文件:mysql-bin.000015
gtid:'6181523d-bc2e-11ea-a78b-000c29221146:14'
其次,binlog使用gtid截取日志
確定起始范圍:7-13
文件:mysql-bin.000013 mysql-bin.000014 mysql-bin.000015
[root@mysql ~]# cd /var/lib/mysql
[root@mysql mysql]# mysqlbinlog --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid1.sql
最后,使用binlog日志恢復(fù)
mysql> set sql_log_bin=0; #設(shè)為0后,在Master數(shù)據(jù)庫(kù)上執(zhí)行的語(yǔ)句都不記錄binlog
Query OK, 0 rows affected (0.00 sec)mysql> source /tmp/gtid1.sql
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases like 'gtid';
Empty set (0.00 sec)
沒有恢復(fù)成功?原因是GTID冪等性。
3、GTID的冪等性
開啟GTID后,MySQL恢復(fù)Binlog時(shí),重復(fù)GTID的事務(wù)不會(huì)再執(zhí)行了
就想恢復(fù)?怎么辦?
–skip-gtids
接著上面,截取日志時(shí)添加–skip-gtids。
[root@mysql mysql]# mysqlbinlog --skip-gtids --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid2.sql
恢復(fù)數(shù)據(jù):
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)mysql> source /tmp/gtid2.sqlmysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)mysql> show databases like 'gtid';
+-----------------+
| Database (gtid) |
+-----------------+
| gtid |
+-----------------+
1 row in set (0.00 sec)mysql> select * from gtid.t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
策略三:mydumper備份數(shù)據(jù)庫(kù)
Mydumper官網(wǎng):http://www.mydumper.org/
Mydumper介紹Mydumper是一個(gè)針對(duì)MySQL和Drizzle的高性能多線程備份和恢復(fù)工具。開發(fā)人員主要來(lái)自MySQL,Facebook,SkySQL公司。目前已經(jīng)在一些線上使用了Mydumper。
Mydumper主要特性:? 輕量級(jí)C語(yǔ)言寫的? 執(zhí)行速度比mysqldump快10倍? 事務(wù)性和非事務(wù)性表一致的快照(適用于0.2.2以上版本)? 快速的文件壓縮? 支持導(dǎo)出binlog? 多線程恢復(fù)(適用于0.2.1以上版本)? 以守護(hù)進(jìn)程的工作方式,定時(shí)快照和連續(xù)二進(jìn)制日志(適用于0.5.0以上版本)? 開源 (GNU GPLv3)Mydumper安裝# yum -y install glib2-devel mysql-devel zlib-devel pcre-devel# tar xvf mydumper-0.5.1.tar.gz # cd mydumper-0.5.1/# cmake .# make# make install
mydumper輸出文件metadata:元數(shù)據(jù) 記錄備份開始和結(jié)束時(shí)間,以及binlog日志文件位置。table data:每個(gè)表一個(gè)文件table schemas:表結(jié)構(gòu)文件binary logs: 啟用--binlogs選項(xiàng)后,二進(jìn)制文件存放在binlog_snapshot目錄下daemon mode:在這個(gè)模式下,有五個(gè)目錄0,1,binlogs,binlog_snapshot,last_dump。備份目錄是0和1,間隔備份,如果mydumper因某種原因失敗而仍然有一個(gè)好的快照,
當(dāng)快照完成后,last_dump指向該備份。Mydumper備份示例[root@localhost ~]# mydumper -h localhost -u root -p 888 -t 6 -S /tmp/mysql.sock -B school -o /mysqlbackup/
[root@tianyun ~]# ls /mysqlbackup/
binlog_snapshot school.student1.sql school.student4-schema.sql school.t2_old-schema.sql
...
[root@localhost ~]# cat /mysqlbackup/metadata
Started dump at: 2015-09-15 10:12:54
SHOW MASTER STATUS:Log: tianyun-bin.000003Pos: 2089998Finished dump at: 2015-09-15 10:12:54Mydumper恢復(fù)示例[root@localhost ~]# myloader -h localhost -u root -p 888 -S /tmp/mysql.sock -d /mysqlbackup/ -o -B school
策略四:lvm快照從物理角度實(shí)現(xiàn)幾乎熱備的完全備份,配合二進(jìn)制日志備份實(shí)現(xiàn)增量備份,速度快適合比較煩忙的數(shù)據(jù)庫(kù)
前提:數(shù)據(jù)文件要在邏輯卷上;此邏輯卷所在卷組必須有足夠空間使用快照卷;數(shù)據(jù)文件和事務(wù)日志要在同一個(gè)邏輯卷上;前提:MySQL數(shù)據(jù)lv和將要?jiǎng)?chuàng)建的快照要在同一vg,vg要有足夠的空間存儲(chǔ)
優(yōu)點(diǎn)幾乎是熱備(創(chuàng)建快照前把表上鎖,創(chuàng)建完畢后立即釋放)支持所有的存儲(chǔ)引擎?zhèn)浞菟俣瓤鞜o(wú)需使用昂貴的商業(yè)軟件(操作系統(tǒng)級(jí)別的)
缺點(diǎn)可能需要部門協(xié)調(diào)(使用操作系統(tǒng)級(jí)別的命令,DBA一般沒有權(quán)限)無(wú)法預(yù)計(jì)服務(wù)停止時(shí)間數(shù)據(jù)如果分布在多個(gè)卷上比較麻煩操作流程
1)鎖表 flush table with read lock
2)查看position號(hào)并記錄,便于后期恢復(fù) show master status
3)創(chuàng)建snapshot快照 create snapshop
4)解表 unlock tables
5)掛載snapshot
6)拷貝snapshot數(shù)據(jù),進(jìn)行備份。備份整個(gè)數(shù)據(jù)庫(kù)之前,要關(guān)閉mysql服務(wù)(保護(hù)ibdata1文件)
7)卸載
8)移除快照l(shuí)vm備份示例
一、數(shù)據(jù)遷移到邏輯卷上環(huán)境:數(shù)據(jù)文件不在邏輯卷上,那么需要將數(shù)據(jù)文件遷移到邏輯卷上
1、創(chuàng)建一個(gè)邏輯卷
[root@Admin ~]# pvcreate /dev/sdb
[root@Admin ~]# vgcreate vg01 /dev/sdb
[root@Admin ~]# lvcreate -n lv_mysql -L 4G vg01
[root@Admin ~]# mkfs.ext4 /dev/mapper/vg01-lv_mysql2、將當(dāng)前的mysql數(shù)據(jù)庫(kù)遷移到邏輯卷上1>先停止應(yīng)用2>停止mysql服務(wù) [root@Admin ~]# service mysqld stop3>備份所有的數(shù)據(jù)文件到指定的地方[root@Admin ~]# tar -czvf /tmp/backmysql/mysql.tar.gz /data/DB/*4>掛載邏輯卷到當(dāng)前mysql的數(shù)據(jù)目錄里[root@Admin ~]# mount /dev/mapper/vg01-lv_mysql /data/DB/5>將剛剛備份的數(shù)據(jù)解壓到數(shù)據(jù)目錄里[root@Admin ~]# tar xf /tmp/backmysql/mysql.tar.gz -C /data/DB/[root@Admin ~]# mv /data/DB/data/DB/* /data/DB/ && rm -rf /data/DB/data/6>啟動(dòng)數(shù)據(jù)庫(kù)[root@Admin ~]# service mysqld start此處啟動(dòng)失敗原因/data/DB/數(shù)據(jù)目錄的權(quán)限變成了root,更改權(quán)限重新啟動(dòng)[root@Admin ~]# chown mysql. -R /data/DB/ && service mysqld start二、快照備份數(shù)據(jù)庫(kù)1、給數(shù)據(jù)庫(kù)加讀鎖mysql> flush table with read lock;2、給mysql的數(shù)據(jù)庫(kù)所在的邏輯卷創(chuàng)建快照[root@Admin ~]# lvcreate -n lv_mysql_s -L 50M -s /dev/vg01/lv_mysql3、解鎖數(shù)據(jù)庫(kù)mysql> unlock tables以上1-3需要在一個(gè)會(huì)話完成[root@Admin ~]# echo "flush tables with read lock; system lvcreate -n lv_mysql_s -L 50M -s /dev/vg01/lv_mysql;unlock tables;" |mysql -uroot -p1234、將快照掛載到臨時(shí)目錄里[root@Admin ~]# mkdir /mnt/mysql && mount -o nouuid /dev/vg01/lv_mysql_s /mnt/mysql/5、備份數(shù)據(jù)[root@Admin ~]# mkdir /backup && rsync -av /mnt/mysql/ /backup6、卸載快照并刪除[root@Admin ~]# umount /mnt/mysql/ && lvremove /dev/vg01/lv_mysql_s7、測(cè)試驗(yàn)證將上面?zhèn)浞菡頌槟_本 + Crontab 計(jì)劃任務(wù)定時(shí)完成備份#!/bin/bashback_dir=/backup/`date +%F`[ -d $back_dir ]|| mkdir -p $back_direcho "flush tables with read lock; system lvcreate -n lv_mysql_s -L 50M -s /dev/vg01/lv_mysql;unlock tables;" |mysql -uroot -p123 &>/dev/null[ -d /mnt/mysql/ ] || mkdir -p /mnt/mysql/mount -o nouuid /dev/vg01/lv_mysql_s /mnt/mysql/rsync -a /mnt/mysql/ $back_dirif [ $? -eq 0 ];thenumount /mnt/mysql/ && lvremove -f /dev/vg01/lv_mysql_s &>/dev/nullfi
策略五:xtrabackup 備份數(shù)據(jù)庫(kù),實(shí)現(xiàn)完全熱備份與增量熱備份(MyISAM是溫備份,InnoDB是熱備份)
Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品。
Xtrabackup有兩個(gè)主要的工具:xtrabackup、innobackupexxtrabackup 只能備份InnoDB和XtraDB兩種數(shù)據(jù)表,而不能備份MyISAM數(shù)據(jù)表。 innobackupex 是參考了InnoDB Hotbackup的innoback腳本修改而來(lái)的.innobackupex是一個(gè)perl腳本封裝,封裝了xtrabackup。主要是為了方便的同時(shí)備份InnoDB和MyISAM引擎的表,但在處理myisam時(shí)需要加一個(gè)讀鎖。并且加入了一些使用的選項(xiàng)。如slave-info可以記錄備份恢復(fù)后作為slave需要的一些信息,根據(jù)這些信息,可以很方便的利用備份來(lái)重做slave。
支持完全備份和增量備份備份過程快速、可靠;
備份過程不會(huì)打斷正在執(zhí)行的事務(wù);
能夠基于壓縮等功能節(jié)約磁盤空間和流量;
自動(dòng)實(shí)現(xiàn)備份檢驗(yàn);
還原速度快;使用innobakupex備份時(shí),其會(huì)調(diào)用xtrabackup備份所有的InnoDB表,復(fù)制所有關(guān)于表結(jié)構(gòu)定義的相關(guān)文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關(guān)文件,同時(shí)還會(huì)備份觸發(fā)器和數(shù)據(jù)庫(kù)配置信息相關(guān)的文件。這些文件會(huì)被保存至一個(gè)以時(shí)間命令的目錄中。
(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN(日志序列號(hào))范圍信息;每個(gè)InnoDB頁(yè)(通常為16k大小)都會(huì)包含一個(gè)日志序列號(hào),即LSN。LSN是整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的系統(tǒng)版本號(hào),每個(gè)頁(yè)面相關(guān)的LSN能夠表明此頁(yè)面最近是如何發(fā)生改變的。
(2)xtrabackup_binlog_info —— mysql服務(wù)器當(dāng)前正在使用的二進(jìn)制日志文件及至備份這一刻為止二進(jìn)制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二進(jìn)制日志文件及用于InnoDB或XtraDB表的二進(jìn)制日志文件的當(dāng)前position。
(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執(zhí)行文件;
(5)backup-my.cnf —— 備份命令用到的配置選項(xiàng)信息;示例一:完全備份
完全備份
innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock /server/backup/
完全備份中恢復(fù)數(shù)據(jù) # innobackupex --apply-log /server/backup/2015-11-17_04-24-45/
停止數(shù)據(jù)庫(kù) # systemctl stop mysqld
還原數(shù)據(jù)庫(kù)到默認(rèn)目錄 innobackupex --copy-back /server/backup/2015-11-17_04-24-45/
修改數(shù)據(jù)文件屬主屬組
# chown -R mysql.mysql /usr/local/mysql/data/
啟動(dòng)數(shù)據(jù)庫(kù) # systemctl start mysql示例二:增量備份
必須要有未壓縮的全量備份文件目錄,先全量再增量,此次使用前面全量備份
插入數(shù)據(jù),增量備份
INSERT INTO Student values(0007,'孟非','男',21,'播音主持'),(0008,'許三多','男',31,'影視表演');
增量備份
# innobackupex --incremental --user=root --password=123 /server/backup/
--incremental-basedir=/server/backup/2015-11-17_04-24-45/
再次插入數(shù)據(jù),第二次增量備份
INSERT INTO Student values(0009,'張藝謀','男',61,'導(dǎo)演專業(yè)'),(0010,'徐靜蕾','女',36,'導(dǎo)演專業(yè)');
# innobackupex --incremental --user=root --password=123 /server/backup/
--incremental-basedir=/server/backup/2015-11-17_04-55-26/
在執(zhí)行過增量備份之后再一次進(jìn)行增量備份時(shí),其--incremental-basedir應(yīng)該指向上一次的增量備份所在的目錄示例二:恢復(fù)數(shù)據(jù)
首先恢復(fù)全備
innobackupex --apply-log --redo-only /server/backup/2015-11-17_04-24-45/
恢復(fù)第一次增量備份
innobackupex --apply-log --redo-only /server/backup/2015-11-17_04-24-45/ --incremental-dir=/server/backup/2015-11-17_04-55-26/
恢復(fù)第二次增量備份
innobackupex --apply-log --redo-only /server/backup/2015-11-17_04-24-45/ --incremental-dir=/server/backup/2015-11-17_05-14-00/
停止數(shù)據(jù)庫(kù)
systemctl stop mysql示例二:恢復(fù)數(shù)據(jù)
模擬數(shù)據(jù)丟失
rm -rf /usrlocal/mysql/data/*
還原數(shù)據(jù)庫(kù)到默認(rèn)目錄
innobackupex --copy-back /server/backup/2015-11-17_04-24-45/
修改數(shù)據(jù)文件屬主屬組
# chown -R mysql.mysql /usr/local/mysql/data/啟動(dòng)數(shù)據(jù)庫(kù)
systemctl start mysql
策略六:在windows客戶端下使用圖形化工具進(jìn)行備份
操作簡(jiǎn)便:
Navicat for MySQL 是一套專為 MySQL 設(shè)計(jì)的高性能數(shù)據(jù)庫(kù)管理及開發(fā)工具。它可以用于任何版本 3.21 或以上的 MySQL 數(shù)據(jù)庫(kù)服務(wù)器,并支持大部份 MySQL 最新版本的功能,包括觸發(fā)器、存儲(chǔ)過程、函數(shù)、事件、視圖、管理用戶等。
使用SQLyog或Navicat for MySQL等工具進(jìn)行備份
MySQL表的導(dǎo)入導(dǎo)出
除了前面使用的mysqldump命令導(dǎo)出外,我們可以使用如下方式:
可以使用SELECT ...INTO OUTFILE 'file_name'將表的內(nèi)容導(dǎo)出到一個(gè)文本文件,基本語(yǔ)法如下:SELECT [列名] FROM 表名 [where 條件語(yǔ)句] INTO OUTFILE '目標(biāo)文件' [option];
示例:select * from Student into outfile 'Student.sql';
注意:導(dǎo)出后默認(rèn)存儲(chǔ)在數(shù)據(jù)庫(kù)數(shù)據(jù)文件夾下,如
[root@localhost ~]# ll /var/lib/mysql/it/Student.sql
-rw-rw-rw-. 1 mysql mysql 169 12月 13 01:12 /var/lib/mysql/it/Student.sql導(dǎo)入文本文件有兩種方式:
方法一:使用LOAD DATA INFILE基本語(yǔ)法:LOAD DATA [local] INFILE file INTO TABLE table [option];
示例:mysql> delete from Student;mysql> LOAD DATA INFILE 'Student.sql' INTO TABLE Student;方法二:使用mysqlimport命令基本語(yǔ)法:mysqlimport -uuser -ppasswd [--local] dbname file [option]
示例:mysql> delete from Student;[root@localhost ~]# mysqlimport -uroot -p123456 it 'Student.sql'