mco_disk_database_vacuum
显式移除由 MVCC 事务管理器生成的未使用版本。
在使用多版本并发控制(MVCC)事务管理器时,若系统发生崩溃,持久化数据库中可能会残留未删除的旧版本和工作副本。这些过期对象虽然不会破坏数据库的一致性或影响应用程序的正常运行,但会不必要地占用存储空间。
为了检测并清理这些过期对象,需要对整个数据库进行扫描。因此,自动恢复过程通常不会执行此操作。用户可以通过调用 mco_disk_database_vacuum()
函数显式地清理未使用的版本。
此外,应用程序可以在调用 mco_db_open_dev()
时通过设置 mco_db_params_t
结构体中的 MCO_DB_MODE_MVCC_AUTO_VACUUM
选项来启用自动清理功能。
请注意,mco_disk_database_vacuum()
函数需要对数据库进行独占访问,因此在真空操作完成且该函数将控制权交还给应用程序之前,无法对数据库执行任何操作。
此功能与 Classname_set_allocation_block_size()
API 不兼容,因为 mco_disk_database_vacuum()
会遍历所有已分配的页面(在位图中标记为已分配的页面),而调用 Classname_set_allocation_block_size()
实际上会导致运行时分配整个块,而其中只有部分被使用并正确初始化。
MCO_RET mco_disk_database_vacuum(
/*IN*/ mco_db_h db
);
参数
db
mco_db_h
由 mco_db_connect()
建立的数据库句柄。
返回
MCO_S_OK
操作已成功完成。
MCO_E_DISK_PAGE_ACCESS
从磁盘访问页面时出错。
MCO_E_DISK_OPERATION_NOT_ALLOWED
磁盘管理器文件大小不足。
示例
/* 应用程序代码片段 */
const char * dbname = "SimpleDb";
int main(int argc, char* argv[])
{
mco_db_h db;
MCO_RET rc;
mco_device_t dev[4];
mco_db_params_t db_params;
...
rc = mco_db_open_dev( dbname, simple_get_dictionary(), dev, 4, &db_params );
if ( MCO_S_OK != rc )
{
rc = mco_db_connect( dbname, &db );
...
rc = mco_disk_database_vacuum( db );
...
}
}
文件
头文件:
mco.h
源文件:
mcodisk.c
库:
libmcovtdsk.a
头文件:
mco.h
源文件:
mcovtmem.c
库:
libmcovtmem.a