本文講解如何快速打包和安裝MySQL, MySQL AB複製,MySQL AB雙向複製,MySQL多級主從複製,解決AB雙向複製主鍵衝突。mysql
首先咱們先介紹什麼是MySQL AB複製。linux
AB複製又稱主從複製,實現的是數據同步。若是要作MySQL AB複製,數據庫版本儘可能保持一致。若是版本不一致,從服務器版本高於主服務器,可是版本不一致不能作雙向複製。MySQL AB複製有什麼好處呢?有兩點,第一是解決宕機帶來的數據不一致,由於MySQL AB複製能夠實時備份數據;第二點是減輕數據庫服務器壓力,這點很容易想到,多臺服務器的性能通常比單臺要好。可是MySQL AB複製不適用於大數據量,若是是大數據環境,推薦使用集羣。sql
而後咱們來看看MySQL複製的 3 個主要步驟:數據庫
1)主服務器把數據更改記錄到二進制日誌中,這個操做叫作二進制日誌事件;vim
2)從服務器把主服務器的二進制日誌事件拷貝到本身的中繼日誌(relay log)中;bash
3)從服務器執行中繼日誌中的事件,把更改應用到本身的數據上。服務器
在正式介紹MySQL AB複製以前,介紹怎樣打包MySQL和快速安裝MySQL。網絡
第一步,製做文件session
[root@serv08 ~]# find /usr/local/mysql/ /etc/my.cnf /etc/init.d/mysqld > mysql
第二步,打包架構
[root@serv08 ~]# tar -cPvzf mysql-5.5.29-linux2.6-x86_64.tar.gz -T mysql [root@serv08 ~]# ll -h total 202M -rw-r--r--. 1 root root 411K Oct 5 19:19 mysql -rw-r--r--. 1 root root 202M Oct 5 19:21 mysql-5.5.29-linux2.6-x86_64.tar.gz
第三步,拷貝文件到實體機
[root@serv08 mysql]# scp mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.1:/home/Wentasy/software/
第四步,拷貝文件到serv01
[root@serv01 ~]# yum install /usr/bin/scp -y [root@larrywen 1005]# scp /home/Wentasy/software/mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.11:/opt root@192.168.1.11's password: mysql-5.5.29-linux2.6-x86_64.tar.gz 100% 201MB 33.5MB/s 00:06
第五步,解壓
[root@serv01 opt]# tar -xPvf mysql-5.5.29-linux2.6-x86_64.tar.gz
第六步,建立組和用戶,注意編號和安裝好數據庫的機器上的用戶一致
[root@serv01 opt]# groupadd -g 500 mysql [root@serv01 opt]# useradd -u 500 -g 500 -r -M -s /sbin/nologin mysql [root@serv01 opt]# id mysql uid=500(mysql) gid=500(mysql) groups=500(mysql)
第七步,改變MySQL安裝目錄的擁有者和所屬組
[root@serv01 opt]# chown mysql.mysql /usr/local/mysql/ -R
第八步,啓動MySQL,作測試
[root@serv01 opt]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS! [root@serv01 opt]# mysql -bash: mysql: command not found [root@serv01 opt]# vim ~/.bash_profile [root@serv01 opt]# . !$ . ~/.bash_profile [root@serv01 opt]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.29-log Source distribution Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
好了,相信讀者已經學會怎樣打包MySQL和快速安裝MySQL,接下來正式進入主題,咱們先來看看一主多從架構的拓撲圖:
圖一 一主多從架構
該圖展現了一個 master 複製多個 slave 的架構,多個 slave 和單個 slave 的實施並無實質性的區別,在 master 端並不在意有多少個 slave 鏈接本身,只要有 slave 的 IO 線程經過了鏈接認證,向他請求指定位置以後的 binary log 信息,他就會按照該 IO 線程的要球,讀取本身的binary log 信息,返回給 slave的 IO 線程。
既然對拓撲圖和原理有所瞭解,咱們作一個實驗,介紹如何使用MySQL AB複製:
實驗環境介紹
主機 IP地址 主機名 備註
serv01: 192.168.1.11 serv01.host.com master
serv08: 192.168.1.18 serv08.host.com slave01
操做系統版本:rhel server 6.1
所須要的軟件包:mysql-5.5.29-linux2.6-x86_64.tar.gz
第一步,主服務器建立用戶並清空日誌
mysql> show privileges; mysql> grant replication client, replication slave on *.* to 'larry'@'192.168.1.%' identified by 'larry'; Query OK, 0 rows affected (0.00 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 27320 | | mysql-bin.000002 | 1035309 | | mysql-bin.000003 | 126 | | mysql-bin.000004 | 279 | +------------------+-----------+ 4 rows in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.01 sec) mysql> reset master; Query OK, 0 rows affected (0.02 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 107 | +------------------+-----------+ 1 row in set (0.00 sec)
第二步,修改從服務器的server-id
[root@serv08 ~]# cat /etc/my.cnf | grep server-id server-id = 1 #server-id = 2 [root@serv08 ~]# vim /etc/my.cnf [root@serv08 ~]# cat /etc/my.cnf | grep server-id server-id = 2 #server-id = 2 [root@serv08 ~]# /etc/init.d/mysqld restart Shutting down MySQL... SUCCESS! Starting MySQL.. SUCCESS! #能夠查看從服務器中的數據文件 [root@serv08 ~]# cd /usr/local/mysql/data/ [root@serv08 data]# ll total 29752 -rw-rw----. 1 mysql mysql 18874368 Oct 5 19:45 ibdata1 -rw-rw----. 1 mysql mysql 5242880 Oct 5 19:45 ib_logfile0 -rw-rw----. 1 mysql mysql 5242880 Oct 5 18:16 ib_logfile1 drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:15 mysql -rw-rw----. 1 mysql mysql 27320 Oct 5 18:15 mysql-bin.000001 -rw-rw----. 1 mysql mysql 1035309 Oct 5 18:15 mysql-bin.000002 -rw-rw----. 1 mysql mysql 126 Oct 5 18:16 mysql-bin.000003 -rw-rw----. 1 mysql mysql 126 Oct 5 19:45 mysql-bin.000004 -rw-rw----. 1 mysql mysql 107 Oct 5 19:45 mysql-bin.000005 -rw-rw----. 1 mysql mysql 95 Oct 5 19:45 mysql-bin.index drwx------. 2 mysql mysql 4096 Oct 5 18:15 performance_schema -rw-r-----. 1 mysql root 4775 Oct 5 19:45 serv08.host.com.err -rw-rw----. 1 mysql mysql 5 Oct 5 19:45 serv08.host.com.pid drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:12 test
第三步,從服務器清空日誌
mysql> show binary logs; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 1 Current database: *** NONE *** +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 27320 | | mysql-bin.000002 | 1035309 | | mysql-bin.000003 | 126 | | mysql-bin.000004 | 126 | | mysql-bin.000005 | 107 | +------------------+-----------+ 5 rows in set (0.00 sec) mysql> reset master; Query OK, 0 rows affected (0.02 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 107 | +------------------+-----------+ 1 row in set (0.00 sec) mysql> show slave status; Empty set (0.00 sec)
第四步,從服務器經過change master to命令修改設置
mysql> change master to -> master_host='192.168.1.11', -> master_user='larry', -> master_password='larry', -> master_port=3306, -> master_log_file='mysql-bin.000001', -> master_log_pos=107; Query OK, 0 rows affected (0.01 sec)
第五步,開啓slave。
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.11 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: serv08-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 1 row in set (0.00 sec) ERROR: No query specified mysql> start slave; Query OK, 0 rows affected (0.01 sec)
第六步,從服務器查看是否和主服務器通訊成功。若是出現 Slave_IO_Running和Slave_SQL_Running都是yes,則證實配置成功
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.11 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: serv08-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 410 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) ERROR: No query specified
第七步,從服務器查看數據文件的更改
[root@serv08 data]# ll total 28724 -rw-rw----. 1 mysql mysql 18874368 Oct 5 19:45 ibdata1 -rw-rw----. 1 mysql mysql 5242880 Oct 5 19:45 ib_logfile0 -rw-rw----. 1 mysql mysql 5242880 Oct 5 18:16 ib_logfile1 -rw-rw----. 1 mysql mysql 78 Oct 5 19:49 master.info drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:15 mysql -rw-rw----. 1 mysql mysql 107 Oct 5 19:45 mysql-bin.000001 -rw-rw----. 1 mysql mysql 19 Oct 5 19:45 mysql-bin.index drwx------. 2 mysql mysql 4096 Oct 5 18:15 performance_schema -rw-rw----. 1 mysql mysql 51 Oct 5 19:49 relay-log.info -rw-r-----. 1 mysql root 5589 Oct 5 19:49 serv08.host.com.err -rw-rw----. 1 mysql mysql 5 Oct 5 19:45 serv08.host.com.pid -rw-rw----. 1 mysql mysql 157 Oct 5 19:49 serv08-relay-bin.000001 -rw-rw----. 1 mysql mysql 253 Oct 5 19:49 serv08-relay-bin.000002 -rw-rw----. 1 mysql mysql 52 Oct 5 19:49 serv08-relay-bin.index drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:12 test [root@serv08 data]# cat relay-log.info ./serv08-relay-bin.000002 253 mysql-bin.000001 107 [root@serv08 data]# cat master.info 18 mysql-bin.000001 107 192.168.1.11 larry larry 3306
第八步,測試
--serv08查看數據庫 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.02 sec) --serv01建立數據庫 mysql> create database larrydb; Query OK, 1 row affected (0.00 sec) --serv01查看數據庫 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | larrydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec) --serv08查看數據庫,發現已經同步 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | larrydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) --serv01建立表 插入數據 mysql> use larrydb; Database changed mysql> create table test(id int(11)); Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(1); Query OK, 1 row affected (0.00 sec) --serv08查看數據是否同步成功,發現數據已經同步 mysql> use larrydb; Database changed mysql> show tables; +-------------------+ | Tables_in_larrydb | +-------------------+ | test | +-------------------+ 1 row in set (0.00 sec) mysql> select * from test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
第九步,查看進程狀態
--serv01查看進程狀態 mysql> show processlist; +----+-------+--------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+--------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+ | 1 | root | localhost | larrydb | Query | 0 | NULL | show processlist | | 2 | larry | 192.168.1.18:41393 | NULL | Binlog Dump | 854 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | +----+-------+--------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec) --serv08查看進程狀態 mysql> show processlist; +----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+ | 1 | root | localhost | larrydb | Query | 0 | NULL | show processlist | | 2 | system user | | NULL | Connect | 880 | Waiting for master to send event | NULL | | 3 | system user | | NULL | Connect | 65 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | +----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec)
好了,MySQL AB單向複製介紹完畢。接下來想一想,會有這樣的應用場景。好比Master和Slave之間都要進行數據同步,那麼單向複製是沒法完成的,由於一個是Master,一個是Slave,只能單向操做,這就像網絡裏的半雙工同樣。既然一方能夠向另外一方同步數據,那麼兩方都作成Master 不就能夠實現互相同步數據了。這就是接下來要介紹的MySQL AB雙向複製。一樣咱們來看看MySQL AB雙向複製的拓撲圖。
圖二 MySQL AB雙向複製
既然對拓撲圖和原理有所瞭解,咱們作一個實驗,介紹如何使用MySQL AB雙向複製,注意該實驗是在MySQL單級複製的基礎上作的。
實驗環境介紹
主機 IP地址 主機名 備註
serv01: 192.168.1.11 serv01.host.com master
serv08: 192.168.1.18 serv08.host.com slave01
操做系統版本:rhel server 6.1
所須要的軟件包:mysql-5.5.29-linux2.6-x86_64.tar.gz
第一步,serv08建立受權用戶
mysql> grant replication client, replication slave on *.* to 'larry'@'192.168.1.%' identified by 'larry'; Query OK, 0 rows affected (0.01 sec)
第二步,serv08清空日誌
mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 286 | +------------------+-----------+ 1 row in set (0.00 sec) mysql> reset master; Query OK, 0 rows affected (0.00 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 107 | +------------------+-----------+ 1 row in set (0.00 sec)
第三步,serv01使用change master to命令修改從服務器設置
mysql> show slave status; Empty set (0.00 sec) mysql> change master to -> master_host='192.168.1.18', -> master_user='larry', -> master_password='larry', -> master_port=3306, -> master_log_file='mysql-bin.000001', -> master_log_pos=107; Query OK, 0 rows affected (0.01 sec)
第四步,serv01開啓slave
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.18 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: serv01-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 410 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified
第五步,測試
--serv01查看數據 mysql> use larrydb; Database changed mysql> select * from test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) --serv08插入數據 mysql> use larrydb; Database changed mysql> select * from test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> insert into test values(2); Query OK, 1 row affected (0.00 sec) --serv01查看數據,數據更新 mysql> select * from test; +------+ | id | +------+ | 1 | | 2 | +------+ 2 rows in set (0.00 sec) --serv01插入數據 mysql> insert into test values(3); Query OK, 1 row affected (0.01 sec) --serv01查詢數據 mysql> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec) --serv08查詢數據,數據已更新 mysql> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)
好了,MySQL AB雙向複製介紹完畢,咱們又想了,不論是MySQL AB單向複製,仍是MySQL 雙向複製,都是雙方的關係。MySQL AB單向複製能夠是一對一,也就是一個Master對應一個Slave,或者一對多,也就是一個Master對應多個Slave;MySQL雙向複製是一對一的關係。咱們可不能夠這樣,實現多級關係,一個Master,接下來Slave,Slave下面還有Slave。這樣作有什麼好處呢?這樣能夠緩解數據庫壓力。這就是接下來要介紹的MySQL多級主從複製。多級也就是A---->B---->C,A做爲主服務器,B是從服務器,B跟A創建主從關係;並且B是主服務器,C做爲從服務器,B跟C創建主從關係。這樣:A是主服務器,B既是主服務器,又是從服務器,C是從服務器。一樣,咱們來看看MySQL 多級主從複製的拓撲圖:
圖三 MySQL 多級主從複製
該拓撲圖實現 mysql 的 A 到B 的複製,再從 B 到 C 的複製。
既然對拓撲圖和原理有所瞭解,咱們作一個實驗,介紹如何使用MySQL AB雙向複製:
實驗環境介紹
主機 IP地址 主機名 備註
serv01: 192.168.1.11 serv01.host.com master
serv08: 192.168.1.18 serv08.host.com slave01
serv09: 192.168.1.19 serv09.host.com slave02
操做系統版本:rhel server 6.1
所須要的軟件包:mysql-5.5.29-linux2.6-x86_64.tar.gz
第一步,斷開雙向關係。A只做爲主服務器。
--中止slave mysql> stop slave; Query OK, 0 rows affected (0.00 sec) --查看slave狀態發現仍然有相關信息,咱們要完全刪除,只須要把數據文件中相關文件刪除便可。 mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.18 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 587 Relay_Log_File: serv01-relay-bin.000006 Relay_Log_Pos: 733 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 587 Relay_Log_Space: 1036 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified --進入data目錄,刪除如下文件:master.info relay-log.info serv01-relay-bin.* [root@serv01 ~]# cd /usr/local/mysql/data [root@serv01 data]# ll total 28736 -rw-rw----. 1 mysql mysql 18874368 Oct 5 22:38 ibdata1 -rw-rw----. 1 mysql mysql 5242880 Oct 5 22:38 ib_logfile0 -rw-rw----. 1 mysql mysql 5242880 Oct 5 18:16 ib_logfile1 drwx------. 2 mysql mysql 4096 Oct 5 22:36 larrydb -rw-rw----. 1 mysql mysql 79 Oct 5 23:24 master.info drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:15 mysql -rw-rw----. 1 mysql mysql 690 Oct 5 22:34 mysql-bin.000001 -rw-rw----. 1 mysql mysql 970 Oct 5 22:38 mysql-bin.000002 -rw-rw----. 1 mysql mysql 38 Oct 5 22:34 mysql-bin.index drwx------. 2 mysql mysql 4096 Oct 5 18:15 performance_schema -rw-rw----. 1 mysql mysql 53 Oct 5 23:24 relay-log.info -rw-r-----. 1 mysql root 5309 Oct 5 23:24 serv01.host.com.err -rw-rw----. 1 mysql mysql 5 Oct 5 22:34 serv01.host.com.pid -rw-rw----. 1 mysql mysql 303 Oct 5 22:35 serv01-relay-bin.000005 -rw-rw----. 1 mysql mysql 733 Oct 5 22:37 serv01-relay-bin.000006 -rw-rw----. 1 mysql mysql 52 Oct 5 22:35 serv01-relay-bin.index -rw-r-----. 1 mysql mysql 2209 Oct 5 18:16 serv08.host.com.err drwxr-xr-x. 2 mysql mysql 4096 Oct 5 18:12 test [root@serv01 data]# rm -rf master.info relay-log.info serv01-relay-bin.*
第二步,serv01重啓服務,再次查看slave信息,發現已經不存在
[root@serv01 data]# /etc/init.d/mysqld restart Shutting down MySQL.... SUCCESS! Starting MySQL.. SUCCESS! [root@serv01 opt]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.29-log Source distribution mysql> show slave status \G; Empty set (0.00 sec) ERROR: No query specified
第三步,serv08查看slave狀態
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.11 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 107 Relay_Log_File: serv08-relay-bin.000007 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 556 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) ERROR: No query specified --若是查看slave狀態出錯,咱們重啓服務 [root@serv08 ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL.. SUCCESS!
第四步,serv09搭建相同版本的MySQL,修改server-id,啓動服務
[root@serv09 ~]# vim /etc/my.cnf [root@serv09 ~]# cat /etc/my.cnf | grep server-id server-id = 3 [root@serv09 ~]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS!
第五步,serv01插入數據
mysql> use larrydb; Database changed mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | +----+---------+ 5 rows in set (0.00 sec) mysql> insert into t2(name) values('larry07'); Query OK, 1 row affected (0.01 sec)
第六步,serv08查看serv01插入的數據是否記錄到日誌文件。能夠發現,和serv01創建關係的延時日誌文件中有相關記錄,而主日誌文件mysql-bin.000003中沒有相關記錄
[root@serv08 data]# mysqlbinlog serv08-relay-bin.000009 | grep insert -i --color /*!40019 SET @@session.max_insert_delayed_threads=0*/; SET INSERT_ID=9/*!*/; insert into t2(name) values('larry07') [root@serv08 data]# mysqlbinlog mysql-bin.000003 | grep larry07
第七步,咱們要把serv08的數據同步到serv09,由於serv08中的mysql-bin.000003文件沒有相關記錄,因此不能經過日誌文件同步,咱們只有先serv08導出數據,而後serv09導入數據,再把log_slave_updates打開
--導出數據 [root@serv08 data]# mysqldump --help --verbose | grep database [root@serv08 data]# mysqldump --databases larrydb > larrydb.sql --拷貝數據文件 [root@serv08 data]# scp larrydb.sql 192.168.1.19:/opt root@192.168.1.19's password: larrydb.sql 100% 2612 2.6KB/s 00:00 --serv09導入數據 mysql> source /opt/larrydb.sql; Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Database changed Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> use larrydb; Database changed mysql> show tables; +-------------------+ | Tables_in_larrydb | +-------------------+ | t2 | | test | +-------------------+ 2 rows in set (0.01 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | +----+---------+ 6 rows in set (0.01 sec) --serv08修改配置文件,打開log_slave_updates,重啓MySQL服務 mysql> show variables like '%update%'; +-----------------------------------------+-------+ | Variable_name | Value | +-----------------------------------------+-------+ | binlog_direct_non_transactional_updates | OFF | | log_slave_updates | OFF | | low_priority_updates | OFF | | sql_low_priority_updates | OFF | | sql_safe_updates | OFF | +-----------------------------------------+-------+ 5 rows in set (0.00 sec) [root@serv08 data]# vim /etc/my.cnf [root@serv08 data]# cat /etc/my.cnf | grep log_slave_updates log_slave_updates=1 [root@serv08 data]# /etc/init.d/mysqld restart Shutting down MySQL.... SUCCESS! Starting MySQL.. SUCCESS! --serv08 mysql> show variables like "%update%"; +-----------------------------------------+-------+ | Variable_name | Value | +-----------------------------------------+-------+ | binlog_direct_non_transactional_updates | OFF | | log_slave_updates | ON | | low_priority_updates | OFF | | sql_low_priority_updates | OFF | | sql_safe_updates | OFF | +-----------------------------------------+-------+ 5 rows in set (0.00 sec)
第八步,serv01插入測試數據,咱們看到打開這個參數後mysql-bin.000004和serv08-relay-bin.000011都有相關的插入數據的記錄
mysql> insert into t2(name) values('larry08'); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | | 11 | larry08 | +----+---------+ 7 rows in set (0.00 sec) [root@serv08 data]# mysqlbinlog mysql-bin.000004 | grep larry use `larrydb`/*!*/; insert into t2(name) values('larry08') [root@serv08 data]# mysqlbinlog serv08-relay-bin.000011 | grep larry use `larrydb`/*!*/; insert into t2(name) values('larry08')
第九步,serv08建立受權用戶
mysql> select user,password,host from mysql.user where user='larry'; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 3 Current database: larrydb +-------+-------------------------------------------+-------------+ | user | password | host | +-------+-------------------------------------------+-------------+ | larry | *0CDC8D34246E22649D647DB04E7CCCACAB4368B6 | 192.168.1.% | +-------+-------------------------------------------+-------------+ 1 row in set (0.00 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 1046 | | mysql-bin.000002 | 606 | | mysql-bin.000003 | 126 | | mysql-bin.000004 | 335 | +------------------+-----------+ 4 rows in set (0.00 sec)
第十步,serv09經過change master to修改slave配置,而後啓動slave,查看slave狀態,查看數據,發現已經從serv08更新過來
mysql> change master to -> master_host='192.168.1.18', -> master_user='larry', -> master_password='larry', -> master_port=3306, -> master_log_file='mysql-bin.000003', -> master_log_pos=126; Query OK, 0 rows affected (0.03 sec) mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.18 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 126 Relay_Log_File: serv09-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 126 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 1 row in set (0.00 sec) ERROR: No query specified mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.18 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 335 Relay_Log_File: serv09-relay-bin.000003 Relay_Log_Pos: 481 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 335 Relay_Log_Space: 784 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified mysql> select * from larrydb.t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | | 11 | larry08 | +----+---------+ 7 rows in set (0.00 sec)
第十一步,serv01插入數據,能夠看到serv08 serv09都已經同步過去了
--serv01 mysql> insert into t2(name) values('larry09'); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | | 11 | larry08 | | 13 | larry09 | +----+---------+ 8 rows in set (0.00 sec) --serv08 mysql> select * from larrydb.t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | | 11 | larry08 | | 13 | larry09 | +----+---------+ 8 rows in set (0.00 sec) --serv09 mysql> select * from larrydb.t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | | 9 | larry07 | | 11 | larry08 | | 13 | larry09 | +----+---------+ 8 rows in set (0.00 sec)
在進行MySQLAB雙向複製時,若是一張表的主鍵是自增的,會出現問題。主服務器和從服務器在插入數據時會發生主鍵衝突,好比A服務器插入一條數據,id爲5,B服務器同步過去,可是B服務器插入數據ID也多是5,就這會引發主鍵衝突,致使數據不能插入。所以,咱們須要解決這個問題。解決辦法是主鍵間隔設置,經過設置主鍵步長,好比A(13 5 7),B(2 4 6 8),有幾臺機器步長就爲幾。接下來的實驗是在MySQLAB雙向複製的基礎上作的。
第一步,serv08建立測試表,插入數據,查看數據
mysql> create table t2(id int auto_increment primary key,name varchar(30)); Query OK, 0 rows affected (0.00 sec) mysql> desc t2; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> insert into t2(name) values('larry01'); Query OK, 1 row affected (0.00 sec) mysql> insert into t2(name) values('larry02'); Query OK, 1 row affected (0.01 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 2 | larry02 | +----+---------+ 2 rows in set (0.00 sec)
第二步,serv01查看數據
mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 2 | larry02 | +----+---------+ 2 rows in set (0.00 sec) mysql> drop table t2; Query OK, 0 rows affected (0.01 sec)
第二步,serv01和serv08修改配置文件,並重啓服務
[root@serv01 opt]# vim /etc/my.cnf [root@serv01 opt]# cat /etc/my.cnf | grep auto_incre auto_increment_increment=2 auto_increment_offset=1 [root@serv01 opt]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL.. SUCCESS! [root@serv08 data]# vim /etc/my.cnf [root@serv08 data]# cat /etc/my.cnf | grep auto_incre auto_increment_increment=2 auto_increment_offset=2 [root@serv08 data]# /etc/init.d/mysqld restart Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS!
第三步,serv01再次模擬數據
mysql> use larrydb; Database changed mysql> show tables; +-------------------+ | Tables_in_larrydb | +-------------------+ | test | +-------------------+ 1 row in set (0.00 sec) mysql> create table t2(id int(11) primary key auto_increment, name varchar(30)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t2(name) values('larry01'); Query OK, 1 row affected (0.01 sec) mysql> insert into t2(name) values('larry02'); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | +----+---------+ 2 rows in set (0.00 sec) --serv08 mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | +----+---------+ 2 rows in set (0.00 sec) mysql> insert into t2(name) values('larry03'); Query OK, 1 row affected (0.00 sec) mysql> insert into t2(name) values('larry04'); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | +----+---------+ 4 rows in set (0.00 sec) --serv01 mysql> insert into t2(name) values('larry05'); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | +----+---------+ 5 rows in set (0.00 sec) --serv08 mysql> select * from t2; +----+---------+ | id | name | +----+---------+ | 1 | larry01 | | 3 | larry02 | | 4 | larry03 | | 6 | larry04 | | 7 | larry05 | +----+---------+ 5 rows in set (0.00 sec)