共享内存段的紧急恢复
有时,当一个进程被意外终止或崩溃时,数据库共享内存段可能会被锁定,导致其他进程(无论是已经运行的还是新启动的)无法访问。然而,在这种情况下,可能需要拯救内存数据库中剩余的宝贵数据。
shdump实用程序可用于为此类共享内存段创建紧急备份。
请注意,shdump应仅作为“最后的手段”使用,即在所有其他选项都已尝试且失败,并且即将进行最终清理或重新启动“冻结”的应用程序之前。此工具绝不应与常规数据库操作结合使用。(如需例行备份数据,请参考备份和恢复页面。)
不能保证所有数据都能完整保存或所有事务都能顺利完成。
在Windows平台上,至少需要有一个持有受影响共享内存段的进程保持活动状态(即使该进程卡住或不可操作),以确保shdump能够正常工作。
救援程序概述:
- 使用shdump将数据库共享内存段转储到文件中。
- 创建一个临时数据库,并将转储文件加载到其中,然后从这个临时数据库进行常规备份。这一步可以在不同的机器上执行,以便不影响原共享内存段的状态。
- 将备份恢复到常规的SmartEDB实例中,检查并验证数据,然后正常使用。
用法
shdump [-dr] [-s size] [-c max_connections] [-a address] [-p page_size] [ -n dbname] segment_name);
size 表示内存段的大小(以字节为单位)。后缀修饰符 'k'、'm'、'g' 分别表示千字节、兆字节和吉字节。address 是要恢复段的地址(十六进制格式:0xHHHHH)。page_size 是数据库页面大小。默认值为 512 字节。仅在恢复数据库时使用。dbname 是生成的数据库名称。仅在恢复时使用。
示例
- 这将创建一个名为“segmentName.dmp”的文件段,大小为 128MB,并保存名为“segmentName”的共享内存段的内容。
shdump -s 128M segmentName
- 此命令将把名为“segmentName.dmp”的段转储文件加载到内存中,使用该段打开一个 IM 数据库,并使用常规的 SmartEDB 备份创建 backupdb.bak 文件。此文件适合使用 xsql 的 -image 选项或使用 SmartEDB C API 调用 mco_db_load() 进行加载。
shdump -a 0x20000000 -r -p 4096 -n kbss_stds -s 128m -c 256 segmentName
- 假设数据库参数在相应的 xsql.cfg 配置文件中进行了描述:
xsql -c xsql.cfg -image backupdb.bak