Удалить или уменьшить файл lobs в базе данных HSQLDB
Я использую HSQLDB 2.3.0. У меня есть база данных, что следующая схема:
CREATE TABLE MEASUREMENT (ID INTEGER NOT NULL PRIMARY KEY IDENTITY, OBJ CLOB);
Когда я заполняю эту таблицу тестовыми данными, файл LOBS в моей базе данных увеличивается:
ls -lath
-rw-rw-r-- 1 hsqldb hsqldb 35 May 6 16:37 msdb.log
-rw-rw-r-- 1 hsqldb hsqldb 85 May 6 16:37 msdb.properties
-rw-rw-r-- 1 hsqldb hsqldb 16 May 6 16:37 msdb.lck
drwxrwxr-x 2 hsqldb hsqldb 4.0K May 6 16:37 msdb.tmp
-rw-rw-r-- 1 hsqldb hsqldb 1.6M May 6 16:37 msdb.script
-rw-rw-r-- 1 hsqldb hsqldb 625M May 6 16:35 msdb.lobs
После запуска следующей команды:
TRUNCATE SCHEMA public AND COMMIT;
CHECKPOINT DEFRAG;
SHUTDOWN COMPACT;
Файл lobs остается того же размера:
-rw-rw-r-- 1 hsqldb hsqldb 84 May 6 16:44 msdb.properties
-rw-rw-r-- 1 hsqldb hsqldb 1.6M May 6 16:44 msdb.script
-rw-rw-r-- 1 hsqldb hsqldb 625M May 6 16:35 msdb.lobs
Каков наилучший способ обрезать схему и вернуть все дисковое пространство?
2 ответа
Механизм базы данных предназначен для непрерывного использования в реальных приложениях. Если у вас есть приложение, которое использует блоки и удаляет некоторые из них, пространство будет повторно использоваться для будущих блоков после каждой контрольной точки.
При обычном использовании приложения оператор DELETE используется для удаления строк. Этот оператор освобождает пространство для повторного использования после каждой контрольной точки.
Вы можете создавать свои тесты таким образом, чтобы воссоздавать базу данных, а не повторно использовать старую базу данных после удаления данных.
У меня есть приложение с той же проблемой, используя hsqldb 2.3.3. Файл.lobs, кажется, растет неопределенно долго даже после вызова "дефрагментации контрольной точки". Мой сценарий заключается в том, что я вставляю 1000 BLOB-объектов по 300 байт каждый. Я периодически удаляю их все и вставляю 1000 новых блобов примерно одинакового размера. После нескольких раундов мой файл.lobs теперь имеет размер 1,3 ГБ, но на самом деле он хранит около 300 КБ данных. Несмотря на вызов контрольной точки, дефрагментация файла.lobs только растет и растет. Это ошибка?