在设置了主/从数据库方案的 mysql 复制后,我注意到从数据库服务器不是只读的。当然,之后我在 /etc/my.cnf 文件中手动配置了它。
我只是无法理解:从属服务器始终以只读模式运行不是默认行为吗?或者它应该始终手动配置吗?
答案1
没有从属设备处于只读模式是很常见的。
事实上,如果您不亲自设置它,那么它就永远不会启用。
一个好问题是,你为什么实际上想要设置它......???
你是想保护错误吗?还是我的管理员用户犯的错误?还是应用程序?
考虑到许多管理员都以 root 身份使用 MySQL,这里的保护在哪里?
你不能像你想象的那样保护你的数据(因为所有东西都复制到了从属服务器中)
您是否知道任何具有超级权限的用户和复制线程都不遵守 read_only??
对用户和权限采取强有力的结构化方法是处理复制问题的正确方法,而不是在从属服务器上进行只读配置
以我的真实看法,它实际上并没有提供太多的保护...除了阻止一些用户写入之外没有任何用处..(在生产系统上 - 无论如何都不应该发生这种情况)
举个例子,在 Mysql-Multi-Master 中(read_only 由脚本设置),理论上这只是简单地决定哪个服务器是主-主配置中的“真正的主服务器”。
总而言之...忘记 read_only (它真的没有必要,而且可能不会保护你免受你想象的伤害)
答案2
不,这不是默认行为,是的,如果您希望从属服务器只读,则需要“手动”(或脚本)执行此操作。
这样做的原因主要是因为它就是这样开始的,而且从那以后就没有改变过。但是,有很多方法可以实现所需的行为,例如,如果您的从服务器有一些主服务器没有的表(如报告摘要表)。或者,如果您想运行 ALTER,您可以先在从服务器上运行它,进行故障转移,然后在主服务器上运行它,以免影响实时站点。
答案3
我认为只读模式只是针对每个用户,而不是针对从属的全局模式,因此请确保您没有复制用户(数据库“mysql”),并且如果需要,请创建仅具有 USAGE 授予选项的用户 - 这样这些用户就具有只读功能。
答案4
尽管我们的许多从属服务器都设置为 read_only,但其中也有少数没有。
在这些情况下,通常是因为我们在这些服务器上安装了其他开发/暂存器/报告数据库。在这些情况下,用户仅被授予对主数据库的 SELECT 权限,但被授予对辅助数据库的 SELECT/UPDATE 权限。
此外,如果使用多主复制,则默认让从属服务器为只读将是一个严重的问题。:)