day62:mysql主從配置

一、主從介紹:mysql主從又叫Replication,AB兩臺機器複製,也就是說是AB兩臺機器作了主從後,在A機器上寫數據,另外一臺B機器也會跟中寫數據,二者數據實時同步:mysql

mysql主從是基於binlog,主上必須開啓binlog才能進行主從:binlog是一個二進制的日記文件linux

mysql主從的過程步驟web

1:主將更改操做記錄(增刪改)到binlog裏:sql

2:從將主的binlog事件(SQL語句)同步到從本機並記錄relaylog中:數據庫

3:從根據relaylog裏面的語句按數據嚴格執行:vim

註釋:主從過程涉及到三個線程,    主(logdump線程)        從(I/O線程、SQL線程)bash

主上有一個線程(logdump)用來和從的I/O線程傳遞binlog:服務器

從上有兩個線程: I/O線程用來同步主的binlog至本機並生成relaylog:        SQL線程用來把relaylog裏的sql語句按數據執行:socket

附記:master主會把操做記錄到binlog中,經過線程dumplog和從線程I/O線程傳遞binlog,從經過線程I/O收到binlog後至本機生成relaylog,並經過線程SQL來按順序執行relaylog裏的sql語句:ide

應用場景

一、用於備份重要數據:(僅僅只做爲備份):主機器宕機,從機器還能隨時對web提供服務:

二、主從同時對web服務,目的在與減輕主庫壓,從庫做爲一個只讀的庫存在(從mysql只能讀數據,不能寫數據),數據備份的同時可分擔主機器被調用數據時的壓力,mysql主從有方向性,寫數據必須從主機器開始,若是不依照原理會致使數據紊亂:

mysql主從原理圖:以下:                 Master:主               Slave:從

二、主從操做步驟:首先準備兩臺單獨都運行了mysql的服務器,或者同一臺機器上的兩個mysql實例也能夠(端口不能相同):開啓mysql服務:

mysql的詳細安裝步驟

1:首先下載mysql二進制免編譯包,放在目錄/usr/local/src

2:解壓壓縮包:

3:解壓以後,把解壓後的mysql目錄及文件放到/usr/local/mysql

註釋:首先查看/usr/local/mysql這個目錄是否存在,存在則修更名稱或者挪到其它目錄:

4:進入到/usr/local/mysql目錄下:建立mysql用戶和數據庫目錄,而後初始化s時使用:

useradd mysqld ; mkdir -p /data/mysql

./scripts/mysql_install_db     --user=msyql    --datadir=/data/mysql

註釋:此時可能會須要安裝兩個包:   perl-Data-Dumper.x86_64            libaio.x86_64 libaio-devel.x86_64  

看到安裝過程裏有兩個OK,或者用echo  $?測試是0則爲正常:

5:編輯配置文件/etc/my.cnf    -------->默認自帶配置文件:

在/etc/my.cnf中:
定義  datadir=/data/mysql
定義  socket=/tmp/mysql.sock

6:拷貝啓動腳本:   cp   /usr/lcoal/mysql/support-file/mysql.server     /etc/init.d/mysqld

在/etc/init.d/mysqld
定義 basedir=/usr/local/mysql
定義 datadir=/data/mysql

7:而後能夠啓動mysqld了,建議查看/data/mysql/的文件和目錄是不是mysql屬主和屬主:啓動會由於不是mysql用戶而沒法啓動:

註釋:若想開機啓動建議設置chkconfig:

mysql主從----主上操做

1:安裝mysql:

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

修改完配置後重啓後,啓動或者重啓mysql服務:

註釋:打開binlog二進制日記,自定義前綴amingliunx1,同一個集羣內的server-id不能重複:

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

mysqldump -uroot -pnihao123!   zrlog > /tmp/zrlog.sql

mysql  -uroot -pnihao123!  -e  「create   database   FYKU」

mysql  -uroot -pnihao123!   <  /tmp/FYKU.sql

4:建立用做同步數據的帳戶,用於主從之間的數據同步:

grant   replication   slave    on  *.*  to     'repl'@slave_ip    identified  by  'nihao123!'

5:鎖表,爲了兩邊的數據一致:

flush    tables    with    read  lock;

5:show   master   status;          #要記住filename和position的位置:

主從配置-主上詳細操做命令

