20.8.21

Повреждено - значит уничтожено

 Опять я про ремонт. Никак люди с битыми базами не могут понять, что "починить базу данных" - это не восстановить абсолютно всё. Это привести ее в рабочее состояние, не более того (а рабочее состояние - это прохождение штатных backup/restore).

Но те данные (записи), которые были повреждены - их восстановить невозможно, никак, абсолютно.
Например, у вас есть 5 печатных листов текста. И один лист потеряли (сгорел, в шреддере, и т.д.). Как вы "почините" потерянный лист? Ага, только набив этот текст заново! Причем, его же надо еще как-то помнить. А если не помните, то всё.

Тем не менее, в базах данных потерянную информацию восстановить можно, но косвенными способами (на всякий случай - мы таким не занимаемся, потому что не лезем в прикладную область).

Допустим, есть справочник компаний CLIENTS, и таблица заказов ORDERS. Если повреждена ORDERS, то можно перевбить пропавшие записи с бумажных или ЭДО документов.
А если повредилась таблица CLIENTS? Тут хуже. Потому что backup пройдет, а restore - нет. Т.е. restore пройдет, но при активации индекса по столбцу связи выдаст ошибку (что отсутствуют записи в CLIENTS, на которые есть ссылающиеся записи в ORDERS), индекс не будет построен, ограничение целостности не будет работать, и будут тормоза с запросами, которые использовали такой индекс раньше.

Как это победить? Для начала, нужно найти потерянные в CLIENTS записи. Например
SELECT C.ID, O.CL_ID, <другие нужные столбцы>
FROM ORDERS O LEFT JOIN CLIENTS C
ON O.CL_ID = C.ID
WHERE C.ID IS NULL

То есть - нам нужно вытащить ВСЕ записи из таблицы ORDERS, т.к. там есть заказы, для которых клиенты потеряны. И потом оставить только те, которых не нашлось в CLIENTS - WHERE C.ID IS NULL.
Поскольку индекс по FK (ORDERS.CL_ID) активирован быть не может, для ускорения можно создать просто индекс по этому столбцу вручную. А затем уже выполнить запрос.
В противном случае на больших объемах данных запрос будет выполняться крайне долго.

Что дальше? Дальше мы можем вручную создать недостающие записи в CLIENTS, с минимумом информации - достаточно заполнить только ID и те столбцы, которые not null. Правда, если записей больше 10-20, то вручную это делать уже проблематично, и придется как-то автоматизировать.
Например, вместо SELECT C.ID, O.CL_ID в запросе выше написать
SELECT 'INSERT INTO ORDERS (ID) VALUES ('||O.CL_ID||');'

Добавили записи, убрали лишний индекс по CL_ID, активировали индекс по FK (напомню, это просто - ALTER INDEX indexname ACTIVE). И дальше уже можно по печатным или ЭДО документам заполнять информацию по клиентам.

Долго, нудно? Да! Надо было чаще бэкапы делать.

23.10.20

Вы пока базу поремонтируйте, а мы с ней поработаем

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

Ну и, останавливать работу нельзя, поврежденная часть вроде бы не каждодневно используется, можно потерпеть, пока нам "базу отремонтируют".

Но увы, нет. Редко какая база (в смысле разработки и предметной области) позволяет "склеить" базу из двух - починенной и "рабочей". Можно даже сказать, что вообще никакая.

Теоретически "склеить" две БД в одну могут разработчики этой базы. То есть, для этого надо точно знать структуру БД, взаимодействие таблиц (в том числе поврежденных), и как надо производить это самое "склеивание".
Но как показывает практика, разработчикам такими вещами вообще неинтересно заниматься. Ну разве что если только они эксплуатируют свою же собственную разработку. А если это тиражируемое решение - нет, мне подобные энтузиасты не попадались.

Так что, единственный вариант ремонта:

- останавливаем работу
- передаем базу в ремонт
- сидим ждем, пока починят
- получаем отремонтированное, продолжаем работать.

И тут, конечно, засада в том, что длительность ремонта неизвестна. Поэтому что?
Да, надо чаще делать бэкапы! :-) Вполне вероятно, что восстановиться из вчерашнего бэкапа и перевбить данные за день будет гораздо дешевле, чем тупо сидеть пару дней, пока базу починят (еще и с неизвестным результатом).

7.8.20

- А вы базы чините? - Ага...

 Да, с 2002 года у нас есть услуга платного ремонта баз данных СУБД Firebird и InterBase. В процессе ручного ремонта для облегчения наших усилий мы выпустили утилиту для ремонта этих БД, под названием FirstAid (для России и для всего мира). И она чинит примерно 70% наиболее частых повреждений (Direct). А если не чинит, то даже при самых сильных повреждениях можно экспортировать уцелевшее содержимое БД в новую БД (Extract).

