# MySQL主從復制讀寫分離授權方案及實踐
當配置好MySQL主從復制后,由于數據復制是單向的,**所有對數據庫的更新操作都必須在主服務器上進行**,只有在主庫上更新,才能避免用戶對主服務器上數據庫內容的更新與對從服務器上數據庫內容的更新一致,而不會發生沖突。
## MySQL復制環境用戶授權方案
### 生產授權方案1
*方案1、2對比推薦使用方案1,生產環境中推薦使用忽略授權表方式授權*
| 數據庫 |用戶名 | 密碼 | IP地址 | 端口 | 權限 |
| -- | -- | -- | -- | -- | -- |
| 主庫 | web | passwd | 192.168.0.12 | 3306 | `select` `insert` `delete` `update` |
| 從庫 | web | passwd | 192.168.0.13 | 3306 | `select` |
> **說明**:
> 從庫的用戶名和密碼:主庫的web用戶同步到從庫,然后通過`revoke`權限回收將`insert`,`delete`,`update`權限回收。
**主庫用戶授權示例:**
```
grant select,insert,update,delete on dbName.* to 'userName'@'localhost' identified by 'password';
```
> 提示:特殊的業務可能權限會比較多,如果業務安全性要求不高,也可以給與`all privileges`權限。
**從庫用戶授權示例:**
```
grant select,insert,update,delete on dbName.* to 'userName'@'localhost' identified by 'password';
```
> `revoke insert,update,delete on on dbName.* from 'userName'@'localhost';`
當然也可以不回收權限,通過配置文件在`[mysqld]`區域設置`read-only`或者在mysql啟動時指定`read-only`參數。修改完記得重啟服務
> **另外:**`read-only`參數可以讓**slave服務器只允許來自slave服務器線程或者具有super權限(即對用戶授權時不能指定有super或`all privileges`權限)的用戶更新**。
但可以確保**slave服務器不接受來自普通用戶的更新**,slave服務器啟動選項增加`--read-only`也是同樣的功能。
* * * * *
### 生產授權方案2
| 數據庫 |用戶名 | 密碼 | IP地址 | 端口 | 權限 |
| -- | -- | -- | -- | -- | -- |
| 主庫 | web_w | passwd | 192.168.0.12 | 3306 | `select` `insert` `delete` `update` |
| 從庫 | web_r | passwd | 192.168.0.13 | 3306 | `select` |
> **說明**:
> 在主庫授權web_w賬號、從庫授權web_r賬號對應權限權限;
> 對于開發而言,使用多套用戶名密碼不專業。
### 通過忽略授權表的方式防止數據寫入從庫的方法
在生產環境中,一般會**采取忽略授權表方式同步**,然后對從服務器(`slave`)上的用戶僅授權`select`讀權限。不同步`mysql`庫,這樣的話我們就保證了主庫和從庫相同的用戶可以授權不同的權限。在主從庫分別進行如下授權:
| 數據庫 |用戶名 | 密碼 | IP地址 | 端口 | 權限 |
| -- | -- | -- | -- | -- | -- |
| 主庫 | web | passwd | 192.168.0.12 | 3306 | `select` `insert` `delete` `update` |
| 從庫 | web | passwd | 192.168.0.13 | 3306 | `select` |
**忽略mysql庫和information_schema庫的主從同步參數**
缺陷:從庫切換主庫時,連接用戶權限問題。可以保留一個從庫專門準備接替主。
```
[mysqld]
binlog-do-db=dbName # 要同步的某個庫
replicate-ignore-db=mysql
binlog-ignore-db=mysql # 不同步的庫
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
```
>另外:忽略記錄binlog日志的參數binlog-ignore-db一般用于系統的庫和表。(修改完my.cnf后重啟服務)
## replication中忽略binlog數據量
**master端參數:**
> --binlog-do-db 二進制日志記錄的數據庫(多個數據庫用`,`分割)
> **--binlog-ignore-db** 二進制日志忽略的數據庫(多個數據庫用`,`分割)
**slave端參數:**
> `--replication-do-db` 設定需要復制的數據庫(多個數據庫用`,`分割)
> `--replication-ignore-db` 設定忽略復制的數據庫(多個數據庫用`,`分割)
> `--replocation-do-table` 設定需要復制的表(多個表用`,`分割)
> `--replication-ignore-table` 設定忽略復制的表(多個表用`,`分割)
> `--replication-wild-do-table`和`--replocation-do-table`功能一樣,但是可以加通配符。
> `--replication-wild-ignore-table`和`--replication-ignore-table`功能一樣,但是可以加通配符。
- 寫在前面
- MySQL的使用
- MySQL多表同時刪除方案
- MySQL跨表、多表更新SQL語句總結
- MySQL存儲引擎
- 安裝
- 常規方式編譯安裝MySQL
- 采用cmake方式編譯安裝MySQL
- 使用rpm包安裝MySQL
- 使用yum方式安裝MySQL
- 采用二進制方式免編譯安裝MySQL
- 多實例的安裝
- 什么是多實例
- 多實例的作用、問題以及應用場景
- 多實例安裝01【推薦】
- 多實例官方安裝方案02
- 啟動、用戶和權限管理
- 單實例MySQL的啟動和關閉的方法
- 設置及修改MySQL root用戶密碼
- 找回丟失的MySQL root用戶密碼
- 創建MySQL用戶及用戶權限管理
- 基礎命令的操作
- MySQL庫和表相關操作
- MySQL中的索引操作
- MySQL常用命令
- MySQL的錯誤代碼
- MySQL復習秘籍
- 備份與恢復
- 備份
- 恢復
- mysqlbinlog命令
- 服務日志
- 主從復制
- 主從復制部署配置問題匯總
- 主從復制讀寫分離
- 災難恢復
- 配置phpmyadmin連接多實例MySQL
- 其他相關
- Sphinx實驗
- 中文分詞技術
- MySQL語句大全
- 用戶創建、權限、刪除
- 數據庫與表顯示、創建、刪除
- 表復制及備份還原
- 數據庫表中數據操作
- 修改表的列與表名
- 修改表中的數據
- 查詢表
- 日志
- 批量修改Mysql表引擎為InnoDB的方法
- 數據庫抽象層 PDO
- PDO對象常用方法
- PDO 事務處理
- PDO 與 MySQLi 二者效率簡單比較
- 大小寫敏感性 lower_case_table_names
- CentOS7安裝MySQL5.7密碼查看與修改