一、首先在兩臺機器安裝並啓動mysql,咱們先在主上操做:

二、修改/etc/my.cnf配置文件:定義server-id和binlog:

[root@localhost_02 ~]# vim /etc/my.cnf
[root@localhost_02 ~]# cat !$ |grep -v '^#'|grep -v '^$'
cat /etc/my.cnf |grep -v '^#'|grep -v '^$'
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=130              #這個id能夠自定義,本處以當前系統IP地址定義:
bin_log=fenye520           #打開binlog日記,定義fenye520爲前綴名稱:

三、重啓啓動mysql服務:

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

四、這時候咱們查看mysql的數據目錄:會生成兩個文件:fenye520.000005(binlog日記)            fenye520.index(索引頁)

#binlog詳細記錄mysql數據庫每一步操做過程,增長和刪除等操做:

[root@localhost_01 ~]# ls -lt /data/mysql/
總用量 110740
drwx------ 2 mysql mysql     4096 9月   4 14:31 zrlog            #原博客的目錄:
-rw-rw---- 1 mysql mysql    13853 9月   4 14:22 localhost_02.err
-rw-rw---- 1 mysql mysql        5 9月   4 14:22 localhost_02.pid
-rw-rw---- 1 mysql mysql       90 9月   4 14:22 fenye520.index    #索引頁:
-rw-rw---- 1 mysql mysql     1852 9月   4 14:31 fenye520.000005   #binlog:
-rw-rw---- 1 mysql mysql      143 9月   4 14:22 fenye520.000004
-rw-rw---- 1 mysql mysql      143 9月   4 14:22 fenye520.000001
-rw-rw---- 1 mysql mysql      143 9月   4 14:21 fenye520.000003
-rw-rw---- 1 mysql mysql      143 9月   4 14:21 fenye520.000002
-rw-rw---- 1 mysql mysql    16384 8月  23 22:12 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 8月  23 22:12 aria_log_control
-rw-rw---- 1 mysql mysql        0 8月  23 21:49 multi-master.info
-rw-rw---- 1 mysql mysql 50331648 8月  23 21:48 ib_logfile1
-rw-rw---- 1 mysql mysql       56 8月  21 22:00 auto.cnf
drwx------ 2 mysql mysql     4096 8月  21 21:10 mysql         #mysql自帶的數據庫,存放用戶名密碼等:
drwx------ 2 mysql mysql        6 8月  21 21:07 test

註釋:  會生成兩個文件:fenye520.000005(binlog日記)            fenye520.index(索引頁)

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

.000001:這個是二進制binlog文件,會持續生成2 3 4等等(這個文件是實現主從配置的根本,沒有這個文件則沒辦法完成主從):

五、測試:準備用mysql數據庫下zrlog作演示用:

首先作一個備份:  mysqldump   -uroot  -pnihao123!   zrlog > /tmpt/zrlog.sql

[root@localhost_01 ~]# mysqldump -uroot -pnihao123! zrlog > /tmp/zrlog.sql
Warning: Using a password on the command line interface can be insecure.
[root@localhost_02 ~]# ls /tmp/zrlog.sql 
/tmp/zrlog.sql

建立一個新的庫: mysql  -uroot -pnihao123!   -e   "create  databese  FYKU"

[root@localhost_01 ~]# mysql -uroot -pnihao123! -e "create database FYKU"
Warning: Using a password on the command line interface can be insecure.

建立好庫後,在把數據恢復一下,也就是說主從是以FYKU這個庫爲準的:

[root@localhost_01 ~]# mysql -uroot  -pnihao123! FYKU < /tmp/zrlog.sql 
Warning: Using a password on the command line interface can be insecure.

六、再次查看/data/mysql下的文件,能看到fenye520.000001這個文件有增長的:

七、下面建立用於主從同步數據時所需的用戶和密碼:  也就是binlog和I/Olog之間使用:

grant   replication  slave  on  *.*  'repl'@slave_ip   identified   by  'nihao123!';

[root@localhost_01 ~]# mysql -uroot -pnihao123!
mysql> grant replication slave on *.* to 'repl'@192.168.149.129 identified by 'nihao123!';
Query OK, 0 rows affected (0.01 sec)

replication  slave 指定權限,       

*.*  表示全部庫全部表:

repl@192.168.149.129: 指定用戶以及來源IP,指定all會很危險:

