1. 程式人生 > >mysql開啟bin-log日誌,實習主從配置,讀寫分離

mysql開啟bin-log日誌,實習主從配置,讀寫分離

一、什麼是主從複製

至少兩臺資料庫伺服器,可以分別設定主伺服器和從伺服器,對主伺服器的任何操作(更新)都會同步到從伺服器上

二、實現原理

mysql中有一種日誌,叫做bin日誌(二進位制日誌),會記錄下所有修改過資料庫的sql語句。主從複製的原理實際是多臺伺服器都開啟bin日誌,然後主伺服器會把執行過的sql語句記錄到bin日誌中,之後從伺服器讀取這個bin日誌,把該日誌的內容儲存到自己中繼日誌裡面,從伺服器再把中繼日誌中記錄的sql語句同樣的執行一遍。這樣從伺服器上的資料就和

主伺服器相同了。

實現的技術是:使用者的授權,和log-bin日誌的開啟。

問題:如何解決主從同步過程中的延遲問題?

解答:可以在主從同步的過程中加一家快取伺服器,把剛更新的資料暫時儲存在快取伺服器中。

三、log-bin日誌

1、如何開啟log-bin日誌

開啟my.ini的配置檔案

Linux在lnmp中/etc/my.cnf配置檔案中進行配置

2、如何 檢視log-bin日誌裡面的內容。

使用一個命令,

mysqlbinlog  --no-defaults 日誌的檔名及路徑

mysqlbinlog --no-defaults --base64-output=decode-rows -v  /usr/local/mysql/var/mysql-bin.000005

直接mysqlbinlog出來的 檔案

執行sql部分的sql顯示為base64編碼格式

固生成sql記錄的時候 不能用常規的辦法去生成 需要加上相應的引數才能顯示出sql語句

--base64-output=decode-rows -v

當mysqlbinlog: command not found 時 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin

 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin

3、log-bin日誌相關的一些命令操作

前提:資料mysql相關的命令

flush logs 產生一個新的log-bin日誌

reset master :清空以前的log-bin日誌,併產生一個新的log-bin日誌

show master status; 檢視最新的一個log-bin日誌,包括最新的pos位置。

4、使用bin-log日誌完成一個案例,恢復資料的一個案例

步驟:

(1)flush logs產生一個新的log-bin日誌檔案。

(2)新建一張表

create table nihao(id int);

(3)flush logs 產生一個新的log-bin日誌檔案

insert into nihao values(1000);

insert into nihao values(2000);

insert into nihao values(3000);

(4)delete from nihao

(5)要求恢復資料

比如一個家公司,在上午9:00備份了一次資料。到9:30時,由於員工的誤操作,則把所有的資料都給刪除了。要求要恢復資料到9:30.

思路:開啟log-bin日誌檔案,進行分析。查詢insert語句的pos位置。根據pos位置來恢復資料

  第一步,檢視當前記錄日誌檔案的資訊

第二步,檢視操作的SQL語句的位置

第三步,使用以下命令進行還原

 mysqlbinlog   --no-defaults 日誌檔案 --start-pos=”開始的pos點” --stop-pos=’結束的pos點’

  |  mysql  -uroot  -proot  test

例如

mysqlbinlog --no-defaults --base64-output=decode-rows  d:/webserver/wamp/wamp64/bin/mysql/mysql5.7.14/data/mysql-bin.000008 --start-position="123" --stop-position="1213" | mysql -uroot -p test

四、主從配置

說明:在同步前,要同步的資料庫在兩個資料庫伺服器中都必須存在,兩個資料庫應該保持一致。開啟主從同步後,主伺服器的寫操作都會同步到從伺服器中。

1、配置主伺服器:

(1)主和從伺服器都要開啟log-bin日誌,每臺伺服器設定一個唯一的server-id的值。並重啟伺服器。

主伺服器:IP 192.168.1.114

(2)要給從伺服器授權一個使用者,該使用者授予複製許可權。

(3)grant replication slave on *.* to 'tang'@'%' identified by '123';

(3)要檢視主伺服器裡面log-bin日誌的名字和pos位置。(停止對主伺服器的操作,暫時不往裡面做更新操作)

show master status;

2、配置從伺服器

從伺服器:IP  192.168.1.252

(1)執行stop slave停止從伺服器: 

   stop slave

(2)具體的配置:

change master to master_host=’主伺服器的ip’,master_user=’授權的使用者名稱’,master_password=”授權的密碼”,master_log_file=’log-bin日誌檔案的名稱’,master_log_pos=pos位置;

change master to master_host='10.1.13.16',master_user='tang',master_password='123',master_log_file='mysql-bin.000010',master_log_pos=252;

(3)開啟從伺服器

start slave

(4)檢視從伺服器的狀態:

show slave status;

Slave_IO_Running:Yes

此程序負責從伺服器從主伺服器上讀取binlog 日誌,並寫入從伺服器上的中繼日誌。 

Slave_SQL_Running:Yes

此程序負責讀取並且執行中繼日誌中的binlog日誌, 

注:以上兩個都為yes則表明成功,只要其中一個程序的狀態是no,則表示複製程序停止,錯誤原因可以從”last_error”欄位的值中看到。

演示效果:

  主伺服器插入資料,可以在從伺服器上同步

    主伺服器

  

從伺服器

3、如何撤銷從伺服器

(1)stop slave

(2)reset slave all

  從伺服器

主伺服器

六、讀寫分離實現

在程式層次進行設計

class  mysql{

$dbm=主伺服器 

$dbs1=從伺服器 

$dbs2=從伺服器 

public function query(){

   在query裡面進行語句判斷,分析連線不同的mysql伺服器。 

如果是查詢則隨機連線兩臺從伺服器,如果是修改操作,則連線主伺服器

}

}

tp框架支援讀寫分離;

    'DB_DEPLOY_TYPE'=>1,//分散式資料庫支援

    'DB_TYPE'               => 'mysql',     // 資料庫型別

    'DB_HOST'               => 'localhost,192.168.3.250', // 伺服器地址

    'DB_NAME'               => 'php,php',          // 資料庫名

    'DB_USER'               => 'root,xiaogang',      // 使用者名稱

    'DB_PWD'                => 'root,1234',          // 密碼

    'DB_PORT'               => '3306',        // 埠

    'DB_PREFIX'             => '',

    'DB_RW_SEPARATE'=>true,//支援讀寫分離

說明: 以上配置為讀寫分離操作,如果需要做到讀寫分離、主從複製,還必須手動配置開啟主從複製模式

MySQL資料的主從複製、半同步複製和主主複製詳解

MySQL主從複製實現讀寫分離

http://blog.csdn.net/king_kgh/article/details/74904954

啟動 start slave

關閉 stop slave

重置 reset slave