60.MySQL主從配置 與測試

17.1 MySQL主從介紹html

17.2 準備工做mysql

17.3 配置主linux

17.4 配置從web

17.5 測試主從同步sql

有的同窗,遇到主從不能正常同步,提示uuid相同的錯誤。這是由於克隆機器致使。數據庫

https://www.2cto.com/database/201412/364479.htmlvim

 

 

 

17.1 MySQL主從介紹:緩存

 

 

 

 

 

~1.服務器

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

好比對一個表插入了一行數據,那B機器上的這個表也會一樣的插入一行數據

~2.

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

binlog是二進制的。好比主機器插入一行都會記錄在binlog裏,而後從機器,將主的binlog同步到從機器上,並記錄在從機器本身的binlog裏。咱們把它叫作relaylog,中文叫中繼日誌,他會按照這個relaylog,嚴格按順序執行

主從過程大體有3個步驟

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

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

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

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

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

 

 

!!簡單來說就是,從會把主上的binlog搞到從上來。而後從會根據這個binlog生成本身的relaylog(中繼日誌),而後再根據這個relaylog來執行相應的更改。最終達到兩邊數據一致(執行主上的各類各樣的操做)

 

應用場景:

1. 咱們要作數據的備份。可能只是針對主這一臺作讀寫操做,而從備份的數據就單純的來備份。加入主硬件損壞,那麼咱們能夠隨時把從機器啓動起來,給客戶端提供服務

2. 不只是備份,web服務端還能夠從上讀數據。正常狀況下寫數據要寫到主上,那讀的話也要到主上去讀。假如主壓力比較大,能夠在從上作一個讀。那麼web服務器就能夠去從上讀數據。減輕主的壓力

!!可是不能再從上寫數據。由於主從是有一個方向性的。數據是從主這邊過來的,那麼從就不能寫。否則會紊亂

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

17.2 準備工做:

 

 

將兩臺都安裝MySQL

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

17.3 配置主:

 

 

 

~1.

安裝mysql

~2.

修改my.cnf,增長server-id=130和log_bin=aminglinux1

log_bin=aminglinux1這個是前綴,ls -l看的時候會看到不少以aminginux1開頭的文件,這些文件是實現主從的根本

~3.

修改完配置文件後,啓動或者重啓mysqld服務

~4.

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

mysqldump -uroot mysql > /tmp/mysql.sql 備份一個庫

mysql -uroot -e 「create database aming」 建立一個庫

mysql -uroot aming < /tmp/mysql.sql 將備份的那個庫重定向到新建立的庫裏

~5.建立用做同步數據的用戶

grant replication slave on *.* to 'repl'@slave_ip identified by 'password';

進入到mysql,權限replication就能夠了。@就是指定從的IP,不要全部會很危險

~6.

flush tables with read lock; 把表鎖一下。目的是不要讓他在寫了。就是如今到此,數據暫停,狀態保持在這。由於一會從要把備份的數據同步一下,二者保持一致,這樣才能實現一致

~7.

show master status;

記住file name 和position,一會會用到

 

 

實例:

[root@axinlinux-01 ~]# vim /etc/my.cnf

[mysqld]

datadir = /data/mysql

# port = .....

# server_id = .....

socket = /tmp/mysql.sock

server-id = 130

log_bin = aminglinux1

[root@axinlinux-01 ~]# /etc/init.d/mysqld restart

Shutting down MySQL.. SUCCESS!

Starting MySQL.. SUCCESS!

[root@axinlinux-01 mysql]# ls -lt

總用量 110796

-rw-rw---- 1 mysql mysql 50331648 9月 1 23:34 ib_logfile0

-rw-rw---- 1 mysql mysql 12582912 9月 1 23:34 ibdata1

-rw-rw---- 1 mysql mysql 178443 9月 1 23:34 axinlinux-01.err 會看到咱們設置的前綴,這些前綴爲amiglinux1的文件就是實現主從的根本

-rw-rw---- 1 mysql mysql 5 9月 1 23:34 axinlinux-01.pid

drwx------ 2 mysql mysql 4096 9月 1 23:34 mysql

-rw-rw---- 1 mysql mysql 21 9月 1 23:34 aminglinux1.index

