配置Mysql主從複製

實驗環境:

master 操作系統:redhat 5.8 64位

IP:10.15.63.86

mysql版本:5.0.77

 

slave 操作系統:redhat 5.8 64位

IP:10.15.63.115

mysql版本:5.0.77

 

目錄

一、介紹mysql主從複製好處

二、介紹mysql主從複製原理

三、配置主服務器

四、配置從服務器

五、測試主從服務效果

六、模擬主服務數據丟,利用二進制日誌進行恢復

 

 

 


一、介紹mysql主從複製好處

1、從服務器利用主服務器的二進制日誌,進行備份

2、可以利用mysql主從複製,實現mysql讀寫分離

 


二、介紹mysql主從複製原理

mysql主從複製

  整體上來說,複製有3個步驟:   

       (1)    master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);

       (2)    slave將master的binary log events拷貝到它的中繼日誌(relay log);

       (3)    slave重做中繼日誌中的事件,將改變反映它自己的數據。

拓撲圖:

 

該過程的第一部分就是master記錄二進制日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。

下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。

SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。

此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。複製過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。

mysql主從複製是異步的:
異步:完成本地寫的操作,並寫入二進制,不考慮同步的情況
同步:考慮從服務器的情況,等到從服務響應以後,才執行操

三、配置主服務器 

說明:爲了方便採用yum安裝,這裏是配置本地iso作爲yum

  1. 1、安裝mysql  
  2. yum -y install mysql*  
  3.  
  4. 2、複製主配置文件  
  5. cp /usr/share/mysql/my-huge.cnf /etc/my.cnf  
  6.  
  7. 3、修改配置文件/etc/my.cnf  
  8. server-id       = 1  
  9. log-bin=mysql-bin  
  10.  
  11. 4、啓動mysql服務並設置root密碼 
  12. service mysqld start 
  13. mysqladmin -uroot password linuxsed 
  14.  
  15. 5、進入mysql添加用戶 
  16. mysql -uroot -plinuxsed 
  17. mysql> grant replication slave,replication client on *.* to repluser@'10.15.63.115' identified by '123456'; 
  18. Query OK, 0 rows affected (0.02 sec) 
  19. mysql> flush privileges; 
  20. Query OK, 0 rows affected (0.00 sec) 
  21.  
  22. 6、查看主服務器的二進制日誌當前位置 
  23. mysql> show master status; 
  24. +------------------+----------+--------------+------------------+ 
  25. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
  26. +------------------+----------+--------------+------------------+ 
  27. | mysql-bin.000003 |      469 |              |                  |  
  28. +------------------+----------+--------------+------------------+ 
  29. 1 row in set (0.00 sec) 

 


 四、配置從服務器

  1. 1、安裝mysql   
  2. yum -y install mysql*   
  3.   
  4. 2、複製主配置文件   
  5. cp /usr/share/mysql/my-huge.cnf /etc/my.cnf   
  6.   
  7. 3、修改配置文件/etc/my.cnf   
  8. server-id       = 2   #修改ID和主的不一樣 
  9. read_only = 1         #禁止從服務器寫入   
  10. skip-slave-start = 1  #讓從服務器的mysql服務在啓動時候不要自動啓動從服務線程   
  11. relay-log = mysql-relay #開啓中繼日誌 
  12.  
  13. 4、啓動mysql服務並設置root密碼  
  14. service mysqld start  
  15. mysqladmin -uroot password linuxsed  
  16.  
  17. 5、進入mysql設置從服務器同步的相關信息 
  18. mysql> change master to master_host='10.15.63.86'
  19.     -> master_user='repluser'
  20.     -> master_password='123456'
  21.     -> master_log_file='mysql-bin.000003'
  22.     -> master_log_pos=469
  23. Query OK, 0 rows affected (0.02 sec) 
  24.  
  25. mysql> flush privileges; 
  26. Query OK, 0 rows affected (0.00 sec) 
  27.  
  28. 6、啓動從服務器的線程 
  29. mysql> start slave; 
  30. Query OK, 0 rows affected (0.00 sec) 
  31.  
  32. 7、查看剛纔從服務器同步的狀態 
  33. mysql> show slave status\G; 
  34. *************************** 1. row *************************** 
  35.              Slave_IO_State: Waiting for master to send event 
  36.                 Master_Host: 10.15.63.86 
  37.                 Master_User: repluser 
  38.                 Master_Port: 3306 
  39.               Connect_Retry: 60 
  40.             Master_Log_File: mysql-bin.000003 
  41.         Read_Master_Log_Pos: 469 
  42.              Relay_Log_File: mysql-relay.000003 
  43.               Relay_Log_Pos: 235 
  44.       Relay_Master_Log_File: mysql-bin.000003 
  45.            Slave_IO_Running: Yes 
  46.           Slave_SQL_Running: Ye

 


