为了提高性能,我们有一些MySQL数据库服务器设置了基于行的复制。 软件写入主机,并从主机或从机读取。 一切都很好,大部分。
这是我的理解,MySQL将允许写入从属,即使它知道它是一个MySQL从属。 理想情况下,我想closures这个,所以即使有人写了一些错误的代码,得到一个读取连接,并执行UPDATE ,它会抛出一个错误,而不是把数据放在从属。
有没有办法在MySQL中做到这一点? 很显然,我们希望使我们的软件无法实现,但是就像我们服务器上的防火墙一样,我想尽可能防御。
谢谢!
在my.cnf中启用read-only选项。 它也可以在命令行中使用--read-only和mysqld指定为标志。
作为设置read_only=1的替代方法(例如,当从属实例上有其他暂存器/报告/开发数据库时),我有时会将除SELECT外的所有特权从所有用户剥离到正在复制的数据库。
也就是说,在主设备上运行GRANT命令之后,我在从设备上运行REVOKE命令。
正如第一篇文章所暗示的,你可以通过权限来完成。 只读选项对超级用户不起作用,它也不是一个真正的可行的解决scheme,你想防止写入的奴隶。 您需要防止用户/数据库/表权限写入。 首先,复制用户仍然必须能够写入从站,以保持与主站同步。 更好的方式来控制写入是你需要撤销选项,允许写入(即插入,创build等)的问题,应该做只读在奴隶的问题。
只给与从机上用户的复制权限。 您仍然存在root用户权限问题,但可以删除对数据库服务器的远程root访问权限。
从MySQL 5.7.8开始 ,现在有一个super_read_only选项,即使SUPER用户也不能执行客户端更新。 它不会中断复制过程。 与其他设置一样,可以设置:
--super_read_only=ON ), super_read_only=1 )中的一个variables,或者 SET GLOBAL super_read_only = 1; )。 注意:
super_read_only启用read_only read_only隐式禁用super_read_only 一些注意事项:
read_only和super_read_only都不会阻止对临时表的操作。 super_read_only特定查询的错误。 参考: https : //www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/