防止非复制写入MySQL从站?


13

为了性能,我们有一些MySQL数据库服务器设置了基于行的复制。该软件将写入主机,并从主机或从机读取数据。大部分情况下,一切工作都很好。

我的理解是,即使MySQL知道它是MySQL从站,也将允许对从站进行写操作。理想情况下,我想关闭此窗口,因此,即使有人编写了一些错误的代码以获取读取连接并执行UPDATE,它也会抛出错误,而不是将数据放在从属服务器上。

有没有办法在MySQL中做到这一点?显然,我们也希望通过我们的软件也无法做到这一点,但是就像我们服务器上的防火墙一样,我想尽可能地防御。

谢谢!

Answers:


13

read-only在my.cnf中启用该选项。也可以使用--read-onlymysqld 将其指定为命令行上的标志。


5
注意,这对于超级用户(即MySQL中的root用户)不起作用,因为它不服从只读。
vmfarms

5

作为设置的替代方法read_only=1(例如,当从属实例上有其他暂存器/报告/开发数据库时),有时我会剥夺所有用户到我要复制的数据库中除SELECT之外的所有特权。

也就是说,在主机上运行GRANT命令之后,我在从机上运行REVOKE命令。


2

MySQL 5.7.8开始,现在有一个super_read_only选项,它甚至可以阻止SUPER用户执行客户端更新。它不会破坏复制过程。与其他设置一样,可以设置:

  • 以命令行格式(--super_read_only=ON),
  • 作为my.cnf(super_read_only=1)中的变量,或者
  • 从客户端提示符(SET GLOBAL super_read_only = 1;)。

注意:

  • 启用super_read_only式地开启read_only
  • 禁用read_only隐含禁用super_read_only

一些警告:

  • 无论是read_onlysuper_read_only将防止临时表操作。
  • 它们不会阻止诸如ANALYZE TABLE和OPTIMIZE TABLE之类的元数据操作。
  • super_read_only报告了某些查询已启用的错误。

参考:https : //www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/


1

正如第一篇文章所暗示的那样,您必须具有权限。只读选项对于FYI超级用户不起作用,对于要防止写入的从属服务器,它也不是切实可行的解决方案。您需要防止具有用户/数据库/表权限的写操作。首先,复制用户仍然必须能够写入从属服务器,以使其与主服务器保持同步。更好的控制写操作的方法是,您需要撤销允许有问题的用户执行写操作(即插入,创建等)的选项,这些用户只应在从属设备上执行读操作。


0

仅将复制相关权限授予从属服务器上的用户。仍然存在root用户权限的问题,但是您可以删除对数据库服务器的远程root访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.