Как и что делать, можно прочитать в документации (см. раздел documentation, слева). Также есть общее описание типов повреждений БД, и что можно сделать в этом случае штатными средствами Firebird и InterBase.

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

- здравствуйте! а вы базы чините?
- да, чиним
- ок, хорошо

Никакой более ценной информации из этого разговора практически никогда нельзя извлечь.

Всё равно требуется письмо на support@ibase.ru (или support@ib-aid.com), где будет перечислено:

- что за ошибка при соединении с БД, примерно в результате какого события она произошла
- размер базы данных, ОС, версия Firebird или InterBase
- лог диагностики из FirstAid (это бесплатно)

Если нам что-то будет неясно, мы уточним технические вопросы опять же, по email.

В общем, я думаю, вы поняли. Что звонить нам не надо. Да, мы чиним базы Firebird и InterBase. Точно. Конечно, можно и позвонить. Но вы ведь уже прочитали этот пост.



5.5.20

SMR и кое-что еще

Наверное, уже все (кому интересно) в курсе про скандал со спецификой записи на некоторых моделях жестких дисков. Эта специфика называется SMR.
Вот отличный пост на хабре, где объясняется проблема и приведен перечень дисков, где реализована данная технология:
https://habr.com/ru/post/500214/

Цитата:
"SMR хорошо подходит для обеспечения большой емкости по невысокой цене, когда число операций записи мало, а чтения — велико."
То есть, для баз данных даже со средней интенсивностью записи диски с такой технологией не подходят. И еще они не только сбоят в raid, но и могут давать невосстановимые ошибки.


Так что, рекомендую прочитать статью, а также изучить комментарии. Там я нашел несколько интересных моментов:
https://habr.com/ru/post/500214/#comment_21571374
"У меня лежит ящик разных SSD, которые после ремонта живут без проблем, пока не отрубишь им питание на две недели. После чего файлы уже не прочитать, или ссд вообще не включится. Память «стекает», это нормально, и чем больше износ, тем быстрее. Вендоры гарантируют сохранность данных в 3 месяца (Для TLC). Гуглите даташиты на энтерпрайз ссд, где информация более честная, чем в потребительском сегменте. PS: да, и регулярно на рекавери тащат флешки USB, с которых файлики полутора-двугодичной давности не читаются совсем, годовалые — с большим трудом, свежие — норм. Флешки разносольного качества, как ни странно — много оригинальных кингстонов".

и дальше в этой же ветке комментов:
"MicroSD и USB флешки не занимаются Self Refresh, поэтому их от потери данных не спасет постоянное нахождение под питанием. Большое количество недорогих SSD на Phison — я точно знаю что тоже не рефрешат себя."

Понятно, что обо всём этом можно было догадываться, но вот чтобы прямо явно сталкиваться - лучше не надо.

8.4.20

Вебинар по InterBase 2020

Завтра (9 апреля 2020) будет вебинар по InterBase 2020 с Embarcadero.
Расскажу про все интересные фичи, зачем, как использовать, и т.д.

upd: запись доступна тут
https://www.youtube.com/watch?v=I7Y920kSgKQ&feature=youtu.be

10.9.18

gbak -b -e. Сжимать или не сжимать?

При бэкапе (gbak -b) данные по умолчанию сжимаются. Что там за сжатие, я понятия не имею (надо спросить у разработчиков). Но у gbak есть опция -e, которая это сжатие отключает.

Решил проверить, как это повлияет, и имеет ли смысл.

Взял базу TPCR размером 30 гигабайт, Firebird 3.0.3, и сделал несколько раз бэкап на другой диск.
Результат - с опцией -e быстрее на 7.5-7.9%. На 18-ти минутах это 1 минута.
Если же база гораздо больше, и бэкап идет, например 10 часов, экономия бы получилась примерно 46 минут. На 10-ти часах это имеет смысл, а вот если бэкап идет часа 2, не больше, то тогда разница не так существенна.

Другое дело, что обычный бэкап этой базы занимает 21 гигабайт. А вот с опцией -e - 34 гигабайта! На 30% больше обычного бэкапа, и на 10% больше базы (в которой еще и индексы есть).

Так что, небольшая выгода по времени оборачивается серьёзным проигрышем в размере.
Решайте сами, надо оно (-e) вам, или нет.

17.1.17

Особенности ремонта баз без бэкапов

При ремонте баз данных периодически сталкиваемся с полным отсутствием бэкапов или копий БД. Если в этом случае в базе повреждены метаданные, то восстановить уже практически ничего нельзя, даже при помощи FirstAid Extractor.

