- MySQL> set global read_only=1; #1 是只读, 0 是读写
- MySQL> show global variables like "%read_only%";
以下是相关说明:
1, 对于数据库读写状态, 主要靠 "read_only" 全局参数来设定;
2, 默认情况下, 数据库是用于读写操作的, 所以 read_only 参数也是 0 或 faluse 状态, 这时候不论是本地用户还是远程访问数据库的用户, 都可以进行读写操作;
3, 如需设置为只读状态, 将该 read_only 参数设置为 1 或 TRUE 状态, 但设置 read_only=1 状态有两个需要注意的地方:
1)read_only=1 只读模式, 不会影响 slave 同步复制的功能, 所以在 MySQL slave 库中设定了 read_only=1 后, 通过 show slave status\G , 命令查看 salve 状态, 可以看到 salve 仍然会读取 master 上的日志, 并且在 slave 库中应用日志, 保证主从数据库同步一致;
2)read_only=1 只读模式, 可以限定普通用户进行数据修改的操作, 但不会限定具有 super 权限的用户的数据修改操作; 在 MySQL 中设置 read_only=1 后, 普通的应用用户进行 insert,update,delete 等会产生数据变化的 DML 操作时, 都会报出数据库处于只读模式不能发生数据变化的错误, 但具有 super 权限的用户, 例如在本地或远程通过 root 用户登录到数据库, 还是可以进行数据变化的 DML 操作;
那么 super 用户怎么控制读写?
1, 为了确保所有用户, 包括具有 super 权限的用户也不能进行读写操作, 就需要执行给所有的表加读锁的命令 "flush tables with read lock;" 这样使用具有 super 权限的用户登录数据库, 想要发生数据变化的操作时, 也会提示表被锁定不能修改的报错.
1) 这样通过 设置 "read_only=1" 和 "flush tables with read lock;" 两条命令, 就可以确保数据库处于只读模式, 不会发生任何数据改变.
2) 但同时由于加表锁的命令对数据库表限定非常严格, 如果在 slave 从库上执行这个命令后, slave 库可以从 master 读取 binlog 日志, 但不能够应用日志, slave 库不能发生数据改变, 当然也不能够实现主从同步了, 这时如果使用 "unlock tables;" 解除全局的表读锁, slave 就会应用从 master 读取到的 binlog 日志, 继续保证主从库数据库一致同步.
2, 为了保证主从同步可以一直进行, 在 slave 库上要保证具有 super 权限的 root 等用户只能在本地登录, 不会发生数据变化, 其他远程连接的应用用户只按需分配为 select,insert,update,delete 等权限, 保证没有 super 权限, 则只需要将 salve 设定 "read_only=1" 模式, 即可保证主从同步, 又可以实现从库只读.
3, 设定 "read_only=1" 只读模式开启的解锁命令为设定 "read_only=0"; 设定全局锁 "flush tables with read lock;", 对应的解锁模式命令为:"unlock tables;".
4, 当然设定了 read_only=1 后, 所有的 select 查询操作都是可以正常进行的.
来源: http://www.bubuko.com/infodetail-3120068.html