事务日志控制
事务日志参数
事务日志(TL)通过以下构造初始化并传递给函数 mco_translog_start()
:
typedef struct mco_TL_start_data
{
uint2 flags; /* TL选项组合 */
uint2 disk_page_size; /* 单个磁盘页面的大小 */
uint2 flush_depth; /* 最大未冲入记录数量 */
timer_unit flush_time; /* 冲入记录前计时器数量 */
mco_TL_timer_proc timer_proc; /* 用户定义的外部计时器过程。它必须在指定的 flush_time 时间到期时发出信号 */
mco_size_t max_size; /* 日志文件最大限制,当达限向warn_sz_proc发出警告 */
mco_TL_warn_sz_proc warn_sz_proc; /* 用户自定义的在日志文件达到最大尺寸时发出警告的程序 */
char const *dual_log_path; /* 双输出模式下日志文件的路径 */
mco_event_mask_t event_mask; /* 已记录事件的位掩码 */
} mco_TL_start_data_t, *mco_TL_start_data_h;
event_mask枚举值
- MCO_LOG_MASK_ALL_CHANGES:所有事务更改都将被记录。
- MCO_LOG_MASK_ALL_EVENTS:仅记录导致触发任何已声明事件的更改,屏蔽由模式编译器生成的所有已记录事件标识符
MCO_EVENT_*
。
flags枚举值
mco_TL_start_data 中的 flags
元素被指定为以下一个或多个值的组合:
enum MCO_TL_FLAGS
{
MCO_TRANSLOG_ALIGNED = 0x01,
MCO_TRANSLOG_APPEND = 0x02,
MCO_TRANSLOG_CRC = 0x04,
MCO_TRANSLOG_SIZE_CLBK = 0x08,
MCO_TRANSLOG_SYNC_INSTANTLY = 0x10,
MCO_TRANSLOG_SYNC_TIMER = 0x20,
MCO_TRANSLOG_SYNC_COUNT = 0x40,
MCO_TRANSLOG_ITERABLE = 0x80,
MCO_TRANSLOG_RESTART = 0x100,
MCO_TRANSLOG_PIPE = 0x200,
MCO_TRANSLOG_DUAL_OUT = 0x400,
MCO_TRANSLOG_EVENT_MASK = 0x800,
MCO_TRANSLOG_DYNAMIC_PIPE = 0x1000,
MCO_TRANSLOG_PREREAD_PIPE = 0x2000
};
MCO_TRANSLOG_ALIGNED
存储的每个事件的每个新数据块都从新的文件页开始。
MCO_TRANSLOG_APPEND
将事务追加到先前保存的日志文件中。日志文件中的最新事务编号必须与数据库当前的事务编号相同。
MCO_TRANSLOG_CRC
使用 CRC32 对事务记录的主体进行覆盖以确保高度安全。这种完整性验证在日志转文件模式下会自动启用(对于其他磁盘管理器存储操作,如
mco_db_save()
和mco_db_load()
也是如此)。在管道模式(即指定了MCO_TRANSLOG_PIPE
、MCO_TRANSLOG_DYNAMIC_PIPE
或MCO_TRANSLOG_DUAL_OUT
时),默认情况下会禁用此完整性检查以提高性能。如果希望在管道模式下启用 CRC32 验证,则必须指定选项MCO_TRANSLOG_CRC
。MCO_TRANSLOG_SIZE_CLBK
如果日志文件达到指定大小(元素
max_size
必须大于 0),则调用用户定义的过程warn_sz_proc
。MCO_TRANSLOG_SYNC_INSTANTLY
每次写入事务记录时都刷新文件系统缓冲区。如果未指定此选项,则运行时会在中间缓冲区中缓冲事务。
MCO_TRANSLOG_SYNC_TIMER
每当用户定义的回调过程
timer_proc
控制的flush_time
定时器滴答一次(元素 flush_time 必须大于 0)时,就将数据刷新到磁盘。MCO_TRANSLOG_SYNC_COUNT
每执行
flush_depth
次事务后将数据刷新到磁盘。MCO_TRANSLOG_RESTART
重新启动之前已开始的日志记录会话,并使用新文件(不会导致事务冻结)。
MCO_TRANSLOG_ITERABLE
强制日志引擎写入已删除对象的主体。无论使用哪种方法(文件或管道),此选项都是创建可用于由函数
mco_translog_iterate()
读取的日志文件所必需的。MCO_TRANSLOG_PIPE
将日志写入 mco_device_t 中指定的管道,分配方式为
MCO_MEMORY_ASSIGN_PIPE_BUF
。参数file_path
指定一个可选的溢出文件(如有必要),或者为 0。MCO_TRANSLOG_DUALOUT
如果使用管道接口,则将数据复制到本地日志文件中。元素
dual_log_path
指定该文件。dual out
选项要求同时指定选项MCO_TRANSLOG_PIPE
。MCO_TRANSLOG_EVENT_MASK
启用通过事件掩码对日志中存储的数据进行筛选。元素
event_mask
指定所需的筛选条件。
实现注意事项
选项 MCO_TRANSLOG_SYNC_TIMER
和 MCO_TRANSLOG_SYNC_COUNT
彼此兼容,但与 MCO_TRANSLOG_SYNC_INSTANTLY
不兼容。
如果期望函数 mco_translog_iterate()
读取日志,则应使用选项值 MCO_TRANSLOG_ITERABLE
。极其重要的是,它应与选项值 MCO_TRANSLOG_PIPE
一起指定。在使用持久性数据库时,只有 MVCC 事务管理器支持生成可迭代日志。如果使用模式 MCO_TRANSLOG_PIPE
,则在调用 mco_translog_stop()
之前,必须至少保持一个到管道的连接处于打开状态。
满足此要求的最简单方法是使用调用函数 mco_translog_start()
的相同连接来调用函数 mco_translog_stop()
。也可以从另一个连接调用 mco_translog_stop()
,但在这种情况下,请确保原始连接保持打开状态,否则管道中的数据可能会丢失,在这种情况下,mco_trans_commit()
或任何 mco_translog_*()
函数将根据管道丢失的时刻返回错误 MCO_E_TL_PIPE_LOST
。这是一个保护功能,不应发生。但如果发生,则应停止并重新启动日志记录。mco_TL_start_data 结构的两个用户定义的回调过程元素具有以下原型:
typedef mco_bool(*mco_TL_timer_proc)(mco_TL_flush_timer_h timer);
typedef void (*mco_TL_warn_sz_proc)(mco_size_t log_size);
Translog Play结构
以下结构由 mco_translog_play_params_init()
初始化,并传递给函数 mco_translog_play_ex()
:
typedef struct mco_TL_play_params_
{
char const *src_file_path;
mco_db_h pipe_db;
mco_device_t *pipe_device;
mco_trans_iterator_callback_t iteration_proc;
void *iterproc_user_ctx;
mco_dictionary_h dict;
void *mem_ptr;
mco_size_t mem_size;
mco_translog_register_event_handlers_t register_callback;
void *regevent_user_ctx;
mco_size_t ddl_dict_size;
int ddl_dict_flags;
int max_classes;
int max_indexes;
} mco_TL_play_params_t, *mco_TL_play_params_h;
日志文件写入模式
持久数据库通过维护一个数据库日志文件以及数据文件,在系统崩溃时能够恢复。
数据库更新写入日志文件的方式由 mco_db_params_t 的 db_log_type
参数以及 mco_log_params_t 结构中定义的事务提交策略和其他设置决定,该结构的参数如下:
db_log_type
提交策略枚举值:
- MCO_COMMIT_SYNC_FLUSH
- MCO_COMMIT_BUFFERED
- MCO_COMMIT_DELAYED
- MCO_COMMIT_NO_SYNC
有关这些事务策略的含义,请参阅事务提交策略页面。
redo_log_limit
REDO 事务日志的阈值。当事务日志文件大小达到此值时,数据库文件将刷新到持久存储(此过程通常称为检查点),并且日志文件将被截断。请注意,在所有事务提交之前,日志文件无法被截断。因此,不能将 redo_log_limit
视为事务日志的最大大小,它可能会超过此值。默认值为 16M。
delayed_commit_threshold
此参数控制 MCO_COMMIT_DELAYED
事务策略。在此模式下,所有修改过的页面都会被固定在页面池中,在事务提交时不会写入持久存储。当所有固定页面的总大小达到此阈值,或者延迟提交的事务数量超过 max_delayed_transactions
值参数,或者达到 max_commit_delay
超时时间时,所有延迟的事务将一次性提交到持久存储。默认值为缓存大小的 1/3。
max_delayed_transactions
此参数控制 MCO_COMMIT_DELAYED
事务策略。默认情况下,延迟事务的数量不受限制。
max_commit_delay
此参数控制 MCO_COMMIT_DELAYED
事务策略(请参阅上文的 delayed_commit_threshold
和 max_delayed_transactions
)。这是在将所有延迟事务一次性提交到持久存储之前等待的应用程序定义的时钟周期数(默认为毫秒)。