Tuesday, May 19, 2009

еще немного в копилку о базах

как обычно, сегодня одна какашка в сторону oracle и луч поноса в сторону mysql.

oracle, как сурьезный движок баз данных, конечно же не имеет неявных секвенсоров (хотя, может и имеет, но я не знаю способа привязать секвенсор к полю кроме как через триггер). поэтому функция $dbh->last_insert_id вообще не имеет смысла. чтобы достать это самое значение для primary key, сгенерированное из некоего секвенсора, я должен детектить секвенсор и брать из него currval. жутковато, но работает.

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

вообще, oracle постепенно у меня в голове превращается в долбанутую, но вполне работоспособную систему.

теперь к mysql

BEWARE 5.1!

в какой–то момент mysql умудрился потерять администраторские права для рута. и это вылилось в поднятие еще одного mysql и переливание данных, создание заново всех пользователей. вообще как это можно сделать что–то такое, чтобы их потерять?

короче, я не знаю, как там будет дальше с mysql, но если он исчезнет, то я не расстроюсь. ну его нахуй в таком–то виде.

Wednesday, May 13, 2009

mymyки

все–таки, mysql — это даже не пиздец.

это пиздец–пиздец–пиздец.

команда mysqlcheck (5.1.31a) с опцией оптимизации таблиц убивает несколько полей из системных таблиц mysql. что порождает веcелые ошибки типа:


090514 3:21:50 [ERROR] Column count of mysql.db is wrong. Expected 22, found 20. The table is probably corrupted
090514 3:21:50 [ERROR] mysql.user has no `Event_priv` column at position 29
090514 3:21:50 [ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.


что перерастает в черепашьи скорости работы с базой.

вот мне на память:


alter table db add `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N';
alter table db add `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N';
alter table user add `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' after Create_user_priv;
alter table user add `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' after Event_priv;

oramac

вообще, история оракла на mac os x напоминает желанного, но нелюбимого ребенка. видимо когда–то, когда вышел mac os x, кто–то из менеджеров оракла сказал:

— а чё ваще! это же юникс, вон на нем уже кластера собирают, jre есть, давайте забацаем оракл под мак!

и программисты бацают оракл под мак PPC.

причем, сама база выпускается не в production, а так, для игр:

«This document accompanies Oracle9i Developer release 2 (9.2.0.1.0) for Mac
OS X. Its contents supplement or supersede information in the Oracle9i
documentation library.

This is a developer release. It is not intended to be used in a production
environment. You should try this software only in a test environment.»

выпустив oracle 10g под мак, про саму базу надолго забыли. только один раз обновили клиента. и вот, совсем недавно, появилось обновление самой базы: ее наконец умудрились собрать под x86_64.

естественно, люди из оракла живут в своей собственной вселенной. они ничего не знают ни про universal binary, ни про launchd, ни про пользовательский интерфейс mac os x.

ничего они не знают также и про то, что консольный клиент их базы мог бы поддерживать историю команд и про то, что perl driver for oracle тупо не собирается на маке без особого шаманства.

естественно, DBD::Oracle не смог поставиться сам. после небольшого шаманства с патчами таки его удалось собрать, но работать он от этого не стал — в rian.ru используются named sql placeholders, а они–то как раз и не завелись. несколько утренних упражнений с драйвером рассказали мне о том, что на линуксе bool это нифига не bool а char и, даже, возможно, int. а на маке совсем не так. ну ладно, патч отправил, у меня локально все заработало и даже в DBD::Oracle 1.23 включили мои изменения.

но вот какой вопрос не дает мне покоя: неужели никто до меня не использовал named placeholders в oracle через perl на mac os x? вообще, хоть кто–то работал с ораклом через perl?

Tuesday, May 12, 2009

nginx + rpaf

используя nginx в качестве frontend и apache2 в качестве backend, обнаружил, что у кучи говноскриптов на php отвалился определитель клиентского ip. mod_rpaf меня выручил, но собрать universal binary оказало не так просто.

вот solution — скачать, распаковать, запустить:

sudo apxs -Wl,-arch -Wl,i386 -Wl,-arch -Wl,ppc -Wc,-arch -Wc,ppc -Wc,-arch -Wc,i386 -Wl,-arch -Wl,x86_64 -Wl,-arch -Wl,ppc64 -Wc,-arch -Wc,ppc64 -Wc,-arch -Wc,x86_64 -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

oracle environment variables

вот никак не мог правильно подобрать выражение, чтобы правильно описать мою возню с oracle. накатило и я все понял; вот оно:

«чтобы спереди погладить, нужно сзади полизать»

пример:

установка переменной:

alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';

получение значения переменной:

select parameter, value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

касательно установки oracle server на mac os x:

вообще, оракл сервер весь из себя прикольный–прикольный. проще даже сказать, ебанутый на всю голову. вот, например, после установки, обнаруживается, что там внутри свой собственный jre и собственный perl 5.8.3 и еще много всего. зато старт–стоп скриптов отродясь не водится. «читайте пару лет документацию и вам откроется тайное знание написания старт–стоп скриптов». до кучи нужно сказать, что оракл сервер смог поставиться, но не смог запуститься.