Ðлава 63. ÐолÑзоваÑелÑÑкие менеджеÑÑ ÑеÑÑÑÑов WAL
Ð ÑÑой главе опиÑÑваеÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÑдÑа PostgreSQL Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкими менеджеÑами ÑеÑÑÑÑов WAL, иÑполÑзÑÑ ÐºÐ¾ÑоÑÑй ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно инÑегÑиÑоваÑÑ Ñвои обÑекÑÑ Ð² WAL.
РаÑÑиÑениÑм, оÑобенно ÑеализÑÑÑим ÑаблиÑнÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа или индекÑнÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¸ÑполÑзоваÑÑ WAL Ð´Ð»Ñ Ð²Ð¾ÑÑÑановлениÑ, ÑепликаÑии и/или логиÑеÑкого декодиÑованиÑ. ÐолÑзоваÑелÑÑкие менеджеÑÑ ÑеÑÑÑÑов пÑедÑÑавлÑÑÑ Ñобой более гибкÑÑ Ð°Ð»ÑÑеÑнаÑÐ¸Ð²Ñ ÑниÑиÑиÑованнÑм запиÑÑм WAL (коÑоÑÑе игноÑиÑÑÑÑÑÑ Ð¿Ñи логиÑеÑком декодиÑовании), но ÑеализоваÑÑ Ð¸Ñ Ð² ÑаÑÑиÑениÑÑ Ñложнее.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð½Ð¾Ð²Ñй полÑзоваÑелÑÑкий Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ ÑеÑÑÑÑов WAL, ÑнаÑала опÑеделиÑе ÑÑÑÑкÑÑÑÑ RmgrData Ñ ÑеализаÑиÑми меÑодов менеджеÑа ÑеÑÑÑÑов. ÐодÑобнее она опиÑÑваеÑÑÑ Ð² src/backend/access/transam/README и в src/include/access/xlog_internal.h в иÑÑ
одном коде PostgreSQL.
/*
* ТаблиÑа меÑодов Ð´Ð»Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑов ÑеÑÑÑÑов.
*
* ÐÑа ÑÑÑÑкÑÑÑа должна ÑинÑ
ÑонизиÑоваÑÑÑÑ Ñ Ð¾Ð¿Ñеделением PG_RMGR в
* Ñайле rmgr.c.
*
* ÐеÑод rm_identify должен вÑдаÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñение запиÑи Ð´Ð»Ñ Ð¿ÐµÑеданного xl_info
* (без ÑÑÑлки на rmid). ÐапÑимеÑ, Ð´Ð»Ñ XLOG_BTREE_VACUUM он мог Ð±Ñ Ð²ÑдаÑÑ
* "VACUUM". ÐаÑем Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзван меÑод rm_desc, коÑоÑÑй должен вÑдаÑÑ
* дополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ запиÑи, еÑли они имеÑÑÑÑ
* (напÑимеÑ, поÑледний блок).
*
* ÐеÑод rm_mask пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° вÑ
од ÑÑÑаниÑÑ, изменÑннÑÑ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑом ÑеÑÑÑÑов, и
* маÑкиÑÑÐµÑ Ð±Ð¸ÑÑ, на изменение коÑоÑÑÑ
не должна ÑеагиÑоваÑÑ Ð¿ÑовеÑка
* wal_consistency_checking.
*
* ÐндекÑами в RmgrTable[] ÑвлÑÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ RmgrId (Ñм. rmgrlist.h). ÐÑли
* rm_name Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение NULL, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ RmgrTable ÑÑиÑаеÑÑÑ
* недейÑÑвиÑелÑной.
*/
typedef struct RmgrData
{
const char *rm_name;
void (*rm_redo) (XLogReaderState *record);
void (*rm_desc) (StringInfo buf, XLogReaderState *record);
const char *(*rm_identify) (uint8 info);
void (*rm_startup) (void);
void (*rm_cleanup) (void);
void (*rm_mask) (char *pagedata, BlockNumber blkno);
void (*rm_decode) (struct LogicalDecodingContext *ctx,
struct XLogRecordBuffer *buf);
} RmgrData;ÐаÑем заÑегиÑÑÑиÑÑйÑе новÑй Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ ÑеÑÑÑÑов.
/* * РегиÑÑÑаÑÐ¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ полÑзоваÑелÑÑкого менеджеÑа ÑеÑÑÑÑов WAL. * * ÐденÑиÑикаÑоÑÑ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑов ÑеÑÑÑÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñно ÑникалÑнÑми * ÑÑеди вÑÐµÑ ÑаÑÑиÑений. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÐºÐ¾Ð½ÑликÑов Ñ ÑаÑÑиÑениÑми дÑÑÐ³Ð¸Ñ * ÑазÑабоÑÑиков, заÑезеÑвиÑÑйÑе ÑникалÑнÑй RmgrId Ð´Ð»Ñ Ð²Ð°Ñего ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ð° * ÑÑÑаниÑе https://wiki.postgresql.org/wiki/CustomWALResourceManagers. * РпÑоÑеÑÑе ÑазÑабоÑки ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ RM_EXPERIMENTAL_ID, ÑÑÐ¾Ð±Ñ * не ÑезеÑвиÑоваÑÑ Ð»Ð¸Ñние иденÑиÑикаÑоÑÑ. */ extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr);
ФÑнкÑÐ¸Ñ RegisterCustomRmgr должна вÑзÑваÑÑÑÑ Ð¸Ð· ÑÑнкÑии _PG_init модÑÐ»Ñ ÑаÑÑиÑениÑ. РпÑоÑеÑÑе ÑазÑабоÑки нового ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð² каÑеÑÑве rmid ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ RM_EXPERIMENTAL_ID. Ðогда ÑаÑÑиÑение Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей бÑÐ´ÐµÑ Ð³Ð¾Ñово к вÑпÑÑкÑ, заÑезеÑвиÑÑйÑе новÑй иденÑиÑикаÑÐ¾Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑа ÑеÑÑÑÑов на ÑÑÑаниÑе Custom WAL Resource Manager (ÐолÑзоваÑелÑÑкий Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ ÑеÑÑÑÑов WAL).
ÐклÑÑиÑе модÑÐ»Ñ ÑаÑÑиÑениÑ, ÑеализÑÑÑий полÑзоваÑелÑÑкий Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ ÑеÑÑÑÑов, в shared_preload_libraries, ÑÑÐ¾Ð±Ñ Ð¾Ð½ загÑÑжалÑÑ Ð¿Ñи запÑÑке PostgreSQL.
ÐÑимеÑание
РаÑÑиÑение должно оÑÑаваÑÑÑÑ Ð² shared_preload_libraries до ÑеÑ
поÑ, пока в ÑиÑÑеме могÑÑ Ð±ÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо полÑзоваÑелÑÑкие запиÑи WAL. РпÑоÑивном ÑлÑÑае ÑеÑÐ²ÐµÑ PostgreSQL не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑ Ð¸Ð»Ð¸ декодиÑоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие запиÑи WAL, вÑледÑÑвие Ñего он Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ запÑÑÑиÑÑÑÑ.