В кластере Oracle sysdate всегда будет давать последовательный ответ?
В кластере Oracle (более одной машины, взаимодействующей для обслуживания одной базы данных) всегда ли функция "sysdate" будет возвращать согласованный ответ? Даже если часы операционной системы сервера сообщают о несовместимых значениях?
4 ответа
Я бы сильно подозревал, что SYSDATE также связан с ОС. Будьте очень внимательны к причине, по которой вам нужно его использовать. Если есть какая-либо логика, которая реализует пошаговое отслеживание событий (например, вы делаете пошаговый экспорт), и вы должны убедиться, что ни один элемент не пропущен, а также нет дублирования, основывайте отслеживание на последовательных идентификаторах, а не на SYSDATE.
На самом деле, это верно даже для некластерных систем, так как иногда SYSDATE может меняться (экономия времени, ошибки системного администратора...).
SYSDATE относится к узлу ОС; если он гарантированно корректен во всем кластере, то узлы будут синхронизироваться каждый раз, когда вы вызываете SYSDATE. В кластерной среде упорядоченные последовательности дороги; лучше избегать, если это вообще возможно. Упорядоченная последовательность гарантирует вам уникальность и порядок - однако вы все равно можете получить пробелы, если обработка не удалась после выбора из последовательности и до совершения транзакции.
Мы используем несколько обходных путей:
- Обычно последовательности устанавливаются неупорядоченными с большими размерами кэша (25 000), чтобы уменьшить межкластерную связь.
- Используйте NTP для временной синхронизации узлов (они все еще могут быть неверными,+/- наносекунды, поэтому вы не можете полагаться на это)
- Для журналов стилей аудита мы используем systimestamp (timestamp(6)) в качестве уникального идентификатора - и учитываем тот факт, что возможно (хотя и крайне маловероятно), что журналы могут появляться не в порядке (это также возможно при обычной обработке, в зависимости от того, когда происходят коммиты)
Там, где требуется упорядоченная последовательность, и могут быть пробелы - используйте упорядоченную последовательность (старайтесь избегать в кластерной среде, так как "кеш" не помогает)
Там, где требуется упорядоченная последовательность, но не может быть пробелов, у нас есть собственная таблица последовательностей, блокировка записи, получение номера и сохранение записи до тех пор, пока пользователь не выполнит фиксацию; это заставит всех остальных пытаться заставить ту же самую последовательность ждать, пока пользовательская транзакция не будет полностью зафиксирована - избегайте этого, если это вообще возможно.
Используйте NTP для синхронизации времени на всех ваших серверах (Oracle и других) и убедитесь, что этого не произойдет. Несовместимые системные часы - рецепт катастрофы.
Я предполагаю, что sysdate выдаст противоречивые результаты в сценарии, который вы описываете.
Я потратил (немного) времени на поиск ответа на этот вопрос, но не смог его найти, но, учитывая, что sysdate просто возвращает дату / время из операционной системы, я подозреваю, что dmitriy правильный.