mysql 主從複製

MySQL主從複製

1、mysql主從複製

1.主從複製主庫的操做

1.主庫配置server_id
2.主庫開啓binlog
3.受權主從用戶
4.主庫查看binlog信息

2.主從複製從庫的操做

1.配置server_id,與主庫不一樣
2.先同步主庫數據
3.配置主從
	change master to
	master_host=172.16.1.51,
	master_user=rep,
	master_password=123,
	master_port=3306,
	master_log_file=mysql-bin.000001,
	master_log_pos=120;
4.開啓主從

3.主從複製圖解

4.文字描述

1.主庫配置server_id和binlog
2.主庫受權主從用戶
3.主庫查看binlog信息
4.從庫配置server_id,只要跟主庫不一樣就能夠(只作主從的狀況下)
5.從庫執行change master to語句
6.從庫開啓IO和sql線程(start slave)
7.從庫的IO線程會去鏈接主庫的dump線程,問問是否有比從庫中master.info記錄的更新的位置點
8.主庫dump線程被詢問,dump線程會去查詢binlog
9.dump線程會將查到的新數據從binlog中截取出來交給從庫的IO線程
10.IO線程拿到新的binlog數據,會將內容存儲到TCP/IP緩存中
11.TCP/IP緩存會返回給IO線程一個ACK
12.IO線程會更新master.info,將新的位置點更新到文件中,而後繼續去主庫獲取數據
13.SQL線程會去讀取relay-log.info中的位置點,去對比relay-log的數據,若是有比relay-log.info中的位置點新的數據,則取出並執行,若是沒有則不執行
14.SQL線程執行完操做,會將新的位置點更新到relay-log.info中

5.主從複製涉及到的文件

1)主庫

1.主庫的binlog:記錄的是數據庫的操做
2.dump線程:對比binlog,取出新binlog中的數據,並將數據給到IO線程

2)從庫

1.IO線程:鏈接主庫,接收主發送過來的新binlog數據
2.sql線程:執行relay-log中主庫傳過來的新數據
3.relay-log(中繼日誌):存儲全部主庫傳過來的新數據
4.master.info:記錄上一次請求到主庫返回的binlog信息,下一才從該位置點讀取對比數據
5.relay-log.info:記錄上一次sql線程執行到relay-log中的位置點,下一次從該位置點執行

二,主從複製的搭建

1.主庫操做

1)配置主庫

[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin

2)受權一個主從用戶

mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';

#grant replication slave 是一個全局受權,不能指定單個庫受權,若是想同步單個庫使用過濾複製

3)查看主庫的binlog信息

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

2.從庫操做

1)配置從庫

[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2

2)配置主從複製

change master to
master_host='172.16.1.51',
master_user='rep',
master_password='123',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=326;

3)開啓IO線程和sql線程

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

4)查看主從狀態

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 326
               Relay_Log_File: db02-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

3、主從複製故障

1.IO線程故障

#Slave_IO_Running: No 或者 Connecting

1.檢測網絡
[root@db02 ~]# ping 172.16.1.51

2.檢測端口
[root@db02 ~]# telnet 172.16.1.51 3306

3.防火牆是否開啓

4.主從的用戶名或者密碼錯誤
#測試使用主從用戶的用戶名和密碼鏈接主庫
[root@db02 ~]# mysql -urep -p123 -h172.16.1.51

5.反向解析
[root@db01 ~]# mysql -uroot -p123 -h172.16.1.51
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'db01' (using password: YES)
#解決
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
skip_name_resolve

2.sql線程故障

#Slave_SQL_Running: No 或者 Connecting

1.主庫有的數據,從庫沒有
2.從庫有的數據,主庫沒有
3.主庫數據與從庫不一致

1)解決辦法一:(不認)

1.中止主從複製
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

2.跳過一個錯誤
mysql> set GLOBAL sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

3.開啓主從
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

2)解決辦法二:

1.中止主從複製
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

2.清空主從複製的信息
mysql> reset slave all;
Query OK, 0 rows affected (0.00 sec)

3.同步主庫全部數據

4.從新配置主從複製

3.在數據庫運行過程當中添加從庫

1.準備從庫
2.主庫導出數據
	#打點備份不註釋
	[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=1 --single-transaction > /tmp/full.sql
	#打點備份註釋
	[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction > /tmp/full2.sql
	
3.將數據推送至從庫
	[root@db01 ~]# scp /tmp/full.sql 172.16.1.52:/tmp
	[root@db01 ~]# scp /tmp/full2.sql 172.16.1.53:/tmp

4.模擬運行的主庫數據寫入
	mysql> use master;
	mysql> insert test values(2),(3);
	mysql> insert test values(8),(9);

5.從庫導入數據
	[root@db02 ~]# mysql < /tmp/full.sql
	[root@db03 ~]# mysql < /tmp/full2.sql
	
6.查看主從的位置點
	[root@db01 ~]# less /tmp/full.sql
	CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=520;
	[root@db01 ~]# less /tmp/full2.sql
	-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=520;
	
7.從庫配置主從複製
    change master to
    master_host='172.16.1.51',
    master_user='rep',
    master_password='123',
    master_port=3306,
    master_log_file='mysql-bin.000008',
    master_log_pos=120;
相關文章
相關標籤/搜索