MySQL主從(介紹,配置主機,配置從機,測試主從同步)

1、介紹及準備工做java

  • 1.介紹mysql

  • MySQL主從配置又叫Replication或者AB複製,簡單講就是A和B兩臺機器作主從後,在A上寫數據,另外一臺B也會跟着寫數據,兩臺數據實時同步。linux

  • MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。web

  • 主從過程大體有3個步驟sql

  1. 主將更改操做記錄到Binlog裏數據庫

  2. 從將主的Binlog事件(sql語句)同步到從本機上並記錄在relaylog裏服務器

  3. 從根據relaylog裏面的sql語句按順序執行ide

  • 主上有一個logdump線程,用來和從的i/o線程傳遞binlog測試

  • 從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句執行一遍。spa


適用場景:

(1)作數據庫數據備份,僅僅是備份,當主機宕機時,立刻從機能夠代替主機。

(2)仍是作數據備份,可是和主機同樣,會向web服務器提供服務。可是不能往從機上寫數據。



  • 主從延遲:「步驟2」開始,到「步驟7」執行結束。

  • 步驟 2:存儲引擎處理,時間極短

  • 步驟 3:文件更新通知,磁盤讀取延遲

  • 步驟 4:Bin Log 文件更新的傳輸延遲,單線程

  • 步驟 5:磁盤寫入延遲

  • 步驟 6:文件更新通知,磁盤讀取延遲

  • 步驟 7:SQL 執行時長


Master上 1 個IO線程,負責向Slave傳輸 binary logbinlog

Slave上 2 個線程:IO 線程執行SQL的線程,其中:

IO線程:將獲取的日誌信息,追加到relay log上;

執行SQL的線程:檢測到relay log中內容有更新,則在Slave上執行sql;

2.準備工做

準備兩臺機器,上面都要安裝MySQL。

MySQL的安裝這裏就不說了,前面日誌會有。

這裏常常會出現一個權限問題。由於/data/mysql下的文件全部者和所屬組都變成了root。用chmod改爲MySQL便可。


2、配置MySQL的主機

1.安裝MySQL


2.修改/etc/my.cnf文件,添加如下2段

 server-id=100

 log_bin=litongyao1              (生成binlog,litongyao1是他的文件開頭) 

從新啓動mysql

[root@zhuji ~]# /etc/init.d/mysqld restart 

接下來咱們查看/data/mysql下,

[root@zhuji ~]# ll /data/mysql/

總用量 110700

-rw-rw----. 1 mysql mysql       56 11月 30 14:48 auto.cnf

-rwxr-xr-x. 1 mysql mysql 12582912 12月 29 13:59 ibdata1

-rwxr-xr-x. 1 mysql mysql 50331648 12月 29 13:59 ib_logfile0

-rwxr-xr-x. 1 mysql mysql 50331648 11月 30 14:15 ib_logfile1

drwx------. 2 mysql mysql       62 12月 28 21:01 java_test

-rw-rw----. 1 mysql mysql      120 12月 29 13:59 litongyao1.000001

-rw-rw----. 1 mysql mysql      143 12月 29 13:59 litongyao1.000002

-rw-rw----. 1 mysql mysql      120 12月 29 13:59 litongyao1.000003

-rw-rw----. 1 mysql mysql       60 12月 29 13:59 litongyao1.index

drwxr-xr-x. 2 mysql mysql     4096 12月 19 17:05 mysql

drwxr-xr-x. 2 mysql mysql     4096 11月 30 14:15 performance_schema

drwx------. 2 mysql mysql       50 12月 19 17:50 rxr

drwxr-xr-x. 2 mysql mysql        6 11月 30 14:14 test

-rw-rw----. 1 mysql mysql    73149 12月 29 13:59 zhuji.err

-rw-rw----. 1 mysql mysql        5 12月 29 13:59 zhuji.pid

drwx------. 2 mysql mysql     4096 12月 28 20:17 zrlog


3.把mysql庫備份並恢復成litongyao庫,做爲測試數據

[root@zhuji ~]# mysqldump -uroot -paminglinux rxr > /tmp/rxr.sql

[root@zhuji ~]# ll /tmp/rxr.sql 

-rw-r--r--. 1 root root 1780 12月 29 14:27 /tmp/rxr.sql

[root@zhuji ~]# mysql -uroot -paminglinux -e "create database litongyao"

[root@zhuji ~]# mysql -uroot -paminglinux litongyao < /tmp/rxr.sql 