Почему?
Firebird и InterBase, как и любые другие СУБД, используют т.н. "словарь метаданных". Т.е. описания структуры таблиц хранятся в системных таблицах. Структура таблиц может меняться, при этом в системных таблицах появляется новый формат данных, и сами данные в базе хранятся как в старых, так и в новых форматах, одновременно.
Прикладные базы данных на Firebird и InterBase в этом случае "делятся" на три типа
  1. Метаданные не меняются. Как БД разработана, так она и работает годами, без изменений.
  2. Метаданные изредка обновляются, при обновлении версии программ и БД
  3. Метаданные меняются на ходу, т.к. пользователь через программу имеет возможность добавления или изменения столбцов у таблиц БД
Чем выше номер "типа", тем чаще требуется делать backup/restore или получать копию БД.
Если в базе повреждены метаданные, то FirstAid Extractor может использовать копию метаданных, чтобы вытащить максимум данных (одной из функций DataGuard является периодическое сохранение снимка метаданных в резервное хранилище).
Однако, если копия метаданных устарела, а описание форматов в БД повреждено, FirstAid Extractor не может определить тип данных, и корректно извлечь данные из поврежденной БД.

Например, в таблицу добавлен столбец varchar(100). А копия метаданных есть только на момент до добавления этого столбца. При попытке вытащить данные Extractor-ом этого столбца в "выходной" таблице не будет.

Кроме того, если нет точной копии метаданных, результатом восстановления будет лишь набор таблиц, без индексов, процедур, триггеров и прочего. Такие восстановленные данные невозможно использовать с прикладной программой. Их можно использовать только для ввода в БД заново, вручную, и то, не всегда, особенно если "объект" в БД представляет собой данные в нескольких взаимосвязанных таблицах.

7.12.16

Жертвы тиража N 2

Продолжение темы в исходной "Жертвы тиража". Писал где-то в 2006-2007 году. Нашел как черновик, решил опубликовать, чего пропадать тексту :-)

http://www.osp.ru/os/2005/11/072.htm
7 проблем программной инженерии

середина 80-ых - нет документации (не в печатном виде), интернета, почты, форумов (!). Спросить не у кого. Программистов мало, квалификация повышается очень быстро. Малое число библиотек, но их высокое качество.
90-ые - появление ООП, неприятие, развитие настольных компьютеров, появление "персональных прикладных задач", рост числа программистов.
конец 90-х - инструментарий вроде Delphi и т.п. в массах. не напрягает изучением ООП, позволяет "рисовать" приложения.
параллельные foxpro, clipper, как контузия.
интернет - документация, форумы, компоненты, библиотеки - море.
книги - привести число по Delphi на интернет-магазинах.
books.ru - 184, Ozon - 212, bolero.ru - 204.
torry.ru,
форумы - sql.ru, delphiplus.org, мастера Delphi, королевство Delphi, codeby.net,
низкие зарплаты в регионах, отток разработчиков (нечего делать, кроме аутсоурсинга).
высокие зарплаты в мегаполисах, завышение резюме.

...
Инструментарий, вымывание кадров. ссылка на osp.ru, 11 номер от 2005 года.
...
энтузиазм, альтруизм, прагматизм, апатия. Еще в конце 90-ых годов прагматизм начал преодолевать энтузиазм и альтруизм. Безусловная смена работы максимум через 5 лет.
...
сложность найти студентов "на вырост". В любом случае, если "кадр" квалифицированный, дольше 2-3 лет он на фирме не задержится. Это срок реализации от начала до конца максимум двух-трех серьезных проектов. То есть, обучением новых кадров надо заниматься постоянно, понимая, что на длительный срок их удержать не получится (см. выше о прагматизме).
...
синдром рассеянного внимания. неспособность дочитать статью до конца. невнимательность, нежелание читать вообще (дети, рожденные в конце 80-начале 90).
изменения на генетическом уровне - шутка "ошибка в ДНК" становится реальностью.
http://offline.computerra.ru/2002/468/21520/
http://www.computerra.ru/think/239597/ ?
http://www.computerra.ru/features/243301/