-rw-rw---- 1 mysql mysql 120 9月 1 23:34 aminglinux1.000001 這就是那個binlog,那個2進制文件

drwx------ 2 mysql mysql 324 8月 30 16:50 zrlog

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 zrlog > /tmp/zrlog.sql 把以前的zrlog作個備份

[root@axinlinux-01 mysql]# du -sh /tmp/zrlog.sql 看一下這個備份

12K /tmp/zrlog.sql

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 -e "create database aming" 建立一個叫aming的庫

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 aming < /tmp/zrlog.sql 把zrlog重定向到aming裏

root@axinlinux-01 mysql]# ls -lh

總用量 221M

drwx------ 2 mysql mysql 324 9月 1 23:49 aming

-rw-rw---- 1 mysql mysql 11K 9月 1 23:49 aminglinux1.000001 看一下這個2進制的文件,是有增加的,正好對應了咱們重定向的zrlog的大小,說明他完完整整記錄了數據庫的建立過程

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789

MySQL [(none)]> grant replication slave on *.* to 'repl'@'192.168.208.130' identified by 'wangxin789';

Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| aminglinux1.000001 | 10920 | | | |

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

1 row in set (0.00 sec)

MySQL [(none)]> exit

Bye

[root@axinlinux-01 mysql]# ls 看一下。aming和zrlog已經作了備份,name咱們再把db1和mysql2作一個備份。mysql不用備份,由於裏面存放的是用戶密碼

aming aminglinux1.index axinlinux-01.err db1 ib_logfile0 mysql performance_schema zrlog

aminglinux1.000001 auto.cnf axinlinux-01.pid ibdata1 ib_logfile1 mysql2 test

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 mysql2 > /tmp/my2.sql

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 db1 > /tmp/db1.sql

[root@axinlinux-01 mysql]# ls /tmp/*sql 咱們會把tmp下的全部sql文件拷貝到從上去

/tmp/db1.sql /tmp/my2.sql /tmp/mysql_all.sql /tmp/mysql.sql /tmp/user2.sql /tmp/user.sql /tmp/zrlog.sql

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

 

17.4 配置從:

 

 

 

~1.

安裝mysql

~2.

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

從不須要配置log_bin

修改完配置文件後,啓動或者重啓mysqld服務

~3.

把主上aming庫同步到從上

能夠先建立aming庫,而後把主上的/tmp/mysql.sql拷貝到從上,而後導入aming庫

mysql> create database aming;

mysql -uroot zrlog < /tmp/zrlog.sql

~4. 如下實現主從

1.mysql -uroot 先登陸

2.stop slave;

3.change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000001', master_log_pos=10920;

這是實現主從的關鍵一步

指定master_host=主的IP

也能夠指定port,master_port默認是3306,因此不指定了

指定master_user='repl' 用戶爲repl

指定master_password='' 密碼

指定master_log_file='' 日誌的文件明。主上show master status; File的內容

指定master_log_pos= 日誌的數值。主上show master status; Position的內容(就是在配置主的時候show master status;時,須要記住的)

~5.

start slave;

show slave status\G 查看是否配置成功:

查看Slave_IO_Running: Yes

Slave_SQL_Running: Yes是否是兩個Yes。即便有一個是No,就表明主從已經斷開

 

~6.

還要到主上執行 unlock tables;

以前不是鎖住了嗎。不要忘記到主上在恢復寫的這個操做

 

 

實例:

[root@axinlinux-02 mysql]# vi /etc/my.cnf

[mysqld]

server_id = 132 和主不同就能夠

[root@axinlinux-02 mysql]# /etc/init.d/mysqld restart

[root@axinlinux-02 mysql]# ls 看一下實際上是沒有什麼變化的

auto.cnf axinlinux-02.err axinlinux-02.pid ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test

[root@axinlinux-02 mysql]# scp 192.168.208.128:/tmp/*.sql /tmp/

The authenticity of host '192.168.208.128 (192.168.208.128)' can't be established.

ECDSA key fingerprint is SHA256:2YEHWSxuaj+NF8PI1ipI8BeYOqoajfpRICmS59xgQEw.

