MySQL主從介紹&準備工做&配置主&配置從&測試主從同步

17.1 MySQL主從介紹

MySQL主從的概念

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

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

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

• 1)主將更改操做記錄到binlog裏sql

• 2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏數據庫

• 3)從根據relaylog裏面的sql語句按順序執行vim

• 主上有一個log dump線程,用來和從的I/O線程傳遞binlog服務器

• 從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句落地socket

MySQL主從的原理圖ide

其中Msater是主,Slave是從測試

MySQL主從的做用

  • 數據備份,主機器宕機,從機器還能隨時對web提供服務
  • 從庫能夠做爲網站的讀取數據庫,從而減輕主庫的壓力。

注:mysql主從,是有方向性的,寫數據,必須從主機器開始;若是不依照原理會致使數據紊亂

17.2 準備工做

MySQL主從準備工做的內容

準備兩臺機器,每臺機器安裝msyql服務,並啓動mysql服務

MySQL服務安裝流程

1.下載安裝包(二進制免編譯)-->2.解壓壓縮包-->3.初始化-->4.修改配置文件-->5.複製啓動腳本-->6.修改啓動腳本-->7.啓動mysql-->8.開機啓動mysql

下載安裝包(二進制免編譯)

首先下載二進制免編譯的包,下載到/usr/local/src/目錄下

解壓壓縮包

解壓完以後,把解壓出來的目錄放到 /usr/local/mysql/ 目錄下

注:首先檢查 /usr/local/mysql/ 目錄是否存在,如果這個目錄存在,首先把這個目錄改個名字,或者把目錄下的內容刪除,而後把解壓出來的目錄放到 /usr/local/mysql/ 目錄下面

初始化

cd /usr/local/mysql/
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

注:其中的--user=mysql 須要提早建立mysql用戶;初始化成功的標誌就是兩個OK,或者用 echo $? 檢查是否初始化成功

修改配置文件

vim /etc/my.cnf
定義 datadir=/data/mysql     
定義 socket=/tmp/mysql.sock

複製啓動腳本

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

修改啓動腳本

vim /etc/init.d/mysqld //對如下兩行進行指定路徑

指定basedir的路徑 /usr/local/mysql  
指定datadir的路徑 /data/mysql

啓動mysql

/etc/init.d/mysql start

若是啓動失敗,能夠去查看錯誤日誌;

查看 /data/mysql 目錄下的文件,默認屬主、屬組,若是不是mysql的,啓動時會因沒法寫入數據而不能啓動mysql,須要改變屬主和屬組

chomd mysql:mysql /data/mysql

開機啓動mysql

chkconfig mysqld on

詳細配置

MySQL的安裝

17.3 配置主

修改配置文件

vim /etc/my.cnf
增長server-id=5和log_bin=lemlinux1

重啓MySQL服務