и еще одна причина - демографическая.
http://www.gks.ru/free_doc/2005/b05_13/04-07.htm
Примерно в 2000 году я наткнулся на статью в Комсомолке по поводу призыва. Там говорилось, что при таком темпе снижения рождаемости в 2008 году будет в 3 раза меньше лиц призывного возраста, чем в 2000 году.
Посмотрите на график, он построен по цифрам в приведенной ссылке.
Не в 3, но в 2 раза это точно - сейчас молодых людей призывного возраста 12 миллионов человек, а через 5 лет их будет в 2 раза меньше. Я не стал рисовать весь график целиком, т.к. выше 40 лет люди программируют разве что для удовольствия, да и начиная с 25-29 уже переходят на "руководящие должности". То есть весь цвет программирования - это с 19 до 35 лет. Начиная с возраста в 20 лет идет "убыль" населения - смертность по разнообразным причинам. То есть, квалифицированные кадры или вымирают, или уходят на более высокие должности, а на их место приходят... кто?

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

13.9.16

Век живи, век учись

Если при restore бэкапа InterBase gbak вам выдает ошибку
decompression length error
то скорее всего бэкап был сделан другой (предыдущей) версией gbak (или InterBase).
В этом случае или надо взять gbak.exe от нужной версии, или сделать бэкап повторно с указанием опции -expand.

Получается, что у InterBase опцию -expand желательно указывать при бэкапе? И у Firebird?

7.6.16

Непонятно что

Уже который раз встречаю написание опций gbak (Firebird, InterBase) не думая.
Пишут,
gbak -c -r ...

определитесь, или -c или -r. В документации написано ИЛИ! -c | -r. И -r это не restore, а REPLACE!
Слава богу, в Firebird 1.5 опцию -r запретили, потому что этой опцией убивали файл оригинальной БД. Теперь надо писать или -rep, или -r o. Тем не менее, обе эти опции нафиг не нужны, потому что -c хватает на все случаи жизни. И даже если вы пишете скрипт, сначала переименуйте оригинальную БД, а потом уже делайте рестор из бэкапа с опцией -c. Если что-то случилось, то оригинальная база останется целой.

gbak -t ...

опция -t - включена по умолчанию. Transportable backup. Не надо ее указывать.

gbak -c ... -page_size ...

не надо это вставлять в регулярный скрипт. Изменение размера страницы производится ОДИН РАЗ, административно, по осознанно выбранным причинам. Если у вас эта опция забита в скрипт, и там написано 4096, то после изменения размера страницы на 8192 вы при очередном автоматическом restore опять получите базу с размером страницы 4096.

gbak -b ... -ig ...

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

В общем, читайте www.ibase.ru/gbak/ - тут про опции все написано корректно.

19.2.14

Шифрование баз данных в InterBase

Наконец-то дописал статью про шифрование баз.

http://www.ibase.ru/devinfo/ib-encrypt.htm

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

17.2.14

Android, Delphi, и ... где моя база?

Еще в сентябре 2013 года, на презентации RAD Studio XE5 я докладывал про IBLite, как с ним работать на мобильных устройствах.
http://www.youtube.com/watch?v=YMs1buTLI1Y
Однако сразу же возник вопрос - где находится база данных на смартфоне, как ее "вытащить", обновить, и так далее. Покопавшись в разных местах, ясного ответа не нашел, а экспериментировать вслепую, или перечитывать тонны абстрактной документации по Андроиду, не хотелось.

И вот, к счастью, нашелся человек, который просто и понятно объяснил, где что и как:

Рекомендую блог Андрея Ефимова, особенно статьи:

Deployment Manager или куда ещё можно задеплоить файлы

Получаем список доступных устройств хранения информации
(должна быть правка под мою Sony Xperia V)

Обновляем файл базы данных без перезапуска приложения
(тут про SQLite, но можно легко переделать и на IBLite)

Собственно, эти статьи, и тестирование кода явились как бы хорошим пинком в правильном направлении, в результате которого я форсирую проведение экспериментов в этой области. Что выйдет быстрее - вебинар с Embarcadero или статья в блоге, пока не знаю. Ждите новостей.

3.9.13

InterBase на мобилах

InterBase явно опережает Firebird в захвате рынка мобильных платформ. Вместе с Delphi XE4 разработчики получили возможность использовать InterBase (в варианте IBLite) на iOs, а для Android уже есть IBLite в редистрибутивах бета-версии Delphi XE5 (которая выйдет в начале сентября).

Вот пример приложения, работающего с IBLite на iOs и Android:
http://blogs.embarcadero.com/sarinadupont/2013/08/26/cooking-with-interbase-on-android-and-ios/

Я пока еще IBLite для Android не прикрутил, но сделаю это в ближайшие пару дней.

Здесь можно посмотреть технические спецификации IBLite и IBToGo. Напомню, что обе эти варианта InterBase являются встраиваемыми (embedded), т.е. являются подключаемой к приложению библиотекой, и одновременно выполняют как функции локального сервера, так и могут работать с удаленным сервером InterBase в качестве клиентской части.