八、鎖定表,目的是不讓變繼續寫數據,由於一會從要同步數據,須要進行一個同步,讓二者的數據相同:

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.04 sec)

九、查看一下binlog文件的大小,並記住filename:

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| fenye520.000005 |     9946 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

十、退出數據庫,作了一個數據同步:

查看/data/mysql目錄,主上有哪些庫,一下子從上也要有這些庫,主從同步,就是把這些庫同步到從上面:

[root@localhost_01 ~]# ls /data/mysql/
aria_log.00000001  fenye520.000001  fenye520.000004  FYKU            ib_logfile0        localhost_02.err   mysql               zrlog
aria_log_control   fenye520.000002  fenye520.000005  ib_buffer_pool  ib_logfile1        localhost_02.pid   performance_schema
auto.cnf           fenye520.000003  fenye520.index   ibdata1         localhost_002.err  multi-master.info  test

備份其餘的庫並查看全部的庫:     mysqldump   -uroot  -pnihao123!   test  > /tmp/test.sql

[root@localhost_01 ~]# mysqldump -uroot -pnihao123! test > /tmp/test.sql
Warning: Using a password on the command line interface can be insecure.
[root@localhost_01 ~]# ls /tmp/*.sql
/tmp/test.sql  /tmp/zrlog.sql

註釋:等一下子後要把/tmp/目錄下的*.sql的文件拷貝到從的上面:

由此主上操做完成,接下來操做從:

主從配置——從上操做:

1:安裝mysql:

2:查看/etc/my.cnf,配置server-id:            #無需配置binlog:

重啓啓動mysql:

