У меня есть реплицированная пара мастер-мастер Mysql. (Я держу второй в режиме только для чтения, чтобы избежать конфликтов индексов.)
В моей основной БД я получаю это сообщение в журнале ошибок:
Инструкция небезопасна, так как использует системную функцию, которая может возвращать другое значение на подчиненном устройстве. Оператор: INSERT INTO field_data (fields_id,records_id,enc_data,field_units_type_key) ЗНАЧЕНИЯ ('26','1753149',AES_ENCRYPT('COVID',UNHEX(SHA2('17531491796432333532720#',256))),'NULL')
Зависит ли AES_ENCRYPT или SHA2 от времени? Почему эта вставка на реплицированном сервере не сохраняет точно такие же данные?
Это задокументированное поведение для AES_ENCRYPT начиная с MySQL 5.6.17:
Начиная с MySQL 5.6.17, операторы, использующие AES_ENCRYPT() или AES_DECRYPT(), небезопасны для репликации на основе операторов и не могут храниться в кэше запросов.
Это не из-за зависимости от времени, а потому, что поведение зависит от недавно введенной системной переменной block_encryption_mode:
Эта переменная управляет режимом блочного шифрования для блочных алгоритмов, таких как AES. Это влияет на шифрование для AES_ENCRYPT() и AES_DECRYPT().
Если этот параметр отличается на ваших серверах, ваш запрос будет вставлять другие данные. Хотя, если не отличается, то все в порядке. Но поскольку это ваша обязанность, вы получаете предупреждение о том, что репликация (на основе операторов) не может этого обеспечить.