1. 程式人生 > >60.MySQL主從配置 與測試

60.MySQL主從配置 與測試

17.1 MySQL主從介紹

17.2 準備工作

17.3 配置主

17.4 配置從

17.5 測試主從同步

有的同學,遇到主從不能正常同步,提示uuid相同的錯誤。這是因為克隆機器導致。

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

https://blog.csdn.net/sunbocong/article/details/81634296

報錯

No query specified

https://blog.csdn.net/tenfyguo/article/details/7566941

 

 

17.1 MySQL主從介紹:

 

 

 

 

 

~1.

MySQL主從又叫做Replication、AB複製。簡單講就是A和B兩臺機器做主從後,在A上寫資料,另外一臺B也會跟著寫資料,兩者資料實時同步的

比如對一個表插入了一行資料,那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=134和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@afeilinux-01 ~]# vim /etc/my.cnf

修改my.cnf,增加server-id=134和log_bin=aminglinux1

 [mysqld]
 basedir = /usr/local/mysql
 datadir = /data/mysql
# port = .....
# server_id = .....
 socket =  /tmp/mysql.sock
 server-id = 134
 log_bin = aminglinux1

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

Shutting down MySQL..... SUCCESS! 
Starting MySQL... SUCCESS! 

[root@afeilinux-01 ~]#  cd /data/mysql/

