SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Очищение старых данных в мультифайловой БД
Очищение старых данных в мультифайловой БД [сообщение #5031] Tue, 14 May 2024 13:04 Переход к следующему сообщению
TheKeeper в настоящее время не в онлайне  TheKeeper
Сообщений: 1
Зарегистрирован: May 2024
Junior Member
Здравствуйте. У меня возникла такая проблема, не могу найти решение.

Мы используем Firebird с ALTER DATABASE ADD FILE. У меня возникла проблема, что я не вижу способа оперативно освободить место на жёстком диске. Я могу удалить старые данные, но физически место не очищается. gfix sweep тоже не решает проблему. Через некоторое время я просто упрусь в потолок места на жёстком диске.

Можно решить проблему через gbak backup/gbak restore, но это требует остановки работы базы данных на долгий период времени, что может быть неприемлимым.

Есть ли возможность:
* Очистить место из БД на горячую, во время работы, удалив какие-то старые данные?
* Если нет, то хотя бы остановить БД лишь на небольшой промежуток времени, чтобы быстренько переформатировать не всю БД, а лишь файл с удалёнными данными?
Re: Очищение старых данных в мультифайловой БД [сообщение #5032 является ответом на сообщение #5031] Tue, 14 May 2024 13:10 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
обломись
Re: Очищение старых данных в мультифайловой БД [сообщение #5033 является ответом на сообщение #5032] Tue, 14 May 2024 13:32 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 69
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
Сама концепция nbackup подразумевает неизменность страниц в базе. О каком сжатии в таком случае может идти речь?
Re: Очищение старых данных в мультифайловой БД [сообщение #5034 является ответом на сообщение #5033] Tue, 14 May 2024 13:37 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shavluk писал(а) Tue, 14 May 2024 13:32
Сама концепция nbackup подразумевает неизменность страниц в базе. О каком сжатии в таком случае может идти речь?
там не nbackup.
Re: Очищение старых данных в мультифайловой БД [сообщение #5035 является ответом на сообщение #5031] Tue, 14 May 2024 14:07 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  neozx1984
Сообщений: 26
Зарегистрирован: June 2022
Junior Member
TheKeeper писал(а) Tue, 14 May 2024 13:04
Есть ли возможность:
* Очистить место из БД на горячую, во время работы, удалив какие-то старые данные?
* Если нет, то хотя бы остановить БД лишь на небольшой промежуток времени, чтобы быстренько переформатировать не всю БД, а лишь файл с удалёнными данными?
Можно используя утилиту pluck.
Вот статья на Хабре о ней Уменьшение размера файла в СУБД Ред База Данных / Firebird без операции backup & restore

Но есть  ряд подводных камней:
* Файл СУБД должен быть на SSD.
* Есть баги на старых версиях XFS, нужно обновлять ядро.
* Желательно, что бы файловая система была заполнена не более чем на 80-90%.

P.S. pluck не поддерживает многофайловые БД. Не думал, что их ещё кто-то использует. В принципе можно сделать поддержку.
P.P.S. pluck работает только под ОС Linux. Можно сделать версию для Windows при необходимости.
Re: Очищение старых данных в мультифайловой БД [сообщение #5037 является ответом на сообщение #5035] Tue, 14 May 2024 14:11 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
neozx1984 писал(а) Tue, 14 May 2024 14:07
Можно сделать версию для Windows при необходимости.
на Вындовсе достаточно пометить файл (или каталог) как "сжатый".
Re: Очищение старых данных в мультифайловой БД [сообщение #5038 является ответом на сообщение #5037] Tue, 14 May 2024 14:38 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 370
Зарегистрирован: August 2022
Senior Member
Но проще будет заменить винт. Не всё же базе крутиться на старом директорском ноутбуке...
Re: Очищение старых данных в мультифайловой БД [сообщение #5039 является ответом на сообщение #5038] Tue, 14 May 2024 14:54 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
а вообще, тема интересная (хоть и вброс).
Re: Очищение старых данных в мультифайловой БД [сообщение #5040 является ответом на сообщение #5039] Tue, 14 May 2024 15:11 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 313
Зарегистрирован: June 2022
Senior Member
Цитата:
Мы используем Firebird с ALTER DATABASE ADD FILE
Зачем? В таком виде разбиение БД на файлы это анахронизм. Вот появятся табличные пространства уже можно будет делать всякие интересные штуки.
А простая мультифайловая БД никаких преимуществ не даёт, только геморрой. Да и в 6-ке скорее всего эта фича вообще будет удалена взамен нормальных табличных пространств.

Re: Очищение старых данных в мультифайловой БД [сообщение #5041 является ответом на сообщение #5040] Tue, 14 May 2024 15:34 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
скучный ты человек, Денис.
человек тему закреативил, движ на форуме наметился.
а ты ему в лоб "зачем?"...
Re: Очищение старых данных в мультифайловой БД [сообщение #5042 является ответом на сообщение #5035] Tue, 14 May 2024 16:08 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 118
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
neozx1984 писал(а) Tue, 14 May 2024 19:07
Можно используя утилиту pluck
Вот статья на Хабре о ней
Не надо советовать вредного.
СУБД Firebird существенным образом опирается на доступность выделенного пространства. Разреженные файлы эту гарантию нарушают.
Утилиту применяют при дефиците места, а разреженность файла БД, при некоторых дополнительных условиях, гарантирует повреждение базы.
Re: Очищение старых данных в мультифайловой БД [сообщение #5045 является ответом на сообщение #5031] Wed, 15 May 2024 07:55 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 116
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
TheKeeper писал(а) Tue, 14 May 2024 17:04
Здравствуйте. У меня возникла такая проблема, не могу найти решение.

Мы используем Firebird с ALTER DATABASE ADD FILE. У меня возникла проблема, что я не вижу способа оперативно освободить место на жёстком диске. Я могу удалить старые данные, но физически место не очищается. gfix sweep тоже не решает проблему. Через некоторое время я просто упрусь в потолок места на жёстком диске.

Можно решить проблему через gbak backup/gbak restore, но это требует остановки работы базы данных на долгий период времени, что может быть неприемлимым.

Есть ли возможность:
* Очистить место из БД на горячую, во время работы, удалив какие-то старые данные?
* Если нет, то хотя бы остановить БД лишь на небольшой промежуток времени, чтобы быстренько переформатировать не всю БД, а лишь файл с удалёнными данными?

ИМХО ты не там видишь проблему и борешься не с тем с чем надо.

Непонятно зачем тебе ALTER DATABASE ADD FILE. У вас такая база что на один раздел не влазит?

Файл базы может только расти, уменьшаться не может, кроме как пересоздать базу через Backup/Restore посредством gbak.
При ADD FILE, насколько я помню, сам не пользовался, нужно сразу задавать размер файла, и он не будет меняться.

Вобщем, смысл в следующем. Когда ты удаляешь данные в базе, командой DELETE FROM, то фактически данные не удаляются а помечаются как удаленные.
Место от этих данных базой будет использовано для новых данных, если эти помеченные кто-то или что-то проверит на никомуненужность Smile
Обычно, для того что бы сразу после удаления освободить место, нужно прочитать только что удаленное.
Я делаю примерно так:

DELETE FROM TABLE WHERE (УСЛОВИЕ);
COMMIT;
SELECT COUNT(*) FROM TABLE WHERE (УСЛОВИЕ);
COMMIT;

Count(*) естественно выдаст 0, на подсчет уйдет какое-то то время, т.к. сервер будет проверять каждую найденную (удаленную) версию записи на предмет нужна ли она кому-нибудь, и если обнаружит что не нужна - удалит ее, освободит место для дальнейшего использования.

Естественно, тут еще может быть масса всяких тонкостей, например транзакция может быть запущена "без сборки мусора" - тогда count(*) так же выдаст 0 но место не свободится.
Или у кого-то запущена длинная транзакция в которой он читает эти удаленные записи, и пока та транзакция не завершится, эти данные будут для нее хранится. Опять же, это зависит от уровня изоляции транзакции и т.п.

Вобщем, тебе нужно читать на ibase.ru статьи про версионность и транзакции.
И, возможно, придется переделать приложение что бы работало корректно с транзакциями.
Re: Очищение старых данных в мультифайловой БД [сообщение #5047 является ответом на сообщение #5045] Wed, 15 May 2024 13:59 Переход к предыдущему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 850
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
ждём от ТС фьючереквест на ALTER DATABASE DROP FILE
Предыдущая тема: Подключение к серверу FireBird 2.5
Следующая тема: Странность с исключениями в EB
Переход к форуму:
  


Текущее время: Tue Jul 23 05:26:34 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00767 секунд