为了提高性能,我们设置了一些 MySQL 数据库服务器,并采用基于行的复制。软件向主服务器写入数据,并从主服务器或从服务器读取数据。大多数情况下,一切都运行良好。
据我所知,MySQL 将允许对从属服务器进行写入,即使它知道它是 MySQL 从属服务器。理想情况下,我有点想关闭它,这样即使有人编写了一些获取读取连接并执行 的错误代码UPDATE
,它也会抛出错误,而不是将数据放在从属服务器上。
有没有办法在 MySQL 中实现这一点?显然,我们也希望通过软件来实现这一点,但就像我们服务器上的防火墙一样,我希望尽可能地防御。
谢谢!
答案1
启用read-only
my.cnf 中的选项。它还可以使用 mysqld 在命令行上指定为标志--read-only
。
答案2
答案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_only
都super_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 访问权限。