У нас є відносно малооб'ємна база даних Postgres з безперервним архівуванням, створеним для стиснення кожного сегмента WAL та відправки його на S3. Оскільки це система з низьким рівнем гучності, вона потрапляє archive_timeoutкожні 10 хвилин або близько того, і зберігає в основному сегмент WAL, що використовується в основному, і який стискався дуже добре, оскільки він був здебільшого нулями.
Однак Postgres переробляє свої сегменти WAL, щоб уникнути витрат на виділення нових файлів на кожному WAL-комутаторі, що корисно в ситуації з високим завантаженням, але це означає, що після вибуху більш важкої, ніж звичайної, файлів у сегменті WAL вже заповнено барахло з попередніх сегментів і зовсім не дуже добре стискаються. Ми зберігаємо безліч копій усього цього сміття.
Чи є спосіб зменшити кількість місця, яке ми використовуємо для збереження нашого архіву WAL? Деякі неоптимальні можливості:
Не дозволяйте Postgres якось рециркулювати сегменти WAL, тому щоразу він починається з нульового файлу. Документи не вказують, що є варіант для цього, але я, можливо, його пропустив.
Нехай Postgres дорівнює нулю файлу сегмента WAL, коли він починає / закінчує його використання. Знову ж таки, документи, здається, не припускають, що це можливо.
Зовні нульове або видалення деяких файлів сегмента WAL, поки вони не використовуються. Чи є безпечний спосіб визначити, які файли це?
Зніміть невикористану частину сегмента, перш ніж архівувати його, використовуючи висновок,
pg_xlogdumpщоб знайти, звідки починається небажана. Можливо, хоча мені це не подобається. Принаймні, зробивши це в команді архіву, ви можете бути впевнені, що Postgres не збирається повторно використовувати файл.Заархівуйте лише використану частину сегментного файлу, знову ж таки
pg_xlogdumpякось інтерпретуючи вихід , а потім підкажіть його нулями під час відновлення. Також звучить можливо, хоча мені це не дуже подобається.