## 主從介紹的原理分析應用場景
* 概念
主從同步使得數據可以從一個數據庫服務器復制到其他服務器上,在復制數據時,一個服務器充當主服務器(master),其余的服務器充當從服務器(slave)
* 主從同步應用場景
1. 做數據的熱備,作為后備數據庫,主數據庫服務器故障后,可以切換到從服務器繼續工作,避免數據丟失。
2. 架構的擴展。將工作負載分發到多個slave節點上,從而提高系統性能。在這個使用場景下,所有的寫(write)和更新(update)操作都在Master節點上完成;所有的讀(read)操作都在slave節點上完成。通過增加更多的slave節點,便能提高系統的讀取速度。
3. 數據分析。實時數據可以在Master節點上創建,而分析這些數據可以在slave節點上進行,并且不會對Master節點性能產生影響
##
## 準備
搭建兩臺mysql服務器,一臺作為主服務器,一臺作為從服務器,主服務器進行寫操作,從服務器進行讀取操作
* 關閉防火墻
```
systemctl stop firewalld
```
關閉selinux
```
vi /etc/selinux/config
SELINUX=disabled
```
##
* 修改主機名
> 方法1:修改hosts文件
```
vi /etc/hosts
47.111.252.189 master
```
`方法2:使用hostnamectl命令`
`[root@xlucas1 ~]# hostnamectl set-hostname master`
##
## master配置
* 修改配置文件
```
[mysqld]
server-id=158
#### ##開啟bin-log,默認是開啟的
log-bin=/www/server/data/mysql-bin
```
* 重啟mysql服務
* 分配用戶【允許從數據庫復制主數據庫】
```
grant replication slave on *.* to 'ganranchong'@'47.114.87.166' identified by '123456';
flush privileges;
```
* 顯示主數據庫配置信息 [記錄bin-log日志,以及位置]
```
show master status;
```
```
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000013 | 329 | | | |
+------------------+----------+--------------+------------------+-------------------+
```
##
## slave配置
* 修改配置文件 [主從服務器中的server-id]
```
[mysqld]
read-only=1
server-id=166
replicate-do-db=db
relay-log=mysql-relay-bin
```
* 重啟mysql服務
* 配置主數據信息[位置和bin-log文件在上面顯示主數據庫配置信息可見]
```
change master to master_host='47.111.252.189',master_user='ganranchong',master_password='123456',master_log_file='mysql-bin.000013',master_log_pos=329;
```
* 啟動slave
```
start slave;
```
*檢查從數據庫配置信息是否正常
```
show slave status\G
```

> 【結果】slave_IO_Running和slave_SQL_Runing 兩個進程正常則表示配置成功
##
## 總結
1. 配置之前做好數據庫的備份,然后進行數據初始化。
2. 從數據配置的只讀對超級用戶不起作用,仍然可以插入。為使主從數據同步一致,不應在從數據庫中插入數據,否則會造成數據沖突。
3. 如果是阿里云的服務器,要注意端口權限問題。
##
## 清除主從復制關系
mysql主從復制中,需要將主從復制關系清除,需要取消其從庫角色。這可通過執行RESET SLAVE ALL清除從庫的同步復制信息、包括連接信息和二進制文件名、位置。從庫上執行這個命令后,使用show slave status將不會有輸出。
reset slave是各版本Mysql都有的功能,在stop slave之后使用。主要做:
刪除master.info和relay-log.info文件;
刪除所有的relay log(包括還沒有應用完的日志),創建一個新的relay log文件;
從Mysql 5.5開始,多了一個all參數。如果不加all參數,那么所有的連接信息仍然保留在內存中,包括主庫地址、端口、用戶、密碼等。這樣可以直接運行start slave命令而不必重新輸入change master to命令,而運行show slave status也仍和沒有運行reset slave一樣,有正常的輸出。但如果加了all參數,那么這些內存中的數據也會被清除掉,運行show slave status就輸出為空了。
* 刪除從服務器數據庫配置
~~~
mysql>stop slave;
QueryOK, 0 rowsaffected (0,00 sec)
mysql>reset slave all;
QueryOK, 0 rowsaffected (0,04 sec)
mysql> show slave status\G
Emptyset (0,00 sec)
~~~
RESET SLAVE將使SLAVE忘記主從復制關系的位置信息。該語句將被用于干凈的啟動, 它刪除master.info文件和relay-log.info文件以及所有的relay log 文件并重新啟用一個新的relaylog文件。
使用場景:當原來的主從關系被破壞之后,從庫經過重新初始化后直接連接會報 ERROR 1201的錯誤,運行reset slave后,重新配置主從連接就可以了;
* 刪除主服務器
【一】RESET MASTER
功能說明:刪除所有的binglog日志文件,并將日志索引文件清空,重新開始所有新的日志文件。用于第一次進行搭建主從庫時,進行主庫binlog初始化工作;
~~~~~~
mysql> reset master;
Query OK, 0 rows affected (0.03 sec)
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
~~~~~~
顯示所有的binlog已經被刪除掉,且binlog從000001 開始記錄
【**注意**】:當數據庫要清理binlog文件的時候,可以通過操作系統進行刪除,也可以運行reset master進行刪除。**但是如果當前是主數據庫,且主從數據庫正常的時候,千萬不能用這種方式刪除**。