[root@afeilinux-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

總用量 110916
-rw-rw----. 1 mysql mysql 50331648 8月   5 13:26 ib_logfile0
-rw-rw----. 1 mysql mysql 12582912 8月   5 13:26 ibdata1
-rw-rw----. 1 mysql mysql    18851 8月   5 13:26 afeilinux-01.err
-rw-rw----. 1 mysql mysql        5 8月   5 13:26 afeilinux-01.pid
-rw-rw----. 1 mysql mysql       21 8月   5 13:26 aminglinux1.index
-rw-rw----. 1 mysql mysql      120 8月   5 13:26 aminglinux1.000001
drwx------. 2 mysql mysql     4096 8月   2 13:49 zrlog
-rw-rw----. 1 mysql mysql     7530 7月  31 10:06 www.wangxin.com.err
-rw-rw----. 1 mysql mysql        5 7月  30 17:22 www.wangxin.com.pid
-rw-rw----. 1 mysql mysql   202323 7月  30 17:14 localhost.err
drwx------. 2 mysql mysql     4096 7月  30 17:06 mysql2
drwx------. 2 mysql mysql       48 7月  30 16:15 db1
-rw-r--r--. 1 root  root         6 7月  30 11:02 mysql_upgrade_info
drwx------. 2 mysql mysql     4096 7月  30 11:02 mysql
drwx------. 2 mysql mysql     4096 7月  30 11:02 performance_schema
-rw-rw----. 1 mysql mysql       56 7月  23 10:09 auto.cnf
-rw-rw----. 1 mysql mysql 50331648 7月  23 09:02 ib_logfile1
drwx------. 2 mysql mysql        6 7月  23 09:02 test

[root@afeilinux-01 mysql]# mysqldump -uroot -pwangxin789 zrlog > /tmp/zrlog.sql 把之前的zrlog做個備份

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

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

12K	/tmp/zrlog.sql

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

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

root@afeilinux-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的大小,說明他完完整整記錄了資料庫的建立過程

總用量 222M
-rw-rw----. 1 mysql mysql  19K 8月   5 13:26 afeilinux-01.err
-rw-rw----. 1 mysql mysql    5 8月   5 13:26 afeilinux-01.pid
drwx------. 2 mysql mysql 4.0K 8月   5 13:43 aming
-rw-rw----. 1 mysql mysql  11K 8月   5 13:43 aminglinux1.000001
-rw-rw----. 1 mysql mysql   21 8月   5 13:26 aminglinux1.index
-rw-rw----. 1 mysql mysql   56 7月  23 10:09 auto.cnf
drwx------. 2 mysql mysql   48 7月  30 16:15 db1
-rw-rw----. 1 mysql mysql  76M 8月   5 13:43 ibdata1
-rw-rw----. 1 mysql mysql  48M 8月   5 13:43 ib_logfile0
-rw-rw----. 1 mysql mysql  48M 7月  23 09:02 ib_logfile1
-rw-rw----. 1 mysql mysql 198K 7月  30 17:14 localhost.err
drwx------. 2 mysql mysql 4.0K 7月  30 11:02 mysql
drwx------. 2 mysql mysql 4.0K 7月  30 17:06 mysql2
-rw-r--r--. 1 root  root     6 7月  30 11:02 mysql_upgrade_info
drwx------. 2 mysql mysql 4.0K 7月  30 11:02 performance_schema
drwx------. 2 mysql mysql    6 7月  23 09:02 test
-rw-rw----. 1 mysql mysql 7.4K 7月  31 10:06 www.wangxin.com.err
-rw-rw----. 1 mysql mysql    5 7月  30 17:22 www.wangxin.com.pid
drwx------. 2 mysql mysql 4.0K 8月   2 13:49 zrlog

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

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

Query OK, 0 rows affected (0.02 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 |    11319 |              |                  |                   |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

MySQL [(none)]> exit

Bye

[root@afeilinux-01 mysql]# ls 看一下。aming和zrlog已經做了備份,name我們再把db1和mysql2做一個備份。mysql不用備份,因為裡面存放的是使用者密碼

afeilinux-01.err    aminglinux1.index  ib_logfile0    mysql2              www.wangxin.com.err
afeilinux-01.pid    auto.cnf           ib_logfile1    mysql_upgrade_info  www.wangxin.com.pid
aming               db1                localhost.err  performance_schema  zrlog
aminglinux1.000001  ibdata1            mysql          test

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

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

[root@afeilinux-01 mysql]# ls /tmp/*sql 我們會把tmp下的所有sql檔案拷貝到從上去

/tmp/db1.sql  /tmp/my2.sql  /tmp/zrlog.sql

 

 

 

 

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

 

 

 

 

 

 

17.4 配置從:

 

 

 

~1.

安裝mysql

~2.

檢視my.cnf,配置server-id=135,要求和主不一樣

從不需要配置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=11319;

這是實現主從的關鍵一步

指定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@afeilinux-02 mysql]# vi /etc/my.cnf

[mysqld]

server_id = 132 和主不一樣就可以

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

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

afeilinux-02.err  auto.cnf  ibdata1      ib_logfile1    mysql   mysql_upgrade_info  test
afeilinux-02.pid  db1       ib_logfile0  localhost.err  mysql2  performance_schema  www.wangxin.com.err

[root@afeilinux-02 mysql]# scp 192.168.30.134:/tmp/*.sql /tmp/

The authenticity of host '192.168.30.134 (192.168.30.134)' can't be established.
ECDSA key fingerprint is SHA256:YYxBRP+LIXXWIKKz0kj1nBy5CFpOIttm/EYlew0Y1Dw.
ECDSA key fingerprint is MD5:e6:61:20:da:74:3f:1c:8b:f6:89:4b:09:a2:45:b7:28.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.30.134' (ECDSA) to the list of known hosts.
[email protected]'s password: 
db1.sql                                                                  100% 1774     1.1MB/s   00:00    
my2.sql                                                                  100%  632KB  43.8MB/s   00:00    
zrlog.sql                                                                100%   10KB   5.6MB/s   00:00 

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

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

[root@afeilinux-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@afeilinux-02 mysql]# mysql -uroot zrlog -pwangxin789 < /tmp/zrlog.sql 開始恢復

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

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

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

以上資料恢復完成。下面實現主從:

[root@afeilinux-02 mysql]# mysql -uroot -pwangxin789

mysql> stop slave;

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

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

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

mysql> start slave;

Query OK, 0 rows affected (0.00 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

*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.30.134
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: aminglinux1.000001
          Read_Master_Log_Pos: 10920
               Relay_Log_File: afeilinux-02-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: aminglinux1.000001
             Slave_IO_Running: Connecting
            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: 10920
              Relay_Log_Space: 120
              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: 1045
                Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60  retries: 1
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             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
                  Master_Bind: 
      Last_IO_Error_Timestamp: 190806 14:42:34
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

報錯

1.Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60  retries: 1

原因到master不通,

解決在master上grant replication slave on *.* to 'repl'@'192.168.30.135' identified by 'wangxin789';

2. Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

原因從機是從主機克隆來的所以從和主機的UUID相同

[root@afeilinux-01 ~]#  cat /data/mysql/auto.cnf
[auto]
server-uuid=e9901d09-acee-11e9-8a87-000c297858aa
[root@afeilinux-02 ~]# cat /data/mysql/auto.cnf
[auto]
server-uuid=e9901d09-acee-11e9-8a87-000c297858aa

解決

停止從庫的mysqld服務,刪除他的auto.cnf檔案,再啟動資料庫服務即可:

[root@afeilinux-02 ~]# mv /data/mysql/auto.cnf /data/mysql/auto.cnf.bak
[root@afeilinux-02 ~]# systemctl start mysqld.service
[root@afeilinux-02 ~]# cat /data/mysql/auto.cnf
[auto]
server-uuid=1f96ba53-b827-11e9-93b0-000c29020788

[root@afeilinux-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@afeilinux-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@afeilinuxx-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.00 sec)

清空後再檢視是否同步

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

Query OK, 0 rows affected (0.05 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.05 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.06 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.09 sec)

mysql> show slave status\G 再回到從上檢視。發現Running為No,並且有報錯了。提示沒有這個庫

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.30.134
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: aminglinux1.000001
          Read_Master_Log_Pos: 11845
               Relay_Log_File: afeilinux-02-relay-bin.000003
                Relay_Log_Pos: 716
        Relay_Master_Log_File: aminglinux1.000001
             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'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 11750
              Relay_Log_Space: 991
              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: 1008
               Last_SQL_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 134
                  Master_UUID: e9901d09-acee-11e9-8a87-000c297858aa
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 190806 17:44:08
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

因為在主上刪除了,那麼在從上又會再刪一次。這時候就會遇到問題,一旦遇到問題,主從就斷掉了。我們可以先試著這樣修復:

mysql> stop slave; 先stop

Query OK, 0 rows affected (0.00 sec)

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

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G 我們再來看一下。還是不行,為No,也有報錯

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.30.134
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: aminglinux1.000001
          Read_Master_Log_Pos: 11845
               Relay_Log_File: afeilinux-02-relay-bin.000003
                Relay_Log_Pos: 716
        Relay_Master_Log_File: aminglinux1.000001
             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'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 11750
              Relay_Log_Space: 1336
              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: 1008
               Last_SQL_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 134
                  Master_UUID: e9901d09-acee-11e9-8a87-000c297858aa
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 190806 17:47:48
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

如果這樣不行,那就只能從新做主從了(在主上show master status;記錄position這一步開始做就可以,因為目前來說這個資料還是一致的,沒有做過其他的操作)

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

+--------------------+----------+--------------+------------------+-------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| aminglinux1.000001 |    11845 |              |                  |                   |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> stop slave; 從上再stop slave

Query OK, 0 rows affected (0.00 sec)

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

從上再重新change master

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

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

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G 從上再檢視一下

Slave_IO_Running: Yes 都為Yes

Slave_SQL_Runnin