COMMIT LOG (CLOG) PostgreSQL
Commit Log или CLOG — это структура, непосредственно хранящая состояние транзакций. Если транзакция не исполняется, то она могла завершиться либо успешно, либо неуспешно. Какой из этих вариантов имел место быть определить можно исключительно по CLOG. Вопреки названию, физически CLOG представляет собой не журнал, а большой битовый массив.
В этом разделе описывается состояние транзакций в PostgreSQL, а также принцип действия CLOG.
Состояние транзакции
Различают четыре состояния транзакций: IN_PROGRESS, COMMITTED, ABORTED и SUB_COMMITTED.
Первые три статуса не требуют пояснений. Например, когда транзакция находится в процессе выполнения, ее статус - IN_PROGRESS.
SUB_COMMITTED предназначен для субтранзакций, в данном документе его описание опущено.
Принцип работы CLOG
CLOG включает в себя одну или несколько страниц по 8 КБ в общей памяти. Логически он образует массив, где индексы массива соответствуют идентификаторам транзакций, а каждый элемент массива содержит статус соответствующего идентификатора транзакции. На рисунке 54 показан сам CLOG и принцип его работы.
T1:txid 200 выполняется; статус txid 200 меняется из IN_PROGRESS в COMMITTED.
T2:txid 201 прерывается;статус txid 201 меняется из IN_PROGRESS в ABORTED.
Когда требуется узнать статус транзакции, вызываются внутренние функции. Эти функции считывают CLOG и возвращают статус запрошенной транзакции.
Обслуживание CLOG
Когда запускается процесс контрольной точки, данные CLOG записываются в файлы, хранящиеся в подкаталоге pg_xact. (Обратите внимание, что в версиях 9.6 и более ранних pg_xact назывался pg_clog.) Эти файлы имеют имена '0000', '0001' и т. д..
Максимальный размер файла - 256 КБ. Например, если CLOG использует восемь страниц (с первой по восьмую, общий размер 64 КБ), его данные записываются в '0000' (64 КБ). Если CLOG использует 37 страниц (296 КБ), его данные записываются в '0000' и '0001', размер которых составляет 256 КБ и 40 КБ соответственно.
При запуске PostgreSQL данные, хранящиеся в файлах pg_xact, загружаются для инициализации CLOG.
Размер CLOG увеличивается постоянно, потому что при заполнении CLOG каждый раз добавляется новая страница. Однако не все данные, содержащиеся в CLOG, действительно необходимы. VACUUM, описанный в разделе 6, регулярно удаляет ненужные данные и файлы.
Более подробная информация, касающаяся удаления данных CLOG, описана в подразделе 6.4.




