雖然不能恢復百分百,至少能將損失降到最低。
有個問題測試:
? 主從同步時,主庫網(wǎng)絡(luò)斷開,binlog dump線程kill掉,然后從庫一直是同步狀態(tài)。
? 從庫默認有個連接重試的時間,有時重試的時間很長,所以短時間內(nèi)是不連主庫的,此時從庫就會顯示是正常的狀態(tài)。
? Seconds_Behind_Master:0 從庫落后于主庫的秒數(shù)。是可以參考的 。
? Slave_IO_Running:YES
? Slave_SQL_Running:YES
? 如果報錯:Last_Errno:會有一個number值,顯示的是MySQL的錯誤號,從而判斷是什么錯誤
冷備份:需要離線備份,需要關(guān)閉服務(wù)才能進行備份。生產(chǎn)環(huán)境中不適用。
熱備份:需要在線備份
邏輯備份:如mysqldump:備份的是SQL語句
物理備份:對磁盤上的數(shù)據(jù)目錄進行打包,拷貝等
主從配置只是備份的一種解決方案。
調(diào)優(yōu):
? ?1、底層系統(tǒng)優(yōu)化,盡可能節(jié)省資源。更多的資源交給MySQL處理,
? ?2、優(yōu)化數(shù)據(jù)庫運行方式,優(yōu)化變量,能夠運行更高效。
? ?3、優(yōu)化數(shù)據(jù)庫線程,如:線程重用技術(shù),從而提高數(shù)據(jù)庫訪問效率,線程利用效率。
? ?4、搭建NoSQL緩存,
衡量數(shù)據(jù)備份是否合格,2個重要的指標:
? 1、RPO 恢復點目標(關(guān)注的是恢復數(shù)據(jù)的程度)
? 2、RTO 恢時間目標(恢復數(shù)據(jù)需要多長的時間)
?生產(chǎn)環(huán)境中,不同的備份方式包含的備份指標是不太一樣的。
生產(chǎn)環(huán)境中常見的備份方式:
? 最基本的:
?1、冷備份。
? 最簡單,也最容易實現(xiàn)。數(shù)據(jù)目錄:/var/lib/mysql(yum安裝后的默認位置),存放了所有數(shù)據(jù)庫文件,以及索引文件等信息。只需要將這個目錄下的所有文件,進行拷貝保存,當數(shù)據(jù)出現(xiàn)問題、需要恢復的時候,只需要:將這個目錄拷貝到需要恢復的主機即可。
? 然而在生產(chǎn)環(huán)境中,這種方式?jīng)]什么用、因為在生產(chǎn)環(huán)境的機器中,都是需要7*24小時在線提供服務(wù)的,這種冷備份需要先停機,然后再備份。這樣影響了在線的業(yè)務(wù),所以這樣雖然簡單,但只適合特殊的環(huán)境,對不間斷提供業(yè)務(wù)的環(huán)境這種方式不適合。
?2、快照備份。
? Raid,LVM(邏輯卷,屬于熱備份支持在線備份。)
? LVM中:LVM快照的功能,如果MySQL安裝在的是一個LVM的分區(qū),可以通過快照的功能,將數(shù)據(jù)文件,數(shù)據(jù)庫、數(shù)據(jù)表、以及日志文件都通過快照進行備份。
? 有個很大的缺點:必須保證要備份的數(shù)據(jù)文件都存在一個邏輯卷中,然后對這個卷進行快照備份。
? 還有一個問題是:只能存放在本地。
?2-1、備份的數(shù)據(jù),全部存放在一個邏輯卷中。
?2-2、只支持本地備份。
3、邏輯備份。
? 官方的工具,mysqldump,支持默認的數(shù)據(jù)庫存儲引擎。相對簡單,是通過sql語句備份的。
? 問題:備份速度稍慢。(這是一種單線程的備份工具,處理一個升級版:mydumper)
普通文件的數(shù)據(jù)同步
? 1、NFS網(wǎng)絡(luò)文件共享可以同步存儲數(shù)據(jù)(明文傳輸?shù)?
? 2、samba共享數(shù)據(jù)
? 3、定時任務(wù)或守護進程結(jié)合rsync,scp。
? 4、inotify(sersync) + rsync觸發(fā)式實時數(shù)據(jù)同步
? 5、ftp數(shù)據(jù)同步
? 6、ssh key + scp/rsync
? 7、svn版本管理
? 8、rsync,sersync,inotify,union(雙向同步),csync2(多向同步)
MySQL的主從同步不是磁盤上文件直接同步。replication
在主從復制的基礎(chǔ)上如何保證數(shù)據(jù)的完整性:
? 1、在主庫宕機的時,將主庫的bin-log日志拉取,讓從庫將數(shù)據(jù)恢復。(百度的支付,游戲支付可能是這么做的)
? 2、雙向?qū)懭霐?shù)據(jù)(占用資源較多)
? 3、用程序記錄宕機時的所有數(shù)據(jù)(寫一分鐘的log,記錄到內(nèi)存中)
? 4、將異步同步,該為實時同步。在MySQL上有個谷歌開發(fā)的半同步插件。某個半同步從庫成功,再向前面報告成功,將這2個主、從綁定到一起,要成功一起成功。先寫的主。
MySQL主從復制原理過程:
?1、slave服務(wù)器上執(zhí)行start slave,開啟主從復制開關(guān)。
2、此時,slave服務(wù)器的IO線程會通過在master上授權(quán)的復制用戶權(quán)限請求連接master服務(wù)器,并請求從指定Binlog日志文件的指定位置(日志文件名和位置就是在配置主從復制服務(wù)時執(zhí)行change master命令時指定的),之后發(fā)送Binlog日志內(nèi)容。
?3、master服務(wù)器接收到來自slave服務(wù)器的IO線程的請求后,master服務(wù)器上負責復制的IO線程根據(jù)slave服務(wù)器的IO線程請求的信息讀取指定的Binlog日志 指定位置之后的 Binlog日志信息,然后返回給slave端的IO線程,返回的信息中除了Binlog日志內(nèi)容外,還有本次返回日志內(nèi)容后在master服務(wù)器端的新的Binlog文件名稱以及在Binlog中的下一個指定需要更新位置。
?4、當slave服務(wù)器的IO線程獲取到來自master服務(wù)器上的IO線程發(fā)送的日志內(nèi)容以、日志文件、位置點后,將Binlog日志內(nèi)容依次寫入到slave端自身的RelayLog(即中繼日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并將新的Binlog文件名和位置記錄到:master-info文件中,以便下一次讀取master端新的Binlog日志時能告訴master服務(wù)器需要從Binlog日志的哪個文件哪個位置開始請求新的Binlog日志內(nèi)容。
?5、slave服務(wù)器端的SQL線程實時的檢測本地RelayLog中新增的日志內(nèi)容,然后及時的把Log文件中的內(nèi)容解析成在master端曾經(jīng)執(zhí)行的SQL語句的內(nèi)容,并slave自身按語句的順序執(zhí)行應(yīng)用這些SQL語句,應(yīng)用完畢后清理應(yīng)用過的日志。
6、經(jīng)過了上面的過程,就可以確保在master端和slave端執(zhí)行了同樣的SQL語句。當復制狀態(tài)正常的情況下,master端和slave端的數(shù)據(jù)是完全一樣的,MySQL的同步機制是由一些特殊情況的。
若從庫再作為主時,開啟Binlog日志:默認情況下復制過來后直接寫入數(shù)據(jù)庫文件,并不寫入log-bin,需要修改:log_slave_update后則可以寫入。
?1、主庫打開log-bin 二進制日志文件
?2、主庫授權(quán)用戶:grant replication slave on *.* to 'rep'@'192.168.88.%' identified by '123123';
? ?flush privileges; #刷新權(quán)限
?3、flush table with read lock;
#設(shè)置主庫只讀模式,暫時不可以寫入數(shù)據(jù)
?3-1、unlock tables;?
#解鎖數(shù)據(jù)表。
?4、備份主庫之前的數(shù)據(jù):mysqldump -uroot -p123123 -S /data/3306/mysql.sock ?-B -events --master-data=2 | gzip > rep.sql
#--master-data=2 #注釋create master to 命令。
###mysqldump備份數(shù)據(jù)之后,再確認主庫Binlog日志及位置是否發(fā)生變化,如果發(fā)生變化則備份是有錯誤的
? mysqldump -uroot -p123123 -S /data/3306/mysql.sock -A -B --master-data=1 --single-transaction | gzip > all_data.sql.gz
# --single-transaction 數(shù)據(jù)同步,InnoDB引擎,如果是MyISAM引擎會出現(xiàn)問題,如果是update語句可能會在dump的時候重復執(zhí)行2次。
master.info文件用于從庫的IO線程獲取主庫的Binlog日志
relay-log.info用于從庫SQL線程記錄Binlog日志文件及Binlog文件的位置
MySQL主從同步配置步驟:
? 1、準備倆臺數(shù)據(jù)庫環(huán)境,或單臺多實例環(huán)境,能夠正常啟動和登錄。
? 2、配置my.cnf文件,主庫配置log-bin和server-id參數(shù),從庫配置server-id,不能和主庫及其他庫一樣,一般不開啟從庫log-bin功能,注意:配置參數(shù)后要重啟后生效。如果級聯(lián)主從:則做為從庫又是主庫的配置文件需要開啟:log-bin 和 log-slave-update 后才會正常寫入。
? 3、登錄主庫增加用于從庫連接主庫同步的帳號:
? ? grant replication slave on *.* to 'rep'@'192.168.88.%' identified by '123123';
? 4、登錄主庫,整庫鎖表:flush table with read lock(窗口關(guān)閉即失效,超時參數(shù)到了也失效),然后:show master status; 查看Binlog日志文件及位置狀態(tài)。
補充:
5.1版本:flush tableswith read lock
? ?5.5版本:flush table with read lock
提示:鎖表命令的事件,在不同的引擎的情況,會受下面參數(shù)的控制,鎖表時,如果超過設(shè)置時間不操作會自動解鎖。
? ?interactive_timeout=60
? ?wait_timeout=60
? show variables like '%timeout%';
設(shè)置超時時間:
set global wait_timeout=10;
set global interactive_timeout=10;
退出再登錄即可查看到修改后的參數(shù)。重啟服務(wù)后會失效。永久設(shè)置,在設(shè)置后,修改配置文件。
? 5、新開窗口,Linux命令行備份或?qū)С鲈械臄?shù)據(jù)庫數(shù)據(jù),并拷貝到從庫所在的服務(wù)器目錄。
? ? mysqldump -uroot -p123123 -S /data/3306/mysql.sock -A -B --events --master-data=2 | gzip > rep.sql
? 6、解鎖主庫,unlock tables;
? 7、把主庫導出的原有數(shù)據(jù)恢復到從庫
? 8、根據(jù)主庫的show master status查看binlog的位置狀態(tài),在從庫執(zhí)行 change master to...語句。
? 9、從庫開啟同步開關(guān),start slave;
? 10、從庫 show slave status\G; 查看同步狀態(tài),并在主庫進行更新測試。
MySQL主從復制原理要點:
? 1、異步方式同步
? 2、邏輯同步模式,多種模式,默認是通過SQL語句執(zhí)行。
? 3、主庫通過記錄binlog實現(xiàn)對從庫的同步,binlo記錄數(shù)據(jù)庫的更新
? 4、主庫1個IO線程,從庫由1個IO線程一個SQL線程來完成的,剛開時候的時候是由主庫的主進程負責的,處理完后才交給主庫的IO線程的,之后主庫的IO,和從庫的IO才會進行傳輸。
5、從庫關(guān)鍵文件master.info, relay-log , relay-info 功能。
? 6、如果從庫需要級聯(lián)從庫,需要打開 log-bin 和 log-slave-updates 參數(shù)。
生產(chǎn)場景快速配置MySQL主從復制方案:
? 1、安裝好配置從庫的數(shù)據(jù)庫,配置好log-bin和server-id參數(shù)。
? 2、無序配置主庫my.cnf文件,主庫的bin-log和server-id參數(shù)默認配置好的。
? 3、登錄主庫增加用于從庫連接主庫同步的帳號:
? ? grant replication slave on *.* to 'rep'@‘192.168.88.%’ identified by '123123';
4、使用半夜mysqldump帶--master-data=1備份的全備數(shù)據(jù)恢復到從庫。
? 5、在從庫執(zhí)行change master to...語句,無需binlog文件及對應(yīng)位置點。
? 6、從庫開啟同步開關(guān),start slave;
? 7、從庫show slave status\G;檢查同步狀態(tài),并在主庫進行更新測試。
復制主線程狀態(tài):
? 下面列出了主服務(wù)器的Binlog Dump線程的State列的最常見的狀態(tài)。如果沒有在主服務(wù)器上看見任何Binlog Dump線程,說明復制沒有在運行,即目前沒有連接任何從服務(wù)器
? 1、Sending binlog event to slave
? ?二進制日志由各種事件組成,一個事件通常為一個更新加一些其他信息。線程已經(jīng)從二進制日志讀取了一個事件并且正將它發(fā)送到從服務(wù)器
? 2、Finished reading one binlog;switching to next binlog
? ?線程已經(jīng)讀完二進制日志文件并且正打開下一個要發(fā)送到從服務(wù)器的日志文件。
? 3、Has sent all binlog to slave;waiting for binlog to be updated
? ?線程已經(jīng)從二進制日志讀取所有主要的更新并且已經(jīng)發(fā)送到了從服務(wù)器。線程現(xiàn)在正空閑,等待由主服務(wù)器上新的更新導致的出現(xiàn)在二進制日志中的新事件。
? 4、waiting finalize termination
? ?線程停止時發(fā)生的一個很簡單的狀態(tài)。
從IO線程狀態(tài):
? 下面列出了從服務(wù)器的I/O線程的State列的最常見的狀態(tài)。該狀態(tài)也出現(xiàn)在Slave_IO_State列,由show slave status顯示??梢酝ㄟ^該語句仔細瀏覽所有發(fā)生的事情。
? 1、Connecting to msater
? ?線程正視圖連接主服務(wù)器
? 2、Checking master version
? ?建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài)
? 3、Registering slave on master?
? ?建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài)
? 4、Requesting binlog dump
? ?建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài)。線程向主服務(wù)器發(fā)送一條請求,索取從請求的二進制日志文件名和位置開始的二進制日志的內(nèi)容。
? 5、Waiting to reconnect after a failed binlog dump request
? ?如果二進制日志裝儲請求失敗(由于沒有連接),線程進入睡眠狀態(tài),然后定期嘗試重新連接??梢允褂?--master-connect-retry 選項指定重試之間的間隔。
? 6、Reconnecting after a failed binlog dump request
? ?線程正嘗試重新連接主服務(wù)器
? 7、Waiting for master to send event
? ?線程已經(jīng)李娜街上主服務(wù)器,正等待二進制日志事件到達。如果主服務(wù)器正空閑,會持續(xù)較長的時間,如果等待持續(xù)slave_read_timeout秒,則發(fā)生超時。此時,線程認為連接被中斷并企圖重新連接。
? 8、Queueing master event to the relay log
? ?線程已經(jīng)讀取一個事件,正將它復制到中繼日志供SQL線程來處理。
? ?隊列master事件,已經(jīng)拿到binlog日志,往relay-log文件中塞的過程。
? 9、Waiting to reconnect after a failed master event read
? ?讀取時(由于沒有連接)出現(xiàn)錯誤。線程企圖重新連接前將睡眠master-connect-retry秒。
? 10、Reconnecting after a failed master event read
? ?線程正嘗試重新連接主服務(wù)器,當連接重新建立后,狀態(tài)變?yōu)閃aiting for master to send event。
? 11、Waiting for the slave SQL thread to free enough relay log space
? ?正使用一個非零relay_log_space_limit值,中繼日志已經(jīng)增長到其他組合大小超過該值。I/O線程正等待,直到SQL線程處理中繼日志內(nèi)容并刪除部分中繼日志文件來釋放足夠的空間。
? 12、Waiting for slave mutex on exit
? ?線程停止時發(fā)生的一個很簡單的狀態(tài)。
通過查看這些狀態(tài),從而指導MySQL工作到什么程度了,主的I/O、從的I/O、從的SQL都處于什么狀態(tài),所以當數(shù)據(jù)不同步的時候可以通過查看這些狀態(tài)來定位問題。
?通過MySQL線程同步狀態(tài)查看數(shù)據(jù)同步是否完成,用于主庫宕機或人工數(shù)據(jù)庫主從切換遷移等。
?主庫宕機選擇最快的從庫提升為主,就需要查看,當然也可以利用MySQL的半同步功能,選擇固定的庫提升為主。
?1、先鎖表,停止用戶寫入數(shù)據(jù)。flush table with read lock;
?2、查看狀態(tài)是否已經(jīng)將二進制文件發(fā)送完畢,show processlist;
?3、切換主庫。
?4、查看從庫是否將主庫的binlog日志,全部拉取過來。是否都寫入到了從庫
復制從SQL線程狀態(tài):
? 下面列出了從服務(wù)器的SQL線程的State列的最常見的狀態(tài)。
? 1、Reading event from the relay log
? ?線程已經(jīng)從中繼日志讀取一個事件,可以對事件進行處理了。
? 2、Has read all relay log; waiting for the slave I/O thread to update it?
? ?線程已經(jīng)處理了中繼日志文件中的所有事件,現(xiàn)在正等待I/O線程將新事件寫入中繼日志。
? 3、Waiting for slave mutex on exit
? ?線程停止時發(fā)生的一個很簡單的狀態(tài)
? ?I/O線程的State列也可以顯示語句的文本。這說明線程已經(jīng)從中繼日志讀取了一個事件,從中提取了語句,并且正在執(zhí)行語句。?
讀寫分離配置方案:
? 中大型公司:通過程序(php,java)實現(xiàn)讀寫分離
? 測試環(huán)境:代理軟件(mysql-proxy,amoeba)
? 門戶網(wǎng)站,分布式dbproxy(讀寫分離,hash負載均衡,健康檢查),一主多從,主從同步
如何實現(xiàn)MySQL主從讀寫分離:
? 1、通過程序?qū)崿F(xiàn)讀寫分離(性能,效率最佳,推薦使用)
?? php和Java程序都可以通過設(shè)置多個連接文件輕松的實現(xiàn)對數(shù)據(jù)庫的讀寫分離,即當select時,就去連接讀庫的連接文件,當update,insert,delete時就連接寫庫的連接文件。
? 2、通過軟件實現(xiàn)讀寫分離
? ?MySQL-proxy,Amoeba等代理軟件也可以實現(xiàn)讀寫分離功能,但最好的還是程序?qū)崿F(xiàn)讀寫分離。
? 3、開發(fā)dbproxy,不對外,大戶都是內(nèi)部使用的。?
MySQL自帶的備份命令,mysqldump
語法:mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 > 備份的文件名.sql
?mysqldump testdata > bak.sql
#對數(shù)據(jù)庫testdata進行備份。?
?mysql data1 < bak.sql
#恢復的時候需要指定數(shù)據(jù)庫,恢復備份數(shù)據(jù)庫中的數(shù)據(jù)表。
##如果還原的是數(shù)據(jù)庫,則不需要指定 數(shù)據(jù)庫名稱。
?mysqldump data1 t1 > backt.sql
#只備份了data1數(shù)據(jù)庫中的 t1 數(shù)據(jù)表?;謴屯稀?/p>
?mysqldump --database data1 data2 > databak.sql
#同時備份數(shù)據(jù)庫data1,data2,需要用--database指定備份的是數(shù)據(jù)庫。
?mysqldump --all-database > alldata.sql
#備份數(shù)據(jù)庫管理系統(tǒng)中的所有數(shù)據(jù)庫?;謴蛣h除掉的。
區(qū)別:
?mysqlhostcopy: 可以實現(xiàn)MySQL在某些情況下,能夠?qū)崿F(xiàn)MySQLdump不方便做的一些功能,如:備份所有以A開頭的數(shù)據(jù)庫,可以很好的和正則表達式集合起來用。
? 是快速文件意義上的備份,相當于cp命令,但比cp效率高很多。
? 只能在本地操作。
? copy備份文件到數(shù)據(jù)目錄覆蓋即可。
? 只支持MyISAM存儲引擎
?mysqldupm:
? 是一個數(shù)據(jù)庫端的sql語句的集合,里面全都是sql語句。
? 可以遠程操作(最終的備份文件,還是存放在原服務(wù)器上的)
? 還原時,導入SQL文件。
? 支持MyISAM和InnoDB存儲引擎
倆者支持的存儲引擎不同,安裝時候的條件不一樣,操作的方法不一樣,
共同點:
? 在做操作的時候,都要執(zhí)行鎖表的操作(行級鎖,表級鎖,頁級鎖)
?mysqlhostcopy --flushlog --regexp=^a /backup
#如果數(shù)據(jù)庫中沒有備份的內(nèi)容則會報錯
# --flushlog必須加的,用來刷新日志系統(tǒng)。--regexp=指定備份什么樣的數(shù)據(jù)庫
場景:
? ?mysqldump + 計劃任務(wù) 在凌晨1點備份,然而3點的時候,需要恢復數(shù)據(jù),也就是1點到3點之間的數(shù)據(jù)沒有了。這時候就需要 : 二進制文件備份。(利用的是MySQL中提供的日志功能來進行備份的)
MySQL中的日志:
? ?網(wǎng)站一般有2個日志文件:一個訪問日志,一個錯誤日志
? ?FTP:一個日志文件。
? ?數(shù)據(jù)庫:有多個日志文件。錯誤日志,一般查詢?nèi)罩?,慢查詢?nèi)罩?,二進制日志,事務(wù)日志等。
show global variables like '%log%';
# 在MySQL中所啟動的日志相關(guān)的一些變量。
binlog開頭的二進制日志信息。
innodb開頭的事務(wù)日志。
general_log:查詢?nèi)罩?。也叫一般查詢?nèi)罩镜娜罩拘畔ⅰ?/p>
relay_log: 中繼日志
log_slow_gueries: 有slow的屬于慢查詢?nèi)罩尽?/p>
錯誤日志的信息:
?show global varibales like 'log_error';
#查看錯誤日志信息位置。
? 1、服務(wù)器在啟動和關(guān)閉過程中一些信息,運行過程中產(chǎn)生的一些錯誤信息也會記錄
? 2、主從聯(lián)機的時候,從服務(wù)器上產(chǎn)生的一些信息,也會存放到主服務(wù)器的錯誤日志中,
修改日志文件位置:修改主配置文件: my.cnf 在[mysqld_safe]模塊下
一般查詢?nèi)罩荆?/p>
? 記錄對數(shù)據(jù)庫的查詢操作,如:select、show。
? general_log:設(shè)置一般查詢?nèi)罩臼欠裥枰_啟,默認是OFF關(guān)閉狀態(tài)。
為什么默認是關(guān)閉的:比如:電商網(wǎng)站,在高并發(fā)查詢商品的時候都會記錄下來,從而日志增加非???,并且記錄用戶查詢商品的記錄沒有多大意義。
? 這也可以得到用戶的一些操作習慣,分析用戶的購物需求,這些不是通過數(shù)據(jù)庫的查詢?nèi)罩緦崿F(xiàn)的,是通過會話實現(xiàn)的
? general_log_file:設(shè)置一般查詢?nèi)罩镜哪J存放位置
開啟查詢?nèi)罩疚募?在主配置文件:my.cnf中[mysqld]模塊下:log=ON.即可。修改配置文件需要重啟服務(wù)才會生效。
一般查詢?nèi)罩颈4娴念愋停?/p>
? show global variables like 'log_output';
#value對應(yīng)的值是:FILE。這個值可以改成table,這樣會一般日志在保存信息的時候不是存在文件里,而存到數(shù)據(jù)庫中。以數(shù)據(jù)表的形式記錄日志的信息。
? 一般查詢?nèi)罩驹谏a(chǎn)環(huán)境中不打開,是為了節(jié)省服務(wù)器的資源。
慢查詢?nèi)罩荆?/p>
? ?為什么會查詢慢? 服務(wù)器性能達到瓶頸,網(wǎng)絡(luò)出現(xiàn)延遲,數(shù)據(jù)庫表結(jié)構(gòu)應(yīng)該優(yōu)化,數(shù)據(jù)量過大等原因。
從而導致查詢某條信息時,時間過長,這樣的信息都應(yīng)該保存起來,
log_slow_queries OFF: 默認是沒有開啟的。
打開,主配置文件中添加:[mysqld]模塊下:
log-slow-queries=/var/slow/mysql-slow.log
重啟服務(wù),使配置文件生效。
查詢慢的條規(guī)定設(shè)定的時間:
show global variables like '%long%';
#long_query_time:mysql默認的一個時間,如果達到設(shè)置的事件還沒有響應(yīng)的話,就人為這是一個慢查詢
? 修改主配置文件:
打開主配置文件:my.cnf [mysqld]模塊下添加:
?long_query_time=2 #設(shè)置超過2秒記錄到慢查詢?nèi)罩?,單位秒?/p>
二進制日志:
? ?如果只是用邏輯備份:mysqldupm + 計劃任務(wù),是沒辦法滿足生產(chǎn)環(huán)境中數(shù)據(jù)重要性備份的需求的。
所以需要通過二進制日志文件,對其進行一個補充,
特點:
? 會記錄所有更改數(shù)據(jù)庫狀態(tài)的SQL操作。如:create 、drop、update
查詢二進制日志文件是否開啟:
? show global variables like '%log%';
#log_bin 表示二進制日志的一個狀態(tài),默認是OFF,
打開二進制文件:
修改主配置文件,
?在[mysqld]模塊中:log-bin=mysql-bin。指定一下二進制文件即可開啟二進制日志。
??查看正在使用的二進制日志:
show binary logs;
#可以看到正在使用的二進制日志的文件名叫什么。后面的序號:00001表示使用的是第一個二進制文件
#file size:表示文件的大小。
查看這個二進制文件的內(nèi)容:
?show binlog events in 'mysql-bin.00001';
#查看正在使用的二進制文件里面的內(nèi)容。在數(shù)據(jù)目錄下
#log_name: 文件名
#Pos: 起始大小(記錄某個信息之前的大小,KB)
#Event_type: 日志文件的格式
#Server_id: 服務(wù)器默認分配的一個ID號。
#End_log_pos:結(jié)束的大小。(記錄完以后的大小,KB)
#Info: 記錄的信息。記錄的是更改數(shù)據(jù)時的命令SQL語句
? 用二進制管理工具,查看二進制日志文件:
?mysqlbinlog mysql-bin.000001
二進制日志文件恢復時候,指定恢復的范圍:
?1、通過事件指定還原范圍
? ?mysqlobinlog --start-datetime '2013-11-22 2:52:52' --stop-datetime '2013-11-22 2:55:44' mysql-bin.000001 | mysql -uroot -p
#這個命令實在數(shù)據(jù)目錄下執(zhí)行的。
?2、通過大小指定還原范圍
? ?mysqlbinlog --start-position 264 --sopt-positon 341 mysql-bin.000001 | mysql -uroot -p?
二進制文件:
? ‘/*!*/’ 作為分割,at 106:記錄的是文件的大小,第三行是:記錄的時間。
通過大小,或時間都可以將數(shù)據(jù)恢復。
二進制日志指定數(shù)據(jù)庫導出SQL語句:
? mysqlbinlog -d dbname mysql-bin.000002 > dbname.sql
# -d 截取指定庫的binlog文件SQL文件。
#從而可以指定需要恢復數(shù)據(jù)的數(shù)據(jù)庫,進行數(shù)據(jù)恢復。
二進制日志文件,指定位置點恢復:
? mysqlbinlog mysql-bin.000002 --start-position=365 --stop-position=465 -r pos.sql
# -r : 相當與是重定向
#導出的SQL語句是 365到465之間的SQL語句
二進制日志文件,指定時間點恢復:
? mysqlbinlog mysql-bin.000002 --start-datetime='2017-10-16 17:14:16' --stop-datetime='2017-10-16 17:15:20' -r time.sql
# -r : 相當于是重定向
#導出的SQL語句,都是在指定時間段內(nèi)的
# 這個時間不一定對應(yīng)上當時需要恢復數(shù)據(jù)的時間,可以是早些的時間:2017-10-16 17:14:10?
--master-data
? 這個值 =1 時:下面的語句是沒有注釋掉的
? 這個值 =2 時:下面的語句是由注釋掉的 --:表示注釋
change master to master_log_file='mysql-bin.000002',master_log_pos=1191;
mysqldump + 計劃任務(wù) + 二進制日志文件
?二進制文件雖然能幫助備份數(shù)據(jù)庫中的一些操作,然而還原的時候還是比較麻煩的,
更傾向于實時的備份方式。
完美備份方案: 主從數(shù)據(jù)備份是單向的。只可以主同步到從,反之是不可以的。
?多機配置之主從設(shè)置。
主服務(wù)器提供給用戶訪問及操作。
從服務(wù)器:用戶無法訪問,僅用來備份主服務(wù)器產(chǎn)生的數(shù)據(jù)。
從服務(wù)器作用:備份用戶訪問主服務(wù)器時操作所產(chǎn)生的所有的數(shù)據(jù)。
設(shè)置后:主服務(wù)器會打開一個線程(I/O),在從服務(wù)器上打開2個線程(I/O SQL).
如果一個用戶訪問了主服務(wù)器,提交了一個SQL請求,創(chuàng)建一個數(shù)據(jù)(create database aa;),這個請求會交給主服務(wù)器上的I/O線程,這時查詢管理其和存儲管理器就開始工作,會分析用戶的這次請求,解析語法,解析完這個語法后將這個語法執(zhí)行出來,執(zhí)行完以后就會產(chǎn)生一個結(jié)果,這個結(jié)果分倆部分保存:
? 第一部分:用戶提交的這個操作是個SQL語句,(所有更改數(shù)據(jù)的操作都會存到二進制日志文件中,時間越長二進制日志文件就會越多,所以需要有一個索引文件來管理這二進制日志文件,索引文件:mysql-bin.index)。用戶提交的請求會記錄到本機的二進制文件中,執(zhí)行后會在數(shù)據(jù)目錄中產(chǎn)生對應(yīng)的數(shù)據(jù)庫目錄(這個操作也是由線程提交過來的 )
? 在主從環(huán)境下,會實時的將數(shù)據(jù)備份給從服務(wù)器,(怎么傳給從服務(wù)器數(shù)據(jù),是以什么樣的方式保存的)
主服務(wù)器對從服務(wù)器做授權(quán)操作 grant replication slave 表示:授權(quán)某一個主機,可以來這里同步數(shù)據(jù)(授權(quán)一個用戶,密碼,權(quán)限 來訪問)。管理員在從服務(wù)器上生成一個文件,Master.info:這個文件由管理員輸入的(記錄了:登錄主服務(wù)器所需要的信息,這些信息由管理員通過:change master to挨個寫入,包括:(下有案例)
??????Master_host:服務(wù)器IP地址多少。
? ? ? Master_user: 服務(wù)器授權(quán)的用戶名。
??????Master_passwd: 服務(wù)器授權(quán)的密碼多少。
? ? ? Master_log_file: 服務(wù)器正在使用的二進制文件)
? ? ? Master_log_pos: 二進制文件是從哪里開始使用的
##可以生成master.info的登錄信息。
這些信息都是由管理員給從服務(wù)器輸入的。輸入完以后會在從服務(wù)器的數(shù)據(jù)目錄下生成一個Master.info的文件。將信息記錄在里面。
? 從而,從服務(wù)器就可以通過里面記錄的授權(quán)信息,用這些授權(quán)信息,嘗試連接主服務(wù)器,通過從服務(wù)器的I/O線程,向主服務(wù)器的I/O線程發(fā)起連接。
在主從環(huán)境中,為了讓同步更加高效,是將主服務(wù)器上的二進制日志文件,傳給從服務(wù)器,所以給從服務(wù)器的是二進制文件。
當從服務(wù)器拿到這個二進制文件后,會在從服務(wù)器上也生成一個文件,Relay-bin.000001這樣的文件(中繼日志文件,也就是完整拷貝了主的二進制日志文件中的信息)。從而記錄下主服務(wù)器上的一些用戶的操作,記錄在從服務(wù)器中的中繼文件中,這時候的從服務(wù)器的I/O線程就會通知另外一個線程工作,通知SQL線程,SQL線程會讀取中繼文件中的所有內(nèi)容,并且將其中的內(nèi)容完整的執(zhí)行一遍,從而從服務(wù)器也會在本地的數(shù)據(jù)庫中做出對應(yīng)的操作,
需要主從都開啟二進制文件記錄:
? 主配置文件: [mysqld]
?模塊下添加:
log-bin=mysql-bin ?#開啟二進制日志文件記錄
server-id=251 ? #區(qū)分主從服務(wù)器的身份,一般是IP地址的最后一位
show global variables like '%log_bin%';
#主從都需要,查看二進制文件:log_bin 是否ON。
登錄到主服務(wù)器的數(shù)據(jù)庫系統(tǒng)中:
? grant replication slave on *.* to slave_user@'從服務(wù)器IP地址' identified by '123123';
#授權(quán)從服務(wù)器可以通過用戶:slave_user,用密碼:123123等錄,對任何數(shù)據(jù)
? show master status;
#查看當前數(shù)據(jù)庫服務(wù)正在使用的二進制日志文件的,文件名以及大小
在從服務(wù)器上指定主服務(wù)器授權(quán)的權(quán)限:登錄到數(shù)據(jù)庫操作
? change master to master_host='主服務(wù)器IP地址',
? ? ?master_user='slave_user',
? ? ?master_password='123123',
? ? ?master_log_file='mysql-bin.000001', #這個參數(shù)需要查看主服務(wù)器
? ? ?master_log_pos=262; #這個參數(shù)需要查看主服務(wù)器
執(zhí)行后就會在從服務(wù)器的數(shù)據(jù)目錄文件下產(chǎn)生一個:master.info的配置文件。
? start slave;
#打開從服務(wù)器功能 登錄到數(shù)據(jù)庫操作?
? show slave status\G;
#查看從服務(wù)器狀態(tài)?
2-1、mysqldump -B
? 提示:-B參數(shù)表示接多個庫,并且增加use db,和create database db的信息。
? 生產(chǎn)環(huán)境:
? ? ?-B ? --database
? -B參數(shù)的作用:后指定多個數(shù)據(jù)
? ? mysqldump -uroot -p123123 -B dbname > /backup/dbnam_B.sql
? a)導出的語句會有一個創(chuàng)建數(shù)據(jù)庫的語句,使用數(shù)據(jù)庫的語句。
? ? ?mysql -uroot -p123123 < /backup/dbname_B.sql #可以直接導入,不用指定數(shù)據(jù)庫名
? b)-B后指定多個數(shù)據(jù)庫備份。
2-2、mysqldump的--compact參數(shù):可以減少輸出,輸出讓容量更少,只適合調(diào)試用。
? ?options:
? ?? --skip-add-drop-table
? ? ?--no-set-name
? ?? --skip-disable-keys
? ? ?--skip-add-locks
因為有了這些參數(shù),所以--compact參數(shù)不安全
2-3、mysqldump壓縮備份
? ?mysqldump -uroot -p123123 -B dbname | gizp > /backup/dbname.sql.gz
備份數(shù)據(jù)時 mysqldump 工具時:
?1、導出數(shù)據(jù)用 -B 參數(shù)
?2、管道符 gzip 進行壓縮
?3、-d : 備份表結(jié)構(gòu)
? ?mysqldump -uroot -p123123 -d dbname tblname;
?4、-t : 只備份數(shù)據(jù)
? ?mysqldump -uroot -p123123 -t dbname tblname;
?5、備份所有數(shù)據(jù)庫和表:-A
? ?mysqldump -uroot -p123123 -A -B --events | gzip > /backup/db_all.sql.gz
?6、切割bin-log日志:-F
?7、備份bin-log日志的位置:--master-data=1
? ? --master-data=2 時:會在前面加注釋。
?8、--compact 去掉注釋,適合調(diào)試輸出,生產(chǎn)不用。
一般的MyISAM引擎就是鎖表,鎖表后是不能操作,也不能訪問的
?9、-x,--lock-all-talbes 在備份數(shù)據(jù)的時候一般都是要鎖表的,從而保證數(shù)據(jù)的一致性。
?10、-l,--locak-tables 只讀鎖表
?11、--single-transaction 適合innoDB事務(wù)數(shù)據(jù)庫備份
? ?InnoDB表在備份時,通常啟用選項 --single-transaction 來保證備份的一致性,實際工作原理是設(shè)定本次會話的隔離級別為:REPEATABLE READ,保證本次會話(dump)時,不會看到其他會話已經(jīng)提交了的數(shù)據(jù)。?
生產(chǎn)環(huán)境MyISAM引擎?zhèn)浞輸?shù)據(jù):
?備份命令:
? mysqldump -uroot -p123123 -A -B --master-data=2 -x --events | gzip > /backup/all_db.sql.gz
生產(chǎn)環(huán)境InnoDB引擎?zhèn)浞輸?shù)據(jù):工作中推薦使用InnoDB引擎。
?備份命令:
? mysqldump -uroot -p123123 -A -B --master-data=2 --single-transaction --events | gzip > /backup/all_db.sql.gz
如果2種引擎都有,以MyISAM引擎為主

--triggers : 觸發(fā)器
--routines : 存儲過程
分庫備份:主要是為恢復數(shù)據(jù)時方便,恢復小數(shù)據(jù)庫時候很快
? mysql -uroot -p123123 -e "show databases;" | grep -Evi "database|info|perfo" sed -r "s#^([a-z].*$)#mysqldump -uroot -p123123 --events -B \1 ?| gzip > /backup/\1.sql.gz#g" | bash
#要注意,命令的每個參數(shù)之間必須要有空格分割
##命令行備份多個數(shù)據(jù)庫
mysqldump備份的是SQL語句,屬于邏輯備份
命令行for循環(huán):
gz文件解壓的文件是需要先解壓再批量導入的。
? for dbname in `ls *.sql | sed "s#_back.sql##g"` ; do mysql -uroot -p123123 < ${dbname}_back.sql ;done