bash.im ithappens.me zadolba.li

Базы данных

1954

Критическая ошибка 5: Две кавычки

Факап, конечно, не такой страшный, как слетевшая с направляющих каретка или заваленный мусором кот, но тоже неприятный.

Был я айтишником в одном турагентстве. Как-то, шерстя базу данных, я нашёл информацию о ценах в отелях на ближайшие три года. Спрашиваю у генерального директора, как это так: то ли у нас ясновидец в штате появился, то ли отели по три года не меняют цены в условиях инфляции? Босс ответил, что данные туда попали по ошибке, и их надо удалить.

Всего один короткий запрос. Всего две забытые кавычки:

delete from prices where price_date>unix_timestamp(2009-12-31)

Сервер радостно подсчитал: 2009 – 12 – 31 = 1968. Как и было заказано, база данных грохнула цены на все даты позже 1968 секунд от начала юникс-эпохи (то есть после 0 часов 32 минут 42 секунд 1 января 1970 года). На тот момент не существовало не только самой фирмы, но даже и самого гендиректора.

В итоге все отели лишились всех цен. Вытаскивать в авральном режиме из бэкапов несколько сотен тысяч строк вручную было ой как весело...

1636

Обезьянья CMS

Говорят, что если усадить миллион обезьян за печатные машинки, то с ненулевой вероятностью одна из них наберет «Войну и мир». У одной обезьяны, похоже, получился CMS.

Отдел поддержки клиентских серверов датацентра. Приходит клиентское письмо с жалобой: «После обновлений базы товаров нашего интернет-магазина сайт перестаёт работать и вообще». Сайт вольготно размещён в одиночку на сервере с двухъядерным процессором и 2 ГБ памяти — проблем с производительностью быть не должно. Прошу пнуть нас именно в момент обновлений.

Дожидаюсь ответа «вот сейчас не работает!» Смотрю — на машине оба ядра под завязку нагрузил MySQL. Логинюсь в «мускуль», даю запрос show full processlist. Изумляюсь — терминал виснет наглухо. Передёрнув терминал и залогинившись обратно на машину, запускаю тот же запрос с выводом в файл. Смотрю в результаты: сервер отрабатывает два запроса общей длиной в 1,2 с копейками мегабайта.

Как выяснилось, чудо-фронтэнд магазина выгребал какие-то данные запросом вида «Select * from Таблица where productID='такой-то' and enabled=1 or productID='еще_какойто' and enabled=1 or...», и так до упора. Несчастный MySQL вдумчиво проверял каждую строку немаленькой таблицы на соответствие десяткам тысяч логических условий.

Клиенту отписал, приложив результаты show full processlist. Молчит уже сутки. Видимо, проникается идеей...

1607

Инфаркт сисадмина: краткое руководство

Сижу себе вечером дома, пересобираю компьютер, плавненько добираюсь до распределения информации на винчестеры, раздаю задания несчастному Акронису, запускаю его работать и иду на кухню пить чаёк.

Душевное равновесие начал нарушать мобильник. Заговорив голосом сменщика, он слёзно закричал о том, что всё пропало. После оказания скорой антисуицидальной помощи оказалось, что это криворукое тело по ошибке снесло всю базу данных фирмы. Хватаюсь за голову, но тут же успокаиваюсь: предвидя такой исход, я время от времени бэкаплю базу.

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

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

Только наутро отпоенному корвалолом и слегка выспавшемуся мне улыбнулась удача: бэкап нашелся и на флэшке в тридцать два гига, на которой я таскал его домой. С конторы, продавшей мне бесперебойник, я таки срубил «компенсацию ущерба», но вот к своим нервам я с тех пор отношусь очень бережно.

1517

Пейдж-даун

Десять часов я потратил на отладку скрипта, который по непонятным мне причинам обрывал обработку данных и добавление их в MySQL после тридцати первых записей.

Только под полночь я вспомнил, что phpMyAdmin по умолчанию выводит данные по тридцать строк и нужно просто перелистнуть на следующую страницу.

1454

DROP DATABASE

В то время, когда я только начинал работать с MySQL, стукнуло мне в голову подучиться слепой печати — благо топтал клавиатуру я к тому времени уже лет шесть и большинство клавиш находил на автомате, лишь иногда бросая короткий взгляд для уточнения расположения «крайних» букв вроде «й» и «ъ».

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

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