把主上的zrlog庫同步到從上:能夠先在從上建立相應zrlog  FEKU庫,而後把主上/tmp/*.sql拷貝到主上,而後導入zrlog庫:

scp   192.168.149.130/tmp/*.sql    /tmp/

三、mysql  -uroot -pnihao123

 stop   slave;

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

start  slave;

最後去主上執行 unlock   tables;

主從配置---從上操做

一、修改/etc/my.cnf文件,定義server-id        #註釋:從上不須要定義binlog:

[root@localhost_02 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=129                #此處用IP地址定義的:

二、重啓啓動mysql服務:

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

而且再增長server-id後,對數據庫目錄/data/mysql沒有任何變化:

[root@localhost_02 ~]# ls /data/mysql/
auto.cnf  ibdata1  ib_logfile0  ib_logfile1  localhost_02.err  localhost_02.pid  mysql  performance_schema  test

3:而後把主機器上的.sql數據拷貝到從機器上,作一個數據恢復:   scp   192.168.149.130:/tmp/*.sql     /tmp/

[root@localhost_02 ~]# scp -P 52588 192.168.149.130:/tmp/*.sql  /tmp/
root@192.168.149.130's password: 
test.sql                                                                                           100% 1259   926.8KB/s   00:00    
zrlog.sql                                                                                          100% 7713   488.5KB/s   00:00    
[root@localhost_02 ~]# ls /tmp/*.sql
/tmp/test.sql  /tmp/zrlog.sql

4:在從數據庫上建立相應的庫:    zrlog     FYKU庫:

[root@localhost_02 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> create database zrlog;
Query OK, 1 row affected (0.00 sec)
mysql> create database FEKU;
Query OK, 1 row affected (0.00 sec)

5:而後對數據庫作個恢復:          mysql  -uroot   zrlog  <  /tmp/zrlog.sql

[root@localhost_02 ~]# mysql -uroot zrlog < /tmp/zrlog.sql 
[root@localhost_02 ~]# mysql -uroot FYKU < /tmp/zrlog.sql 
[root@localhost_02 ~]# mysql -uroot test < /tmp/test.sql

註釋;要保證兩邊的數據一致,查看兩個目錄的文件目錄是否相同:

開始實現主從:

6:登陸從機器,執行stop slave操做:

[root@localhost_02 ~]# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

7:在從機器配置同步的相關配置(主機名、用戶名、密碼、日記文件等):

 change  master to  master_host='192.168.149.130', master_user='repl', master_password='nihao123!',       master_log_file='fenye520.000005', master_log_pos=9946;

master_host=192.168.149.130:指定主機器host:

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

master_password='nihao123!':指定主機器密碼:

master_log_file='fenye520.000005':指定binlog文件名:

master_log_pos='9949':指定binlog文件大小:

master_port=' ':指定主機的端口,由於在生產環境中,不多有人會修改mysql的默認端口,此選項通常極少使用:

mysql> change master to master_host='192.168.149.130', master_user='repl', master_password='nihao123!', master_log_file='fenye520.000005', master_log_pos=9946;
Query OK, 0 rows affected, 2 warnings (0.06 sec)

8:開啓start  salve:

mysql> start  slave;
Query OK, 0 rows affected (0.01 sec)

最後須要解鎖主上的表(在mysql主上操做): unlock  table;

[root@localhost_01 ~]# mysql -uroot -pnihao123!
Warning: Using a password on the command line interface can be insecure.
mysql> unlock table;
Query OK, 0 rows affected (0.00 sec)

到這一步了,mysql主從就搭建完成:

註釋:能夠經過 從上show    slave  status\G 判斷主從是否配置成功:

注意: \G後面不須要加分號,\G自己就是結束符:

Slave_IO_Running: Yes 是否爲yes

Slave_SQL_Running: Yes 是否爲yes

註釋:有時可能防火牆或者SElinux會影響到此處這兩個選項:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.149.130
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: fenye520.000005
          Read_Master_Log_Pos: 9946
               Relay_Log_File: localhost_02-relay-bin.000002
                Relay_Log_Pos: 282
        Relay_Master_Log_File: fenye520.000005
             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: 9946
              Relay_Log_Space: 462
              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: 130
                  Master_UUID: 94f8afad-a54a-11e8-935c-000c2981f44b
             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: 
     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)

註釋:如何主從同步是否正常:

首先在從上執行登陸mysql,而後執行 show    slave  status\G

查看是否有:

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: 

幾個配置參數狀況以下:

主服務器:

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

註釋:進行從服務器的配置時儘可能使用參數「replicate_wild_」,使匹配更精確,提高使用性能

三、主從測試:

 一、主上操做:mysql  -uroot -pnihao123

 use  zrlog;

select count(*) from t1111;

truncate table db;

二、從上 mysql -uroot aming

select count(*) from t111;

主上繼續drop table t111;

從上查看tables表:

主上操做:進入到mysql,並查看有幾個表:   show   tables;

[root@localhost_01 ~]# mysql -uroot  -pnihao123!
Warning: Using a password on the command line interface can be insecure.
mysql> use zrlog
Database changed
mysql> show tables;
+-----------------+
| Tables_in_zrlog |
+-----------------+
| t1111           |
| t112312312      |
| t2222           |
| t3333           |
| t334tasgs       |
| t44444          |
+-----------------+
12 rows in set (0.00 sec)

主上操做:此時咱們在主上往t1111表裏插入一條數據:

mysql> insert into t1111 values(10);
Query OK, 1 row affected (0.00 sec)
mysql> select count(*) from t1111;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

從上操做:此時來從上zrlog庫裏t1111表查看,看到的內容是同樣的:

mysql> use zrlog;
mysql> select count(*) from t1111;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

註釋:truncate table t1111;   表示清空表的內容:

第二次操做:在主上刪除這個t1111表,而後在從上觀察:

主上操做:刪除t1111這個表:       drop   table   t1111;

mysql> drop table t1111;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_zrlog |
+-----------------+
| t112312312      |
| t2222           |
| t3333           |
| t334tasgs       |
| t44444          |
11 rows in set (0.00 sec)

從上操做:在從上查看:   show   table    t1111;

mysql> show tables;
+-----------------+
| Tables_in_zrlog |
+-----------------+
| t112312312      |
| t2222           |
| t3333           |
| t334tasgs       |
| t44444          |
11 rows in set (0.00 sec)

註釋:發現從上的表t1111也被刪除了:

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

這時在從機器上 stop  slave;

而後在start slave;

再來查看show slave status\G

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

如何從新作主從呢
在主機器的數據庫上 show mater status; 
查看文件大小:並記錄到那個position
而後在從機器上先stop slave;
而後直接change master to master_host='192.168.180.134', master_user='repl', master_password='123456', master_log_file='yueyong123.000001', master_log_pos=10470;

#僅僅只修改後面的master_log_pos='   ';這步就能夠了:

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

而後在從機器上 start slave;

再來查看 show slave status\G  看是否爲兩個Yes:

相關文章
相關標籤/搜索