4.建立MySQL用戶用做同步數據

mysql> grant replication slave on *.* to 'repl'@'192.168.52.100' identified by 'rxr123456';

Query OK, 0 rows affected (0.00 sec)


mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)


mysql> show master status;                   (這裏要記住binlog的名字file,還有它的位置Position)         

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

| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| litongyao1.000003 |     1029 |        |            |             |

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

1 row in set (0.00 sec)


[root@zhuji ~]# mysqldump -uroot -paminglinux zrlog > /tmp/zrlog.sql

Warning: Using a password on the command line interface can be insecure.


3、配置從機

  1. 安裝MySQL

  2. 查看my.cnf,配置server-id,要求和主不同。

server-id=101

3.從新啓動MySQL服務

[root@congji ~]# /etc/init.d/mysqld restart

Shutting down MySQL.. SUCCESS! 

Starting MySQL.. SUCCESS!

4.把主上的litongyao庫同步到從上

(1)把備份的庫文件用scp到從機上

[root@congji ~]# scp 192.168.52.101:/tmp/*.sql /tmp/

root@192.168.52.101's password: 

rxr.sql          100% 1780     1.7KB/s   00:00    

zrlog.sql         100% 9886     9.7KB/s   00:00    

(2)建立相應的數據庫

mysql> create database rxr;

Query OK, 1 row affected (0.00 sec)

mysql> create database zrlog;

Query OK, 1 row affected (0.00 sec)

(3)把備份的庫恢復到從機上,保證主從2邊數據庫一致

[root@congji bin]# mysql -uroot zrlog < /tmp/zrlog.sql 

[root@congji bin]# mysql -uroot rxr < /tmp/rxr.sql

(4)中止主從同步

mysql> stop slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

(5)接下來就是最重要的一步操做,在從機上配置主機的ip,用戶名,密碼,binlog的name以及pos。

mysql> change master to master_host='192.168.52.101', master_user='repl', master_password='rxr123456', master_log_file='litongyao1.000003', master_log_pos=1029;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

(6)開啓主從同步

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

(7)查看主從有沒有配置成功    (查看是否有兩個yes)

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.52.101

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: litongyao1.000003

          Read_Master_Log_Pos: 1029

               Relay_Log_File: congji-relay-bin.000002

                Relay_Log_Pos: 284

        Relay_Master_Log_File: litongyao1.000003

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes


(8)解鎖主機上的表,讓它恢復寫的操做

(主機:192.168.52.101)

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)


4、測試主從同步

幾個配置參數:在/etc/my.cnf裏

主服務器上:

 binlog-do-db=                  //僅同步指定的庫

 binlog-ignore-db=               //忽略指定庫

從服務器上:

(推薦應用等級:中)

 replicate_do_db=               //僅同步指定的庫 

 replicate_ignore_db=           //忽略指定庫

(推薦應用等級:低)萬一不通的庫裏有同名的表

 replicate_do_table=           //僅同步指定的表

 replicate_ignore_table=        //忽略指定表

(推薦應用等級:高)

 replicate_wild_do_table=   //如aming.%, 支持通配符%      //僅同步指定庫裏的指定表

 replicate_wild_ignore_table=                      //不一樣步指定庫裏的指定表



測試主從:

主機:

mysql> use rxr;

Database changed

mysql> show tables;

Empty set (0.00 sec)

從機:

mysql> use rxr;

Database changed

mysql> show tables;

Empty set (0.00 sec)


增長一個表:

主機:

mysql> create table lty(`id`int(4),`name`char(40));

Query OK, 0 rows affected (0.06 sec)


mysql> show tables;

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

| Tables_in_rxr |

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

| lty       |

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

1 row in set (0.00 sec)


從機:

cremysql> show tables;

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

| Tables_in_rxr |

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

| lty           |

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

1 row in set (0.00 sec)

增長表實現主從同步。


刪除表:

主機:

mysql> drop table lty;

Query OK, 0 rows affected (0.26 sec)


mysql> show tables;

Empty set (0.00 sec)


從機:

mysql> show tables;

Empty set (0.00 sec)


刪除表也實現了主從同步。



3、若是誤操做,致使主從同步異常,怎麼辦?

最重要的一步就是立刻關閉主從同步:

stop slave;

接着立刻作一步操做:

change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,

接着打開主從同步:

start slave;

而後查看是否恢復正常。

相關文章
相關標籤/搜索