Возвращаюсь и вижу в консоли кучу ошибок по поводу дублирования данных. Стал разбираться. Просмотрел свой файл — опечаток вроде нет. Полез ковырять временную базу — в некоторых таблицах индекс не обновился. Снова лезу в свой файл, отыскиваю нужное место... и сползаю под стол от хохота. Торопливость, помноженная на несовершенство навыка скоропечатания, сыграла со мной злую шутку: вместо «UPDATE» я умудрился напечатать «UPADET». Хорошо, что мускуль не понимает транслита!

1418

Улыбайтесь — это всех раздражает

Работаю в компании, разрабатывающей ПО для восстановления баз данных. Запускали мы новый продукт. После очередной крупной сборки отослали копию московскому начальству — посмотреть и попробовать. Через пару часов приходит ответ:

Запустил программу. GUI простой и понятный, всё нормально. Взял три базы, попробовал восстановить. На двух программа просто завалилась, на третьей выдала message box с таким текстом (скриншот прилагаю):

Shit happens. Keep smiling!!!

Не знаю, что и думать...

В тот день разработчики надолго остались на работе.

1327

Планы на будущее

В начале двухтысячных админил я в ХХХ-банке. Среди прочих была у нас программа «Обменный пункт», знаменитая тем, что она никогда не ломалась. Программка была проста донельзя — оператор с утра вводил дату и курс, весь день продавал валюту, а вечером печатал отчет.

И вот однажды мне сообщают из дальнего обменника, что программа наконец сбойнула — они вводят правильный курс, но компьютер «продаёт по-вчерашнему». Беру машину, еду на точку, ввожу правильный курс — шестнадцать, что ли рублей — прога продает по 15,70. Смотрю базу — все записи нормальные, что сегодня, что вчера. Меняю экзешники и библиотеки — нет результата. Начинаю дебаггинг — дохлый номер, откуда-то из базы вырисовываются 15,70, хоть ты тресни.

Осеняет меня часа через три. Отсортировав базу по дате ввода, нахожу, что курс введён на 24 июля 2024 года. Программа честно выбирала запись с самой новой датой... Провожу допрос — никто не колется, оператор божится, что вводила всё верно.

Ещё несколько манипуляций с базой показали, что неправильный курс ввели аж три недели назад. Всё это время обменник работал по жёсткому курсу то в плюс, то в минус родному банку, и никто этого не заметил. Ох, и крику-то было!

1309

1С:Мошенничество

Дело было году в 96-м. Администрировал я тогда сеть одной торговой фирмочки. Обороты росли, потребовалась мощная база данных, и начальство нашло двух крутых специалистов, которые взялись разработать требуемый продукт. С утра на пороге появились эти корифеи и сходу обругали всю мою сеть: компьютеры не те, коаксиал (может, помнит кто?) проложен не по правилам, и так далее. Посетовали ещё немного на нашу техническую необеспеченность и взялись писать базу.

Проходит пара месяцев, вызывает меня директор и начинает осторожно выспрашивать, сколько получают в Москве программисты. Я, естественно, интересуюсь, в чём же дело. Выясняется, что крутые базописатели изначально запросили за работу $15000, но, получив эту сумму и немного поработав, потребовали еще $3000: «Работа мудрёная — добавить надо...» Начальство задумалось, но добавило.

Наконец, база была запущена в эксплуатацию, и немедленно полезли глюки и баги. Естественно, менеджеры начали звонить мне. Я пошел к начальству прояснять ситуацию:

— А почему нельзя обратиться к авторам базы?
— Они требуют $100 в час за поддержку.
— А вы в договоре прописали порядок проведения и оплаты пусконаладочных работ?
— Мы с ними договор не заключали.
— А где описание базы и инструкция по эксплуатации?
— Они ничего не оставили...

Тут грянула деноминация 1997 года — убирали лишние три нуля с денежных купюр. Естественно, потребовалось эти нули убрать во всей базе. Начальство звонит создателям — в квартире теперь живут другие люди, на призывы по пейджеру никто не отзывается, а сотовые телефоны тогда ещё были не в ходу.

Подоспел дефолт. Фирма обанкротилась, и модернизация базы потеряла актуальность. Через пару лет на одном из старых компьютеров я случайно обнаружил исходники знаменитой базы. К тому моменту я уже разбирался в этих вопросах гораздо лучше, и решил, наконец, посмотреть, на что потратили больше 18 килобаксов. Что же я обнаружил? Одну из первых версий 1С с незначительной правкой!

1292

Уникальное предложение

Работал в phpMyAdmin и одновременно с этим искал что-то в интернете. Выскочило всплывающее окошко с рекламой, которое я случайно закрыл двойным кликом.

На первый клик реклама закрылась, а вот на второй один из индексов в SQL-таблице стал уникальным. Я больше часа пытался понять, почему в админке сайта новые страницы не добавляются...