Назад | Перейти на главную страницу

Предотвратить запись без репликации в подчиненное устройство MySQL?

У нас есть некоторые серверы баз данных 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),
  • как переменную в 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/

Как подсказывает первый пост, вы делаете это с разрешениями. Параметр только для чтения не работает для суперпользователей в качестве FYI, и это также не совсем работоспособное решение для ведомого устройства, где вы хотите предотвратить запись. Вам нужно предотвратить запись с разрешениями пользователя / базы данных / таблицы. Во-первых, пользователь репликации по-прежнему должен иметь возможность писать на подчиненное устройство, чтобы поддерживать его синхронизацию с главным устройством. Лучший способ управлять записью - это отменить параметры, разрешающие запись (т.е. вставку, создание и т. Д.) Для данного пользователя, который должен выполнять только чтение на ведомом устройстве.

Предоставляйте права, связанные с репликацией, только пользователям на ведомом устройстве. У вас все еще есть проблема с правами пользователя root, но вы можете удалить удаленный доступ root к серверу БД.