У нас есть некоторые серверы баз данных MySQL, настроенные с репликацией на основе строк для повышения производительности. Программное обеспечение записывает на ведущее устройство и читает либо с ведущего, либо с ведомого. По большей части все работает отлично.
Насколько я понимаю, MySQL разрешит запись на ведомое устройство, даже если оно знает, что это ведомое устройство MySQL. В идеале я бы хотел закрыть это, поэтому, даже если кто-то напишет какой-то плохой код, который получает соединение для чтения и выполняет UPDATE
, он выдаст ошибку, а не поместит данные на ведомое устройство.
Есть ли способ сделать это в MySQL? Очевидно, мы хотели бы сделать это невозможным и с помощью нашего программного обеспечения, но, как и брандмауэр на наших серверах, я хотел бы быть максимально защищенным.
Спасибо!
Включите read-only
вариант в my.cnf. Его также можно указать как флаг в командной строке, используя --read-only
с mysqld.
В качестве альтернативы настройке read_only=1
(например, когда на подчиненном экземпляре есть другие базы данных блокнота / отчетности / разработки), я иногда удаляю все привилегии, кроме SELECT, у всех пользователей в БД, которую я реплицирую.
То есть после запуска ГРАНТ на мастере, я запускаю ОТЗЫВ команда на ведомом.
По состоянию на MySQL 5.7.8, теперь есть super_read_only
опция, которая запрещает даже пользователям SUPER выполнять обновления клиента. Это не нарушает процесс репликации. Как и другие настройки, его можно установить:
--super_read_only=ON
),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
предотвратит операции с временными таблицами.super_read_only
включено не поступало.Ссылка: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/
Как подсказывает первый пост, вы делаете это с разрешениями. Параметр только для чтения не работает для суперпользователей в качестве FYI, и это также не совсем работоспособное решение для ведомого устройства, где вы хотите предотвратить запись. Вам нужно предотвратить запись с разрешениями пользователя / базы данных / таблицы. Во-первых, пользователь репликации по-прежнему должен иметь возможность писать на подчиненное устройство, чтобы поддерживать его синхронизацию с главным устройством. Лучший способ управлять записью - это отменить параметры, разрешающие запись (т.е. вставку, создание и т. Д.) Для данного пользователя, который должен выполнять только чтение на ведомом устройстве.
Предоставляйте права, связанные с репликацией, только пользователям на ведомом устройстве. У вас все еще есть проблема с правами пользователя root, но вы можете удалить удаленный доступ root к серверу БД.