MySQL數(shù)據(jù)備份和還原

雖然不能恢復百分百,至少能將損失降到最低。

有個問題測試:

? 主從同步時,主庫網(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、復制概述: MySQL內(nèi)建的復制功能是構(gòu)建大型,高性能應(yīng)用程序的基礎(chǔ)。將mysql的數(shù)據(jù)分布到多個系統(tǒng)上去,這...
    魔法師_閱讀 5,753評論 0 5
  • 環(huán)境 操作系統(tǒng):CentOS-6.5-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6....
    宇信智臻sy閱讀 2,789評論 0 6
  • 三俠來的時候,大俠,二俠,還有我正在玩CF,三俠進門的第一句話就是“兄弟們,我來了?!比齻b的這句話一下拉近了我們彼...
    王書著閱讀 1,813評論 0 0
  • 他指尖輕撫過琴鍵,她蜷坐在地毯,緊緊依靠著他的琴凳。他們的視線在彼此的四十五度處交匯。她低下頭一頁頁翻閱著手中的...
    煙雨逢時閱讀 337評論 0 1
  • 看看算是Lucy Cousins的小粉,從《Hooray for fish》到《maisy》,幾乎本本都非常...
    看看媽媽閱讀 2,367評論 2 3

友情鏈接更多精彩內(nèi)容