ECDSA key fingerprint is MD5:3e:75:16:b7:8e:40:10:0f:f3:e9:79:34:48:69:2a:e4.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.208.128' (ECDSA) to the list of known hosts.

root@192.168.208.128's password:

db1.sql 100% 1256 566.8KB/s 00:00

my2.sql 100% 645KB 10.8MB/s 00:00

mysql_all.sql 100% 1289KB 8.1MB/s 00:00

mysql.sql 100% 645KB 4.1MB/s 00:00

user2.sql 100% 0 0.0KB/s 00:00

user.sql 100% 7244 251.7KB/s 00:00

zrlog.sql 100% 10KB 794.8KB/s 00:00

[root@axinlinux-02 mysql]# alias 'mysql=/usr/local/mysql/bin/mysql' 直接設置別名把,先不設置環境變量了

[root@axinlinux-02 mysql]# alias 'mysqldump=/usr/local/mysql/bin/mysqldump'

[root@axinlinux-02 mysql]# mysql -uroot

mysql> create database aming; 建立要恢復的庫

Query OK, 1 row affected (0.00 sec)

mysql> create database zrlog;

Query OK, 1 row affected (0.01 sec)

mysql> create database db1;

Query OK, 1 row affected (0.00 sec)

mysql> create database mysql2;

Query OK, 1 row affected (0.00 sec)

[root@axinlinux-02 mysql]# mysql -uroot zrlog < /tmp/zrlog.sql 開始恢復

[root@axinlinux-02 mysql]# mysql -uroot mysql2 < /tmp/my2.sql

[root@axinlinux-02 mysql]# mysql -uroot db1 < /tmp/db1.sql

[root@axinlinux-02 mysql]# mysql -uroot aming < /tmp/zrlog.sql

以上數據恢復完成。下面實現主從:

[root@axinlinux-02 mysql]# mysql -uroot

mysql> stop slave;

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

mysql> change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000001', master_log_pos=10920;

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

mysql> start slave;

Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G 查看是否配置成功

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

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.208.128

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: aminglinux1.000002

Read_Master_Log_Pos: 120

Relay_Log_File: axinlinux-02-relay-bin.000003

Relay_Log_Pos: 285

Relay_Master_Log_File: aminglinux1.000002

Slave_IO_Running: Yes 這是否是兩個YES

Slave_SQL_Running: Yes

Last_IO_Errno: 0

Last_IO_Error: 也能夠看有沒有error信息

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 130

Master_UUID: 8bd974f2-9c97-11e8-9aa2-000c29874224

Master_Info_File: /data/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it 這也能看到他的信息

Master_Retry_Count: 86400

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 別忘記回到主上,恢復寫操做

MySQL [(none)]> unlock tables; 以前主上配置不是鎖住了,如今配置成功要解鎖

Query OK, 0 rows affected (0.00 sec)

 

 

 

 

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

 

 

17.5 測試主從同步:

 

 

 

 

 

查看主從同步是否正常:

從上執行mysql -uroot

show slave status\G

看是否有

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

還需關注

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

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

 

 

幾個配置參數:

如下配置是在/etc/my.cnf裏配置的,能夠在主上、從上均可以配置

~~1.

主服務器上:

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

用這個參數定義你要同步的庫。假如主從就想同步一個庫,好比zrlog。就能夠在主上加入binlog-do-db=zrlog。若是有多個用逗號分隔

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

就是假如定義除了zrlog這個庫,其餘的庫都要同步。就能夠寫binlog-ignore-db=zrlog

~~2.

從服務器上(同理在從上也能夠定義):

replicate_do_db= 以上同理

replicate_ignore_db= 以上同理

replicate_do_table=

不想同步庫裏的某一個表。好比臨時表,數據丟了也無所謂

可是會有必定的問題。好比咱們忽略了mysql。若是他的sql語句裏有use mysql,那麼他檢測到了use mysql,後面的操做都不會記錄到中繼日誌裏去了。就會致使數據不完整

因此儘可能不要使用 replicate_do_table=和replicate_ignore_table=。之後在作忽略的時候儘可能用下面兩個(不支持用逗號分隔多寫,每一個表或庫用一行寫)

replicate_ignore_table=