p.s. у Firebird для мобильных устройств пока есть только клиентская часть в виде драйвера JayBird, и то в варианте, подкрученном одним энтузиастом.

20.5.13

Внезапный direct I/O

На этот пост спровоцировало разбирательство на sql.ru. Там много страниц, можно не читать, здесь я обобщу полученный опыт.

Итак, СУБД Firebird и InterBase обычно используют файловый кэш при работе с БД. Вернее сказать, не "используют кэш", а при открытии файла БД указывают опции, которые включают или выключают этот кэш в определенных случаях.
Одновременно, они используют свой собственный кэш страниц БД.

Самый первый и известный случай изменения режима , это режим Forced Writes, т.е. в терминах CreateFile (Windows) включение (ON) или выключение (OFF) флага FILE_FLAG_WRITE_THROUGH. При ON операционная система осуществляет запись сразу на диск (или в контроллер raid, и т.д.). При OFF операционная система кэширует изменяемые страницы в RAM (подробнее о режимах кэша Windows).
Однако, у Firebird и InterBase существует понятие careful writes, когда изменяемые страницы записываются на диск в таком порядке, чтобы в случае внезапного сбоя (например, reset) база данных осталась максимально целой. Поскольку при OFF (включенном write cache ОС) порядок записи определяется операционной системой, а не СУБД, в случае reset БД может оказаться, скажем, в "физически нецелостном" состоянии.

Например, если добавляется новая запись, а места на страницах БД для этого нет, то создается новая страница, запись размещается на ней, затем ссылка на страницу добавляется в Pointer pages таблицы, после чего в соответствующую inventory pages для новой страницы заносится флаг "занято".
Если все это попадает в кэш ОС, то страница inventory pages может попасть на диск раньше новой страницы с записью, в результате чего при reset окажется, что страница как бы занята, и таблица ссылается на нее, а на деле в этой странице мусор (еще ничего не записано).

Что интересно, до определенного момента в Firebird на Linux режим Forced Writes = ON не поддерживался, т.е. всегда было OFF (исправлено в FB 2.1)

Вторым из режимов кэша, или режимов открытия файлов, является флаг FILE_FLAG_NO_BUFFERING (Windows), который выключает кэш ОС для этого файла вообще, т.е. в том числе и на чтение.
Мы давно экспериментировали с этим флагом в Yaffil, и выяснили, что на обычных дисках производительность резко просаживается (у IB и FB, да и у Yaffil, собственный кэш не умеет делать prefetch, в отличие от ОС), а также, что худший вариант - когда размер страницы не совпадает с размером кластера файловой системы.
В общем, по результатам теста этот флаг было решено оставить в покое.

Со временем кэш дисков, контроллеров и вообще систем хранения сильно вырос, и стал достаточно умным. Так что на некоторых устройствах есть смысл во включении Direct I/O.
Для InterBase возможность отключить кэш ОС была введена в версии XE.
В Firebird такая возможность появилась в 2.5. Для всех баз на сервере direct I/O можно включить путем установки опции FileSystemCacheThreshold=0 в firebird.conf.
Что интересно, режим direct I/O включается не только этим нулем, а и в том случае, если указанный размер кэша БД (DefaultDBCachePages в firebird.conf или page buffers в конкретной БД) больше, чем FileSystemCacheThreshold.
То есть, поскольку FileSystemCacheThreshold по умолчанию 65536, то режим direct I/O включится, если размер кэша в конфиге или БД указан больше этого значения.

Попасть на эти грабли могут разве что пользователи Firebird с архитектурой SuperServer, потому что у Classic и SuperClassic раздельный кэш БД, и выставлять значения кэша больше 65к страниц никому и в голову не придет - сервер тут же начнет отжирать память. Например, для страницы 8к 65к страниц кэша станут 512 мегабайтами RAM, потребляемыми на каждого пользователя.

С другой стороны, у SuperServer кэш БД общий для всех пользователей, и поэтому вполне разумно указать его побольше, особенно если размер БД как минимум 1 гигабайт.
Но как только вы включите такой кэш, "внезапно" для БД отрубится файловый кэш операционной системы (если не изменить параметры по умолчанию в firebird.conf).

Хорошо это или плохо - нужно проверять в конкретном случае. Ваша дисковая подсистема может оказаться настолько крутой, что отключение файлового кэша ОС для БД улучшит производительность, или, по крайней мере, освободит память ОС для других целей.
Но если нет - при задирании размера кэша БД вдруг может случиться и падение производительности.

Дополнения:
  • на Linux указанные режимы открытия файлов это O_SYNC и O_DIRECT.
  • после включения direct I/O режим Forced Writes уже не имеет значения (будет всегда ON)
  • в Firebird 2.5.2 исправлена еще одна проблема с кэшем Windows.

