# 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密码查看与修改