!!因此,之後在作某一個庫或表,或忽略某一個庫或表的時候,用下面這兩個就能夠了。由於支持庫(點)表。也支持庫(點)統配,以上四個均可以不用:

!replicate_wild_do_table= //如aming.%, 支持通配符%

不想同步某一個表的時候,可指定那個庫裏的表,也支持統配。用點來分隔

!replicate_wild_ignore_table=

忽略某一個表的時候,可指定哪一個庫裏的表,支持統配。用點來分隔

 

 

 

 

測試主從:

 

主上 mysql -uroot aming

select count(*) from db;

truncate table db;

到從上 mysql -uroot aming

select count(*) from db;

主上繼續drop table db;

從上查看db表

 

 

實例:

先查看錶的行數是否一致:

[root@axinlinux-01 ~]# mysql -uroot -pwangxin789 主上登陸mysql

MySQL [(none)]> use aming 切換到aming庫

MySQL [aming]> show tables; 查看他的表,有下面這九個

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

| Tables_in_aming |

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

| comment |

| link |

| log |

| lognav |

| plugin |

| tag |

| type |

| user |

| website |

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

9 rows in set (0.00 sec)

MySQL [aming]> select count(*) website; 咱們再查看一下website表裏有多少行

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.00 sec)

[root@axinlinux-02 ~]# mysql -uroot 回到從上

mysql> use aming; 同樣切換到aming

mysql> show tables; 同樣查看他的表

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

| Tables_in_aming |

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

| comment |

| link |

| log |

| lognav |

| plugin |

| tag |

| type |

| user |

| website |

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

9 rows in set (0.00 sec)

mysql> select count(*) website; 同樣查看他有多少行。是跟主上都是同樣的

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.03 sec)

清空後再查看是否同步

MySQL [aming]> truncate table website; 咱們再在主上清空這個表

Query OK, 0 rows affected (0.04 sec)

MySQL [aming]> select count(*) website; 查看他的行數,仍是顯示一行。是由於緩存。咱們用*看一下

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.00 sec)

MySQL [aming]> select * from website; 是爲空的

Empty set (0.00 sec)

mysql> select * from website; 咱們再回到從上,查看這個表。顯示也爲空

Empty set (0.00 sec)

把表drop掉查看是否同步

MySQL [aming]> drop table website; 主上drop掉這個表

Query OK, 0 rows affected (0.02 sec)

mysql> select * website; 從上查看這個表沒有了

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'website' at line 1

咱們在從上把aming這個庫直接給幹掉(生產環境中不要這麼作)。而且從新配置主從:

mysql> drop database aming; 在從上drop掉aming庫

Query OK, 8 rows affected (0.18 sec)

mysql> show slave status\G 再來查看

Slave_IO_Running: Yes 如今雖然都是Yes

Slave_SQL_Running: Yes

MySQL [aming]> drop database aming; 再回到主上再drop一遍aming

Query OK, 8 rows affected (0.13 sec)

mysql> show slave status\G 再回到從上查看。發現Running爲No,而且有報錯了。提示沒有這個庫

Slave_IO_Running: Yes

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: 1008

Last_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'

由於在主上刪除了,那麼在從上又會再刪一次。這時候就會遇到問題,一旦遇到問題,主從就斷掉了。咱們能夠先試着這樣修復:

mysql> stop slave; 先stop

Query OK, 0 rows affected (0.00 sec)

mysql> start slave; 再start。看能不能起來

Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G 咱們再來看一下。仍是不行,爲No,也有報錯

Slave_IO_Running: Yes

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: 1008

Last_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'

若是這樣不行,那就只能重新作主從了(在主上show master status;記錄position這一步開始作就能夠,由於目前來講這個數據仍是一致的,沒有作過其餘的操做)

MySQL [(none)]> show master status; 主上再查看一下 File 和 Position

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| aminglinux1.000004 | 435 | | | |

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

1 row in set (0.00 sec)

mysql> stop slave; 從上再stop slave

Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000004', master_log_pos=435;

從上再從新change master

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

mysql> start slave; 從上再從新start slave

Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G 從上再查看一下

Slave_IO_Running: Yes 都爲Yes

Slave_SQL_Running: Yes

相關文章
相關標籤/搜索