6.9.12

Delphi XE3 Professional и Client/Server

Перед выходом линейки XE3 продуктов Embarcadero (Delphi, C++Builder, RAD Studio), "в интернетах" произошел ужас - произошла утечка (намеренная ли нет, неизвестно) сведений, что новая лицензия для Professional не будет разрешать написание клиент-серверных приложений.

Разумеется, под "не будет разрешать" имеется в виду формальный запрет в лицензионном соглашении, потому что контролировать на уровне кода это никто не собирался, и сделать это достаточно проблематично.

Так вот, в блогах шли одинаковые сообщения о грядущем апокалипсисе, одно за другим. Ленты delphifeeds (что com, что ru) содержали по нескольку таких сообщений подряд. На форумах развернулись баталии с обвинением Embarcadero в чудовищной жадности.

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

К счастью, в момент выхода релиза XE3 было объявлено, что лицензионное соглашение в данном плане осталось как и прежним, и даже вывесили экземпляр на всеобщее обозрение. И все успокоились.

Однако, присмотревшись к лицензии, я обнаружил, что все-таки в Professional писать клиент-серверные программы запрещено. Правда, только в отношении dbExpress:

ADDITIONAL LICENSE TERMS APPLICABLE TO RAD STUDIO, DELPHI AND C++BUILDER, PROFESSIONAL AND PROFESSIONAL ACADEMIC EDITIONS 
In the event Licensee has obtained a RAD Studio, Delphi or C++Builder Professional, or Professional Academic product license then the following terms apply. 
Subject to the terms and conditions of this Agreement, Licensor grants to Licensee as the licensed user of the Product the limited right to use that portion of the Product identified as "dbExpress", in executable form only, to access a local database installed on the same machine as the Work.  Licensee may not use that portion of the Product identified as "dbExpress" in association with a database located on a different machine other than the machine on which the Works are installed.

Предчувствуя недоброе, я открыл license.rtf от Delphi 2007. Нет такого пункта. Открыл от Delphi 2010 - ЕСТЬ, причем слово в слово.
Delphi 2009 у меня нет, возможно этот пункт появился там - не знаю. Но оказывается, он кочует по лицензионным соглашениям уже несколько лет, как минимум 2.5-3 года.
При этом я знаю несколько компаний, которые покупали Professional 2010/XE/XE2 и используют dbExpress именно для клиент-серверных приложений...

17.6.12

Шифрование в InterBase - 2

Продолжаем. Я не случайно остановился после установки SEP, поскольку дальнейшие действия возможны в двух "опциях". InterBase поддерживает два алгоритма шифрования. DES и AES. DES можно использовать по умолчанию, в том числе в редакциях Trial и Developer, а вот AES можно включить только в полной (купленной) редакции. Впрочем, в использовании DES или AES нет никакой разницы, кроме, разумеется, факта, что AES является более сильным алгоритмом, и пришел на смену DES (для вскрытия которого несколько лет назад были даже созданы специализированные микросхемы). У DES длина ключа 56 байт, у AES - 128-256 байт.

Тем не менее, для проверки будет достаточно DES. Напомню, что шифровать можно как базу целиком, так и отдельные столбцы, поэтому я на всякий случай создам 3 разных ключа шифрования. Логинимся под SYSDSO, выполняем команды

CREATE ENCRYPTION db_des for DES 
CREATE ENCRYPTION kname_des for DES 
CREATE ENCRYPTION sname_des for DES

все созданные ключи хранятся в таблице RDB$ENCRYPTIONS. Вообще команда CREATE ENCRYPTION сложнее:

create encryption key-name [as default] [for {AES | DES}]
[with length number-ofbits [bits]]
[password {'user-password' | system encryption password}]
[init_vector {NULL | random}] [pad {NULL | random}]
[description ‘some user description’]

Length - можно использовать только для AES, указывая длину ключа 128, 192 или 256 бит. 128 по умолчанию для AES.
Password - только для ключей, которыми шифруют столбцы. Можно использовать для дополнительной аутентификации при расшифровке зашифрованных столбцов.
Init-vector - random включает Ciper Block Changing, при которой для одинаковых значений генерируется разный зашифрованный текст. При null для этого используется Electronic Codebook (в DataDef.pdf на странице 214 это указано как Electronic Cookbook). Null по умолчанию.
Pad - при random padding одинаковые значения могут давать разный результат шифрования. Null по умолчанию.

! включение init-vector random или pad random делают невозможным создание индекса по зашифрованному столбцу, при попытке проиндексировать такой столбец сервер выдаст ошибку. Нужно отметить, что и без init-vector и pad с поиском по индексированным зашифрованным столбцам не все хорошо, об этом будет дальше.