[root@linux-5 ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

查看數據庫文件

[root@linux-5 ~]# cd /data/mysql/
[root@linux-5 mysql]# ls -lt
總用量 110676
-rw-rw----. 1 mysql mysql 50331648 7月   5 23:59 ib_logfile0
-rw-rw----. 1 mysql mysql 12582912 7月   5 23:59 ibdata1
-rw-rw----. 1 mysql mysql    54024 7月   5 23:59 linux-5.err
-rw-rw----. 1 mysql mysql        5 7月   5 23:59 linux-5.pid
-rw-rw----. 1 mysql mysql       19 7月   5 23:59 lemlinux1.index
-rw-rw----. 1 mysql mysql      120 7月   5 23:59 lemlinux1.000001
drwx------. 2 mysql mysql     4096 7月   4 23:34 zrlog
-rw-rw----. 1 mysql mysql       56 5月  24 19:58 auto.cnf
drwx------. 2 mysql mysql     4096 5月  24 18:35 mysql
drwx------. 2 mysql mysql     4096 5月  24 18:35 performance_schema
-rw-rw----. 1 mysql mysql 50331648 5月  24 18:35 ib_logfile1
drwx------. 2 mysql mysql        6 5月  24 18:35 test

其中.index;.000001這些文件是實現MySQL主從的根本

.index 索引頁,這個文件是必需要有的

.000001 這個是二進制日誌文件,會持續生成二、三、4等等(這個文件是實現主從配置的根本,沒有這個文件根本沒有辦法完成主從)

準備測試數據

把zrlog庫備份並恢復成lem庫,做爲測試數據

mysqldump -uroot zrlog > /tmp/lem.sql   //zrlog數據庫備份
mysql -uroot -e "create database lem"   //建立新庫lem
mysql -uroot lem < /tmp/lem.sql         //將zrlog數據庫備份數據導入lem庫中

再次查看數據庫文件

[root@linux-5 mysql]# ls -lt
總用量 110688
-rw-rw----. 1 mysql mysql 50331648 7月   6 00:09 ib_logfile0
-rw-rw----. 1 mysql mysql 12582912 7月   6 00:09 ibdata1
-rw-rw----. 1 mysql mysql    10152 7月   6 00:08 lemlinux1.000001
drwx------. 2 mysql mysql     4096 7月   6 00:08 lem
-rw-rw----. 1 mysql mysql    54024 7月   5 23:59 linux-5.err
-rw-rw----. 1 mysql mysql        5 7月   5 23:59 linux-5.pid
-rw-rw----. 1 mysql mysql       19 7月   5 23:59 lemlinux1.index
drwx------. 2 mysql mysql     4096 7月   4 23:34 zrlog
-rw-rw----. 1 mysql mysql       56 5月  24 19:58 auto.cnf
drwx------. 2 mysql mysql     4096 5月  24 18:35 mysql
drwx------. 2 mysql mysql     4096 5月  24 18:35 performance_schema
-rw-rw----. 1 mysql mysql 50331648 5月  24 18:35 ib_logfile1
drwx------. 2 mysql mysql        6 5月  24 18:35 test

能夠看到lemlinux1.000001二進制文件是有增長的,lemlinux1.000001增加的大小是和zrlog這個數據庫備份的大小保持一致的,lemlinux1.000001文件裏完整的記錄了數據庫的建立的庫,建立的表,以及表裏的內容,經過完整的lemlinux1.000001文件也能夠恢復數據庫的數據

建立用做同步數據的用戶

在MySQL主從中,從數據庫須要到主數據庫上同步日誌,這個過程須要認證,所以咱們須要在主庫上建立一個用戶用於從庫登陸同步日誌。

grant replication slave on *.* to 'repl'@192.168.88.10(從庫IP) identified by '123456';

鎖定數據庫表

鎖定表,目的是不讓表繼續寫,由於一會須要作從機器配置,須要進行一個同步,讓兩臺機器同步,保證兩臺機器的數據一致,同步纔不會出錯

flush tables with read lock;

查看binlog文件

查看一下binlog的文件和大小,並記住binlog的filename

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| lemlinux1.000001 |    10362 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

數據同步

查看/data/mysql/下有哪些庫,主上有哪些庫,從上也得有哪些庫,同步這些庫,就意味着這些數據都要備份過去

[root@linux-5 mysql]# ls /data/mysql/
auto.cnf  ib_logfile0  lem               lemlinux1.index  linux-5.pid  performance_schema  zrlog
ibdata1   ib_logfile1  lemlinux1.000001  linux-5.err      mysql        test

備份數據庫,除了mysql庫,由於mysql庫裏面有帳號密碼,從上備份的時候不可能把全部權限複製過去,因此mysql不須要備份

mysqldump -uroot test > /tmp/lem2.sql

在主從同步時把主上/tmp/目錄下 .sql文件都拷貝到從上去

17.4 配置從

修改從庫的配置文件

vim /etc/server
增長server-id = 10

從庫不須要生成二進制日誌文件,只有主庫須要

重啓數據庫

[root@linux-10 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

拷貝主數據庫的備份文件

[root@linux-10 ~]# scp 192.168.88.5:/tmp/*.sql /tmp/
Warning: Permanently added '192.168.88.5' (ECDSA) to the list of known hosts.
root@192.168.88.5's password: 
lem2.sql                                        100% 1258     1.0MB/s   00:00    
lem.sql                                         100% 9867     4.3MB/s   00:00

建立與主庫對應的數據庫

mysql> create database lem;
Query OK, 1 row affected (0.00 sec)

mysql> create database zrlog;
Query OK, 1 row affected (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

數據恢復

root@linux-10 ~]# mysql -uroot -p12345678 zrlog < /tmp/lem.sql
Warning: Using a password on the command line interface can be insecure.
[root@linux-10 ~]# mysql -uroot -p12345678 lem < /tmp/lem.sql
Warning: Using a password on the command line interface can be insecure.
[root@linux-10 ~]# mysql -uroot -p12345678 test < /tmp/lem2.sql
Warning: Using a password on the command line interface can be insecure.

實現主從

stop slave;   //中止同步
change master to master_host='192.168.88.5', master_user='repl', master_password='123456', master_log_file='lemlinux1.000001', master_log_pos=10362;

master_host='192.168.88.5',指定主機器host

master_user='repl',指定主機器用戶

master_password='123456',指定主機器密碼

master_log_file='lemlinux1.000001',指定binlog文件名

master_log_pos=10362,指定binlog文件大小

master_log_file和master_log_pos是由主庫show master status

也能夠指定主機器的port,由於在生產環境中,也會有人更改mysql的默認端口 master_port=端口號,若是是默認端口則無需添加

開啓同步

start slave;

查看主從是否成功

mysql> show slave status\G             //\G後不用加分號,自己就是結束符
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.88.5
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: lemlinux1.000003
          Read_Master_Log_Pos: 120
               Relay_Log_File: linux-10-relay-bin.000005
                Relay_Log_Pos: 283
        Relay_Master_Log_File: lemlinux1.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            Seconds_Behind_Master: 0
             Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error:

成功的標誌是 Slave_IO_Running和Slave_SQL_Running兩項是否均爲yes

還須要關注

Seconds_Behind_Master: 0  //爲主從延遲的時間

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

解鎖主數據庫表

unlock tables;

17.5 測試主從同步

主從同步的配置參數

主從中有一些配置參數可使數據庫同步時更加精確,具備目的性。

主服務器

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=   //如aming.%, 支持通配符%  指定同步靠譜的匹配  忽略表

使用前4條參數時會有必定的侷限性,例如:有一個臨時表,寫的數據很是快,數據也大,天天都須要刪除或者更新,那麼就不須要天天去作同步,而且在面對聯合查找時,可能會形成數據不完整的狀況,所以在設置主從配置參數時,儘可能使用後兩條。

測試主從

清除主庫中測試庫user表中數據

mysql> use lem
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_lem |
+---------------+
| comment       |
| link          |
| log           |
| lognav        |
| plugin        |
| tag           |
| type          |
| user          |
| website       |
+---------------+
9 rows in set (0.00 sec)

mysql> select count(*) from website;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

mysql> select * from website;
+--------+---------------------+----------------------------------------------------------------------+--------+
| siteId | name                | value                                                                | remark |
+--------+---------------------+----------------------------------------------------------------------+--------+
|      1 | rows                | 10                                                                   | NULL   |
|      2 | template            | /include/templates/default                                           | NULL   |
|      3 | autoUpgradeVersion  | 86400                                                                | NULL   |
|      4 | pseudo_staticStatus | false                                                                | NULL   |
|      5 | title               | lemzrlog                                                             | NULL   |
|      6 | second_title        | lem                                                                  | NULL   |
|      7 | home                | http://192.168.88.5/zrlog/                                           | NULL   |
|      8 | zrlogSqlVersion     | 4                                                                    | NULL   |
|      9 | plugin_core_db_key  | {"pluginInfoMap":{},"setting":{"disableAutoDownloadLostFile":false}} | NULL   |
+--------+---------------------+----------------------------------------------------------------------+--------+
9 rows in set (0.00 sec)

mysql> truncate table website;
Query OK, 0 rows affected (0.01 sec)
mysql> select count(*) from website;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

查看從庫

mysql> use lem
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select count(*) from website;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

從庫的數據也被刪除,說明主從配置成功

如果誤操做了,好比在從機器誤刪除了,再去主上刪除相同的數據,就會有可能致使主從失敗

這時在從機器上 start slave;

而後在start slave;

再來查看show slave status\G

如果仍是失敗,則只能從新作主從了

從新主從

在主機器的數據庫上 show mater status; 查看文件大小

而後在從機器上先stop slave;

而後直接change master to master_host='192.168.88.5', master_user='repl', master_password='123456', master_log_file='lemlinux1.000001', master_log_pos=10362;

由於基本還沒作什麼操做的,數據仍是一致的,直接改下數據大小就行

而後在從機器上 start slave;

再來查看 show slave status\G 看是否爲兩個Yes,若仍是報錯只能從新從頭作主從了

相關文章
相關標籤/搜索