運維工做的核心簡單歸納起來就是兩件事:第一個是保護公司的數據,第二個是讓網站可以7*24小時提供服務。mysql
雖然這兩件事情都很重要,可是相比較而言,丟失一部分數據和讓網站7*24小時提供服務,哪一個更重要呢?sql
對於絕大多數企業來說,失去數據就至關於失去商機,失去產品,失去客戶,甚至會形成公司倒閉,那麼,在全部的數據中,最核心的數據又是哪些呢?這恐怕要屬數據庫中的數據了。既然數據庫中的數據地位這麼高,那麼數據庫備份與恢復的重要性就不言而喻了。數據庫
MySQL數據庫自帶了一個很優秀的備份命令,即mysqldump。bash
mysqldump oldboy >/opt/mysql_bak.sql
mysqldump -B oldboy >/opt/mysql_bak_B.sql #B參數的做用是增長建立數據庫和鏈接數據庫的語句,可同時備份多個庫。
mysqldump -B oldboy|gzip>/opt/mysql_bak_B.gz
利用mysqldump命令備份數據的過程,實際上就是把數據(包括庫表)從MySQL庫裏以SQL語句的形式直接輸出或者生成備份文件的過程,這種備份成SQL語句的方式稱爲邏輯備份。運維
使用mysqldump命令能夠把數據庫中的數據導出來,並經過SQL語句的形式存儲。這種備份方式稱爲邏輯備份,效率不是很高。在當下的生產場景中,多用於數據量不是很大的備份狀況,例如30GB之內的數據。若在數據庫數據很大的時候採用此備份方法,則所用的時候就會很長,恢復的時間也會很長,所以,當數據大於30GB後,建議選擇其餘的諸如Xtrabackup的物理方式進行備份和恢復。網站
mysqldump -B oldboy oldboy_utf8 mysql|gzip>/opt/all.sql.gz
分庫備份實際上就是每次只執行一個mysqldump備份命令語句備份一個庫,若是數據庫裏有多個庫,就執行多條相同的語句來備份各個庫。rest
mysqldump -uroot -p'oldboy123' -B oldboy |gzip >/tmp/oldboy.sql.gz mysql -e "show databases;" |egrep -v "_schema|atabase" |sed -r 's#^(.*)#mysqldump -B \1 |gzip >/tmp/\1.sql.gz#g' |bash #bash執行這些備份命令,就是一次分開備份多個庫了
當不加-B參數備份數據庫時,例如「mysqldump oldboy test」,mysqldump命令默認就會把oldboy看成庫,把test看成表,若是後面還有多個字符串,例如「mysqldump oldboy test test1「,那麼除了oldboy爲庫以外,其餘的test、test1都是oldboy庫的表。日誌
mysqldump oldboy test>/tmp/oldboy_test,sql
分表備份的缺點:數據文件多,很碎,一旦須要所有恢復又很麻煩。code
一、作一個完整備份,再作一個分庫分表備份。ip
二、雖然文件多、碎,但能夠利用腳本批量操做多個SQL文件。
mysqldump mysql user db>/tmp/mysql.sql egrep -v "#|\*|--|^$" /tmp/mysql.sql mysqldump oldboy test > /tmp/oldboy_test.sql
利用mysqldump的-d參數能夠只備份表的結構,即建表的語句。
mysqldump -d oldboy >/opt/oldboy.sql
利用-t參數備份數據庫表的數據(SQL語句形式)。
mysqldump -t oldboy >/opt/oldboy1.sql
利用-T參數能夠實現將數據和表結構同時分離備份。
vi /etc/my.cnf secure_file_priv='' #在[mysqld]模塊下增長 /etc/init.d/mysqld restart mysqldump oldboy test --compact -T /tmp/
一、-d參數的做用是隻備份庫表結構(SQL語句形式)。
二、-t參數的做用是隻備份表內的數據(SQL語句形式)。
三、-T將庫表和數據分離成不一樣的文件,數據是純文本,表結構是SQL語句。
binlog是一個二進制格式的文件,用於記錄用戶對數據庫更新的SQL語句信息,例如更改數據庫庫表和更改表內容的SQL語句都會記錄到binlog裏,可是對庫表等內容的查詢則不會記錄到日誌中。
當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的binlog文件裏。
使用mysqldump備份時,通常是對某一時刻的數據進行全備,例如,0點進行數據庫備份。
假設是天天0點對數據庫進行備份,那麼在兩次備份之間就有24小時的數據沒有備份,在這期間若是數據庫發生故障,使用mysqldump全量恢復也只能恢復到當日0點,可是有了binlog文件,就能夠將兩次完整備份間隔之間的數據還原,由於binlog文件裏的數據就是寫入數據庫的數據,使用binlog文件恢復數據,咱們稱之爲二進制增量數據恢復。
刷新(切割)binlog日誌的目的就是肯定全備和增量備(binlog文件)的臨界點,當全備完成後,全備時刻之前的binlog文件就無用了(全備裏已有這部分數據了),可是全備之後到下一次全備以前的數據就是十分重要的,這部分數據就存在於binlog文件裏,所以在進行全備時須要找到全備以後和binlog增量之間的臨界點,使得恢復時,須要的binlog文件數據一條很少(不能和全備的內容重合),一條很多(全備後的全部數據都要有)。