[СИ] Длина сектора диска
Язык СИ
ОС UNIX
База данных и транзакция.
Два вопроса.
Имеется файл строк, каждая строка это отдельная запись БД.
Нужно сделать транзакцию - изменить одну из этих строк.
При этом длина строки не меняется.
Должно выдерживать мягкий сбой (выключение питания).
Винт плохой и при сбое портит весь сектор (или иную минимальную порцию данных).
Значит я должен в журнале сохранить всё то, что может быть испорчено,
т. е. сектор (или секторы) содержащий эту строку.
Вопрос 1.
О длине сектора.
Как узнать длину сектора или иной порции данных,
которая может быть испорчена?
Вопрос 2.
Что если я буду для верности сохранять заведомо
большую порцию, а именнно 8 Кбайт, начало порции
кратно ей самой от начала файла.
Сработает ли такой подход?
встречный вопрос: почему бы не использовать журналируемую ФС или системы с избыточным хранением данных (RAID и т.п.)
Программа может работать на разных машинах
и не всегда есть возможность выбора.
А если такая возможность будет,
тогда в настройках программы можно уменьшить
страховочные действия. Сейчас хотелось бы
заложить побольше, чтоб могла надежно работать
где угодно.
RAID-1 решает проблему поломки всего или части диска,
(жесткий сбой), но как отработает отключение питания
полной уверенности нет.
тут есть один нюанс - концепция Цилиндр-Головка-Сектор (ЦГС) морально устарела. И представляет собой некие вымышленные цифры.
Т.е. размер сектора указанный на жёстком диске не соответсвует размеру элементарной порции данных на жёстком диске.
Я думаю тебе следует посмотреть в сторону современных СУБД, например, как Firebird решает подобные проблемы. По этому поводу в книге Хелен Бори написана целая глава.
Спасибо.
Не знаю как найти эту книгу.
Если можно приведите название книги,
хотя бы приблизительно .
И ещё.
Вы пишете
"размер сектора указанный на жёстком диске
не соответсвует размеру элементарной порции
данных на жёстком диске".
А вопрос 2 в начале темы не решит ли эту проблему?
Спасибо
да испорчена может быть хоть таблица разметки диска. сейчас у винтов есть ещё своё кэширование и множество прочих фич.
а насчёт такой дикой безопасности, да ещё и переносимости - существуют БД типа Оракла: они ставят свои дрова на низком уровне и там химичат нипадеццки, проверяя всё и вся на валидность и умея восстанавливаться при серьёзных сбоях. только стоит эта беда порядка 50 килобаксов за инсталляцию и эта цена отчасти оправдывает усилия, затраченные на её разработку. сделать подобие с нуля - это... как бы это сказать-то... в общем, можно начать, потомки допишут
Спасибо за отклик.
Что касается других повреждений
разметки диска
порча каталогов
поломка диска
Знаю только одно средство: резервная копия.
На подступе к этому вопросу предчувствую
проблему своевременного выявления таких
больших дефектов (это потом).
По кэшированию и другим фичам:
Побольше бы узнать об этом.
Якобы кэширование можно отключить.
Пока прошу вернуться к поставленным вопросам.
В Firebird-е, МИХО, при создании базы указывается размер страницы, и далее сервер оперирует уже именно этими страницами как минимальной единицей обмена с диском.
А по сабжу - это зависит от конкретной ФС, стало быть и узнавать нужно у драйвера ФС.
Кроме того, нужно учитывать систему ввода/вывода ОС, которая все подключенные ФС абстрагирует а данные кеширует, так что напрямую прочитать/записать сектор в устройство может быть довольно не постое занятие с учётом разнообразия устройств, ФС и ОС.
Так что если это курсовик, то задание поставлено не корректно - нужно уточнить ОС, ФС и хотя бы тип устройства (винт, флеха, SSD, сеть...).
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)