看了上一篇博文的發佈時間,到目前已經有三個月沒更新博文了。這三個月經歷了不少事情,包括工做、生活和感情等等。因爲我的發展的緣由,這個月準備換工做啦。在這段時間,我會把Web大型項目中所接觸到的技術都總結出來,分享給各位支持個人博友。博客園是個好地方,在這裏能學到不少東西,同時你也能夠收穫不少東西,就好比我本人,去年被兩個比較大型的在線培訓機構邀請當講師(只接受了一家,固然因爲太忙因此課程錄製也不是特別多),另有一企業聘請我寫一本技術相關的書籍(我拒了,沒時間寫)等等,這些都是我在博客園裏獲得的回報。因此仍是要感謝博客園這個平臺。mysql
好了,廢話很少說,直接進入今天的知識分享。此次博文我將分享下MySQL的用戶受權和bin-log日誌,這博文是爲下一篇 MySQL主從複製技術博文作準備的,本博文並非理論解釋這些技術,而是經過實戰去應用這些技術,由於,理論的東西,百度一下就一大堆,而實際如何去應用的,或者百度上比較少,因此,我分享的技術都是理論+實戰,讓博友閱讀完本文後,就能本身動手去作實驗,讓本身更深刻完全地理解好這些較爲高級的技術。sql
1、平臺環境數據庫
centos6.五、MySQL5.6.22。首先固然是要有本身的環境,我是在虛擬機上去模擬實驗的,由於MySQL要實現主從複製,因此須要兩個服務器環境,因此在虛擬機中,你能夠克隆一份如出一轍的服務器,以下圖:centos
我這裏的服務器裏已經提早安裝好MySQL了,這裏我就不演示去安裝環境了。這裏我已經正常進入兩個服務器,而後啓動了MySQL。(要是這些操做過程不懂,能夠留言)到此咱們就把環境都準備好了。服務器
2、MySQL用戶受權ide
因爲我演示的是主從複製技術,因此我這裏只講解給從服務器設置受權用戶,也就是隻受權給從服務器鏈接到主服務器去。這裏個人主服務器的IP是192.168.197.129,從服務器的IP的192.168.197.130。學習
首先查看下主數據庫服務器裏的用戶表,這裏咱們知道目前只有root用戶,測試
接着咱們要添加一個新用戶,而後只能是從服務器去鏈接:spa
grant all privileges on *.* to kelly@192.168.197.130 identified by '123456';命令行
這裏我解釋下這句命令行的意思,grant all指的是受權全部操做權限(增刪改查),*.*指的是全部數據庫,kelly指的是用戶名,123456是密碼,192.168.197.130指的是所要受權的遠程IP地址。整一句的意思是,建立一個用戶kelly密碼爲123456,而後將此用戶受權給遠程IP爲192.168.197.130能夠訪問,此用戶能夠訪問主服務器裏的全部數據庫。
接着咱們實際操做一遍,
而後咱們在從服務器進行鏈接,再查看下是否 是主服務器的數據庫:
到此,咱們已經完成了給從服務器受權,你們跟着上面一步步操做進行測試,我相信會成功的,如有問題能夠留言。
3、bin-log日誌
bin-log日誌的定義和做用我就直接百度過來了,也很好理解的。
基本定義:二進制日誌,也成爲二進制日誌,記錄對數據發生或潛在發生更改的SQL語句,並以二進制的形式保存在磁盤中;
做用:能夠用來查看數據庫的變動歷史(具體的時間點全部的SQL操做)、數據庫增量備份和恢復(增量備份和基於時間點的恢復)、MySQL的複製(主主數據庫的複製、主從數據庫的複製)
文件位置:默認存放位置爲數據庫文件所在目錄下
文件的命名方式: 名稱爲hostname-bin.xxxxx (重啓mysql一次將會自動生成一個新的binlog)
狀態的查看:mysql> show variables like '%log_bin%';
以上這些都是百度複製過來的,咱們看完後也很好理解了,bin-log日誌也就是二進制日誌,只要數據發生改變(增刪改),都是記錄到日誌裏。因此咱們能夠經過bin-log日誌進行數據恢復。
一、開啓big-log日誌
打開MySQL的配置文件:/etc/my.cnf(我這裏的MySQL是放在/etc下的),
在配置文件中添加此行代碼: log-bin=mysql-bin,
而後重啓下MySQL:service mysqld restart
進入數據庫查看是否開啓成功:mysql> show variables like '%log_bin%';
接着我實際演示一次:
根據介紹流程操做是成功的,你們要本身動手測試下。
二、bin-log日誌的使用
首先咱們來認識幾個與bin-log相關的MySQL命令:
flush logs; 會多一個最新的bin-log日誌
show master status; 查看最後一個bin-log日誌的相關信息
reset master; 清空全部的bin-log日誌
咱們先看一下bin-log日誌放在哪:
這個時候咱們進入到MySQL裏,查看一下最後一個bin-log日誌信息
而後刷新一下bin-log日誌,再查看下最後一個bin-log日誌,此時已經變成了000002這個版本了,之後的增刪改操做就記錄在這個最新的bin-log日誌裏
咱們能夠看一下bin-log日誌存放的目錄,這裏就多出了新版本的bin-log日誌000002,之後的操做都是記錄在這裏面了
接着咱們建立一個數據庫,而後建立一個表,再插入一些記錄,而後再查看下日誌信息有沒有變化
接着咱們再看下bin-log信息,此時位置已經發生了變化,也就是說已經對剛纔的操做進行了記錄。
接着咱們打開二進制日誌,看看裏面就是記錄了什麼,咱們須要知道的是,若是用vi打開二進制日誌的亂碼的,因此咱們須要使用下面的命令進行打開:
/usr/local/mysql/bin/mysqlbinlog --no-defaults mysql-bin.000002
我把打開的日誌截圖看看(截圖太多了但願你們別介意,由於想讓你們瞭解的更清楚),我用紅色圈起來的都是咱們須要注意的,end_log_pos大概的意思是這這個操做的最後位置在哪,例如:end_log_pos 400,在299-400之間是存了插入操做的記錄的,insert into test1 values(1); 其餘的能看懂就本身看,不懂看錯就跳過也沒事。
下面咱們來作一個利用二進制恢復數據庫數據的操做。
流程以下:
(1)先生成一個新的日誌文件(000003);
(2)而後刪除test1表的數據;
(3)而後利用前一個日誌恢復數據(000002);
(4)最後查看是否恢復成功。
具體以下:
接着用mysql-bin.000002進行數據恢復:咱們到數據庫裏查看下是否恢復成功了:
這個時候,已經證實咱們使用bin-log日誌進行數據恢復成功了。
在這裏可能有博友就會問:「博主,你那實驗在測試時是先刷新了個bin-log版本,假如我沒刷新,而後刪除語句就記錄在了000002這個版本了,那麼你怎麼恢復啊?由於你使用000002進行恢復,也是會執行刪除操做的記錄的,這不是坑爹嗎?」。
沒錯,假若有博友能想到這個了,那說明上面所講的知識點基本上理解了,並有本身去思考。這裏咱們固然有辦法在一個有刪除記錄的bin-log日誌進行數據恢復,你有想過爲啥會有end-log-pos這個位置記錄嗎?這就是咱們解決以上問題的方法之一:定位恢復,即恢復你想恢復的數據。我打個比方,在一個bin-log日誌裏,insert操做的end-log-pos爲250,而delete的end-log-pos爲300。那麼,咱們能夠將數據恢復到250這個位置,而以後的操做就不恢復了,這裏咱們先看一下mysqlbinlog的經常使用參數:
--stop-position = "100" --start-position = "50" 根據開始位置或者結束位置來恢復本身想恢復的參數
--stop-date= "2016-03-02 12:00:00" --start-date= "2016-03-02 11:55:00" 根據開始日期時間或者結束位置來恢復本身想恢復的參數
例如:
/usr/local/mysql/bin/mysqlbinlog --no-defaults mysql-bin.000001 --stop-position="450"|mysql -uroot -p
此句的意思就是將數據恢復到位置在450以前的就OK了,在450以後(假如後面還有操做記錄)的就不須要進行恢復了。
下面我經過實驗操做一次:
首先重置一下bin-log日誌,讓其恢復到初始狀態
接着插入幾條數據,再刪除些數據
這個時候咱們能夠看一下mysql-bin.000001裏的內容(這裏我只截取一部分):
因爲咱們知道刪除的是大於2的數據,因此知道3和4被刪除了,這裏咱們就恢復3和4(固然,假如誤刪了整個表,這裏就恢復到刪除操做以前的就能夠了)執行以下命令:
接着咱們進入數據庫查看下是否進行恢復成功:
到此,bin-log日誌的講解已經告一段落。
4、總結
本次博文對MySQL的用戶受權 和 bin-log日誌 這兩個知識點進行了詳細講解和實操,對此爲下一篇講解MySQL主從複製技術作好的鋪墊。但願想學到技術的朋友能夠本身跟着博文動手實驗一次,固然,高手能夠忽略,也能夠留言交流。
若是此博文中有哪裏講得讓人難以理解,歡迎留言交流,如有講解錯的地方歡迎指出。
若是您以爲您能在此博文學到了新知識,請爲我頂一個,如文章中有解釋錯的地方,歡迎指出。
互相學習,共同進步!