#oracle #function #plsql #cluster-computing #oracleinternals
Вопрос:
В кластере Oracle (более одной машины, взаимодействующей для обслуживания одной базы данных) будет ли функция «sysdate» всегда возвращать согласованный ответ? Даже если часы операционной системы серверов сообщают о несогласованных значениях?
Комментарии:
1. Если бы sysdate был синхронизирован, какое время сервера он бы содержал?
Ответ №1:
SYSDATE связан с ОС узла; если бы он был гарантированно корректным во всем кластере, то узлы должны были бы синхронизироваться каждый раз, когда вы вызывали SYSDATE. В кластерной среде упорядоченные последовательности стоят дорого; лучше всего избегать, если это вообще возможно. Упорядоченная последовательность гарантирует вам уникальность и порядок — однако вы все равно можете получить пробелы, если обработка завершится неудачно после выбора из последовательности и до совершения транзакции.
Мы используем несколько обходных путей:
- Как правило, последовательности устанавливаются неупорядоченными с большими размерами кэша (25 000), чтобы уменьшить межкластерную связь.
- Используйте NTP для синхронизации узлов по времени (они все равно могут быть неверными, /-наносекунды, поэтому вы не можете полагаться на это).
- Для журналов стиля аудита мы используем метку времени (метка времени(6)) в качестве уникального идентификатора — и смиряемся с тем фактом, что возможно (хотя и крайне маловероятно), что журналы могут отображаться не по порядку (это также возможно при обычной обработке, в зависимости от того, когда происходят фиксации).
- Там, где требуется упорядоченная последовательность и могут быть пробелы — используйте упорядоченную последовательность (старайтесь избегать в кластерной среде, так как «кэш» не помогает).
- Там, где требуется упорядоченная последовательность — но не может быть пробелов, — у нас есть своя таблица последовательностей, мы блокируем запись, получаем номер, а затем сохраняем запись заблокированной до тех пор, пока пользователь не зафиксирует; это заставит всех остальных, пытающихся получить ту же последовательность, ждать, пока транзакция пользователя не будет полностью зафиксирована — избегайте этого, если это вообще возможно.
Ответ №2:
Я бы сильно заподозрил, что SYSDATE тоже связан с операционной системой. Будьте очень внимательны к причине, по которой вам нужно его использовать. Если у вас есть какая-либо логика, реализующая инкрементное отслеживание событий (например, вы выполняете инкрементный экспорт), и вы должны убедиться, что никакие элементы не пропущены, а также не дублируются, основывайте отслеживание на последовательных идентификаторах, а не на SYSDATE.
На самом деле, это верно даже для некластерных систем, так как SYSDATE иногда может изменяться (экономия времени, ошибки системного администратора…).
Ответ №3:
Используйте NTP для синхронизации времени на всех ваших серверах (Oracle и других) и убедитесь, что этого не произойдет. Несогласованные системные часы-это путь к катастрофе.
Я бы предположил, что sysdate вернет противоречивые результаты в описанном вами сценарии.
Комментарии:
1. Спасибо, Дмитрий, мне интересно, есть ли у человека, голосующего за вас, более твердое мнение о вашей догадке?
Ответ №4:
Я потратил (немного) времени на поиски ответа на этот вопрос, но не смог его найти, но, учитывая, что sysdate просто возвращает дату/время из операционной системы, я подозреваю, что Дмитрий прав.