五、測試主從服務效果

  1. 1、在主服務器上建立數據庫,建立表並插入字段   
  2. mysql> create database linuxawk;   
  3. Query OK, 1 row affected (0.04 sec)   
  4.    
  5. mysql> use linuxawk;   
  6. Database changed   
  7.    
  8. mysql> create table linux(name varchar(10));    
  9. Query OK, 0 rows affected (0.05 sec)   
  10.    
  11. mysql> insert into linux values ('sed'),('awk');   
  12. Query OK, 2 rows affected (0.03 sec)   
  13. Records: 2  Duplicates: 0  Warnings: 0  
  14.   
  15. 2、在從服務器查看剛纔建立的數據庫,表和字段  
  16. mysql> show databases;  
  17. +--------------------+  
  18. | Database           |  
  19. +--------------------+  
  20. | information_schema |   
  21. | linuxawk           |   
  22. | mysql              |   
  23. | test               |   
  24. +--------------------+  
  25. 4 rows in set (0.00 sec)  
  26.   
  27. mysql> use linuxawk;  
  28. Database changed  
  29.  
  30. mysql> select *from linux;  
  31. +------+  
  32. | name |  
  33. +------+  
  34. | sed  |   
  35. | awk  |   
  36. +------+  
  37. 2 rows in set (0.00 sec) 

注意:mysql服務每啓動一次二進制日誌就會滾動一次,如果從服務的I/O線程是NO,可以在從服務器上進行stop slave,然後start slave,才同步。

 


六、模擬主服務數據丟,利用二進制日誌進行恢復

mysql二進制日誌可以利用mysqlbinlog命令進行查看

簡單例子:

mysqlbinlog mysql-bin.000007

--start-postion= 開始位置

--stop-postion= 結束位置

mysqlbinlog --start-position='107' --stop-position='1447' mysql-bin.000007

 

mysqlbinlog mysql-bin.000007

                --start-datetime= 開始時間

--stop--datetime= 結束時

mysqlbinlog --start-datetime='2012-07-19 20:40:53' --stop-datetime='2012-07-19 20:54:06' mysql-bin.000009

 

下面以主服務器二進制爲例子

  1. 1、刪除linuxawk數據庫 
  2. mysql> drop database linuxawk; 
  3. Query OK, 1 row affected (0.05 sec) 
  4.  
  5. 2、查看二進制日誌 
  6. mysql> show master status; 
  7. +------------------+----------+--------------+------------------+ 
  8. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
  9. +------------------+----------+--------------+------------------+ 
  10. | mysql-bin.000003 |      771 |              |                  |  
  11. +------------------+----------+--------------+------------------+ 
  12.  
  13. 3、進入二進制日誌存放路徑 yum默認/var/lib/mysql 
  14. cd /var/lib/mysql 
  15. mysqlbinlog mysql-bin.000003 
  16. 然後指定具體開始和結束位置進行查看 
  17. mysqlbinlog --start-position='470' --stop-position='771' mysql-bin.000003 
  18.  
  19. 4、利用二進制日誌進行恢復 
  20. mysqlbinlog --start-position='470' --stop-position='771' mysql-bin.000003 |mysql -uroot -plinuxsed 
  21. 注意:請不要把刪除的位置也指定了 
  22.  
  23. 5、進入數據庫查看是否有數據 
  24. mysql> show databases; 
  25. +--------------------+ 
  26. | Database           | 
  27. +--------------------+ 
  28. | information_schema |  
  29. | linuxawk           |  
  30. | mysql              |  
  31. | test               |  
  32. +--------------------+ 
  33. 4 rows in set (0.07 sec) 
  34.  
  35. mysql> use linuxawk; 
  36. Database changed 
  37. mysql> select *from linux; 
  38. +------+ 
  39. | name | 
  40. +------+ 
  41. | sed  |  
  42. | awk  |  
  43. +------+ 
  44. 2 rows in set (0.00 sec) 
  45. 查看此時已經有數據了 

 

補充:二進制日誌小知識點

1、開啓mysql二進制日誌

通過修改/etc/my.cnf修改以下兩行

log-bin=mysql-bin #定義二進制日誌名字

log-bin-index=log-bin.index #定義記錄所有二進制的名字

然後重啓mysqld服務

 

2、二進制日誌作用:

1、記錄了數據庫結構或者數據發生改變的日誌,但是select不會被記錄。

2、做即時點恢復,意思是指定可以利用二進制日誌進行數據的恢復,還原。

 

3、二進制日誌記錄的操作

記錄的操作如:

DML insert,replace,delete,update

DDL create

 

4、用命令查看二進制日誌是否開啓

mysql> show global variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    | 

+---------------+-------+

1 row in set (0.00 sec)

 

5、用命令查看正在打開二進制日誌

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000003 |     1551 |              |                  | 

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

 

6、用命令查看所有二進制日誌文件和大小

mysql> show binary logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |     15168 | 

| mysql-bin.000002 |    637054 | 

| mysql-bin.000003 |      1551 | 

+------------------+-----------+

3 rows in set (0.00 sec)

 

7、滾動二進制日誌的命令

mysql> flush logs;

Query OK, 0 rows affected (0.05 sec)

 

8、移除二進制日誌的命令

purge binary logs to 'log_file';

例子:

mysql> purge binary logs to 'mysql-bin.000004';

Query OK, 0 rows affected (0.04 sec)

更多的知識點請參考:http://dev.mysql.com/doc/refman/5.1/zh/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章