防止对 MySQL 从属进行非复制写入?

防止对 MySQL 从属进行非复制写入?

为了提高性能,我们设置了一些 MySQL 数据库服务器,并采用基于行的复制。软件向主服务器写入数据,并从主服务器或从服务器读取数据。大多数情况下,一切都运行良好。

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

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

谢谢!

答案1

启用read-onlymy.cnf 中的选项。它还可以使用 mysqld 在命令行上指定为标志--read-only

答案2

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

也就是说,运行授予在主机上执行命令,我运行撤销在从属设备上执行命令。

答案3

作为MySQL 5.7.8,现在有一个super_read_only选项,它可以阻止超级用户执行客户端更新。它不会中断复制过程。与其他设置一样,它可以设置:

  • 在命令行格式中(--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/

答案4

仅向从属服务器上的用户授予复制相关权限。您仍然有 root 用户权限的问题,但您可以删除对 DB 服务器的远程 root 访问权限。

相关内容