Чтобы пользователи могли зашифровать базу или столбцы, SYSDSO должен дать им гранты на использование ключей. Я даю гранты SYSDBA

GRANT ENCRYPT ON ENCRYPTION db_des to SYSDBA; 
GRANT ENCRYPT ON ENCRYPTION kname_des to SYSDBA; 
GRANT ENCRYPT ON ENCRYPTION sname_des to SYSDBA;

в этом месте я рекомендую сделать бэкап базы, а также отсоединиться от нее (и на всякий случай остановить сервис InterBase) и сделать копию файла. Далее мы будем шифровать базу и столбцы, и сравнивать результаты.

Продолжение следует.

9.6.12

Шифрование в InterBase - 1

1 - потому что предыдущая запись была о шифровании соединений в InterBase, а теперь речь пойдет о шифровании баз. О шифровании соединений, впрочем, говорить больше нечего, т.к. то же самое может быть выполнено другими средствами, совершенно не привязанными к InterBase. Например, аппаратное шифрование, программные средства вроде ZeBeDee, и т.п.

Сразу предупреждаю, что шифрование баз - сложная штука, и если кто-то думает, что можно было бы все это сделать тяп-ляп, то он ошибается.
Первым требованием перед включением шифрования БД является включение в базе Embedded User Authentification. Эта штука появилась еще в InterBase 7.5 в 2005 году, и позволяет проводить аутентификацию пользователей и SYSDBA через саму БД, а не через общий admin.ib для всех баз на сервере.
EUA является первым средством, которое позволяет защититься от "украли файл с базой", т.к. если пароль SYSDBA в базе будет не masterkey, то его придется или подбирать, или как-то хакать hex-editor-ом (не пробовал). Но, как минимум, это уже хоть какая-то защита от чайников.

Полностью и детально шифрование БД описано в документации на InterBase, в Data Definition Guide, Глава 13 (однако!), Encrypting Your Data. Это я к тому, что здесь, все же, идет концептуальное описание, без мелких деталей (иначе пришлось бы растянуть это минимум на 10 постов. Тем не менее, вы можете выполнять приводимое здесь по шагам, разве что с учетом того, что для продолжения вам придется остановиться в ожидании следующего поста :-)

Итак, берем какую-нибудь тестовую базу, которую не жалко в случае ошибки, и в случае чего можно удалить. База должна быть создана не менее чем в InterBase 2009, но эту версию уже можно считать устаревшей, поэтому я настаиваю на XE (для экспериментов можно взять Developer Edition, если ее у вас ее еще нет - выбираем InterBase XE (10.0.4.590) 32-bit Developer Edition - Windows,  English или InterBase XE (10.0.4.590) 64-bit Developer Edition - Windows, English). Иначе часть описываемых функций у вас может не заработать. Логинимся от SYSDBA, включаем в базе EUA, как это описано в статье.


ALTER DATABASE ADD ADMIN OPTION
Меняем пароль SYSDBA  
ALTER USER SYSDBA SET PASSWORD 'sss'

понятно, что sss и подобные тут просто для того, чтобы не замучил склероз. Предлагаю по мере выполнения действий записывать их в "блокнотик" с цитатами отсюда, или собственными комментариями - получилось, не получилось, и т.п.

Разлогиниваемся, проверяем - пароль masterkey больше не работает, используем sss - ок, подключились.

затем создаем пользователя SYSDSO (его может создать только SYSDBA или владелец БД)

CREATE USER SYSDSO SET PASSWORD 'ooo'

Этот пользователь является "ключником", и не может выполнять никакие другие функции, кроме:
  1. создания системного пароля шифрования (SEP)
  2. создания ключей шифрования
  3. выдачи прав другим пользователям на использование созданных ключей шифрования для шифрования базы данных или столбцов таблиц
Больше SYSDSO делать ничего не умеет, и не должен.

! При генерации System Encryption Password используется информация, специфичная для текущего компьютера. Поэтому, на этой машине далее при доступе к БД SEP не требуется (хотя такое требование можно включить), а при переносе БД на другой компьютер никто без указания пароля SEP залогиниться не сможет. Можно указывать пароль SEP в параметрах коннекта (isc_dbp_system_encrypt_password), но это доступно только компонентам прямого доступа. Либо, можно указать SEP в переменных среды ОС (переменная ISC_SYSTEM_ENCRYPT_PASSWORD). Лучше сделать так - SYSDSO должен залогиниться к базе используя свой пароль и SEP, и создать новый SEP. Новый SEP будет привязан уже к этому компьютеру, и остальным пользователям указывать его при коннекте не потребуется.

