bash.im ithappens.me zadolba.li
3441

Минус на минус

Позвали меня как-то в одну контору перенести оракловый сервер на новое железо, так как старое начало подавать признаки скорой кончины. Задача знакомая: инсталлирую сервисы, настраиваю основные параметры, заливаю базу через импорт-экспорт. Запускаю для проверки пользовательское приложение, написанное кем-то неизвестным на коленке — ошибка, причём дурацкая: «Параметр не является датой». На старом сервере то же самое приложение запускается без проблем. Настройки сервера в порядке. Сравниваю содержимое таблиц — байт в байт. Серверы одинаковые, но на первом прога работает, а на втором — нет.

Воевал с ошибкой до утра. Под конец уже думал, что умом тронулся, ибо в природе такое просто невозможно... В конце концов, конечно, нашёл. Оказалось, что приложение было написано с ошибкой в тексте запроса, вследствие чего в оператор TO_DATE() мог попасть текст, действительно не являющийся датой. Проблема же эта нивелировалась другой ошибкой, но уже на стороне сервера: на нём с рождения ни разу не собирали статистику. В результате то самое кривое значение не попадало в оператор из-за кривого плана выполнения запроса. Настраивая же новый сервер, я машинально поставил сбор статистики на таймер — для Оракла это правильно. Умный оптимизатор сразу же поменял план запроса, и две ошибки перестали компенсировать друг друга.

В общем, уходил я из той конторы под утро злой, с одной мыслью: 99% айтишных проблем мы создаём себе сами, когда ленимся выполнить мелкие, но обязательные вещи.