Разлогиниваемся, логинимся как SYSDSO, создаем SEP для базы

ALTER DATABASE SET SYSTEM ENCRYPTION PASSWORD 'aaa'

Если есть желание, чтобы даже сейчас, на этом компьютере, пользователям требовалось указывать при коннекте пароль SEP (если ваше приложение позволяет указывать этот пароль помимо обычного пароля. Если нет, они обломаются, и так лучше не делать), то к данной команде можно добавить в конце опцию EXTERNAL.

продолжение.

5.6.12

Кросс-платформа 2012

Отличная конференция была, все прошло замечательно. Правда, я прочитал какой-то бредовый доклад (с моей точки зрения), спутанный из-за предыдущего доклада Сергея Кузнецова.
В финале Embarcadero раздало какое-то чудовищное количество призов (флэшек, кружек, маек и т.п.) Раздача (розыгрыш по заполненным анкетам) заняла минут 30 минимум, в ускоренном темпе. Такое впечатление, что почти треть посетителей получили призы.
Человек 10 не получили призы, потому что ушли раньше.

24.5.12

Вебинар № 3 по InterBase

Завтра, 25 мая в 12:00 в рамках серии вебинаров Эмбаркадеро "Developer Direct: Демонстрации и обсуждения"
http://forms.embarcadero.com/forms/EM12Q2RUWebinarDeveloperDirect

опять я, про InterBase. Часть 3, Средства разработки и компоненты.

Welcome.

Запись предыдущего вебинара (о UDF) пока не выложена, будет скоро.

16.5.12

Шифрование в InterBase

Когда вышел InterBase 2009, я увидел в списке новых фич шифрование. Поскольку лично меня эта тема не затрагивает, я ознакомился с возможностями, и на этом все кончилось. Интересно, что даже разработчики, которых эта тема интересует, ее пропустили. Например, один из вопросов, присланный нам перед вебинаром по InterBase, проводимом 14 марта, был "как в InterBase с шифрованием". Простите, но на дворе уже давно XE (с конца 2010 года), а 2009-ая вышла в августе 2008 года.
В общем,  вместе с Embarcadero провели первый вебинар на тему InterBase, и в него вошел общий рассказ про возможности шифрования. Сейчас готовится второй вебинар, а там и третий, но мне кажется, что подробнее эту тему лучше раскрыть в блоге, поэтапно. Здесь и начнем.

Шифрование в InterBase существует в "трех частях"
  • шифрование соединения (Over-the-Wire, OTW)
  • шифрование БД (всей БД или отдельных столбцов таблиц)
  • шифрование бэкапов
Большинство, конечно, хочет просто "шифрования базы", чтобы ее не украли или чтобы не стащили информацию. Но к сожалению, опять же у большинства, представление о шифровании достаточно примитивное, и "зашифровать базу" это как бы как "зашифровать файл или архив". В реальности это не так, и требует определенных усилий по планированию и управлению.
Слова "а зачем оно нам такое, нам бы попроще" отметаются сразу, потому что простое шифрование так же просто вскрывается. В общем, давайте лучше посмотрим, как оно устроено.
Стандарты шифрования
Поддерживается DES (по умолчанию), и AES. DES можно использовать сразу, для AES нужно скачать бесплатную лицензию со своего аккаунта на Embarcadero (при условии, что InterBase куплен и зарегистрирован.

Шифрование соединения

Операционные системы клиента и сервера должны поддерживать SSL v3 и TLS v1. Сертификат и CA файлы должны быть сгенерированы заранее, быть в формате PEM, и размещены на компьютерах клиента (клиентский и публичный серверный ключ) и сервера (серверный ключ).
Строка коннекта при этом получается чудовищная (пример из OpGuide.pdf)
"localhost/gds_ssl?ssl=true?clientPassPhrase=clientkey?clientCertFile=c:\\InterBase\\client\\client.pem?serverPublicFile=c:\\InterBase\\client\\serverCAfile.pem??:c:/db/database.ib"

На сервере должен быть файл ibss.config, в котором прописываются параметры для серверной стороны, и если честно, все это настолько страшно, что я не хочу дальше это описывать, и предоставлю вам самостоятельно дочитать об этом в OpGuide.pdf - там приведен максимум информации, включая примеры настроек и конфигураций (без проверки клиента, с проверкой, и т.п.).

Главное, что шифрование коннекта есть, оно настраивается, но требует определенных усилий по его настройке. Собственно, безопасность через тяп-ляп не обеспечивается.

Вот о шифровании БД (всей или столбцов) я расскажу подробнее, но в следующем посте.