LMDB 的远程副本

LMDB 的远程副本

我想将 LMDB 从本地计算机迁移到另一台远程计算机,但文件大小有些奇怪。根据文件系统,LMDB 是一个包含两个文件的目录:data.mdb 和 lock.mdb。

的输出ls -altoh lmdb表明 data.mdb 的文件大小为 4T,这与我创建 LMDB 时使用的 map_size 参数相匹配。这意味着当打开 DB 时,操作系统将内存映射该文件,为其提供 4T 的虚拟空间。 的输出表明du -hs lmdblmdb 占用了约 900MB 的磁盘空间,这与 报告的 map_size 一致python -mlmdb -e lmdb stat

当我进行本地复制时cp -r lmdb lmdb_copy,它按预期工作:复制了 900MB 的数据。当我这样做时也是一样scp -r lmdb lmdb_copy2(使用 scp 进行本地复制)。

但是,当我执行远程复制时scp -r lmdb user@remotehost:~/lmdb_copy,scp 会尝试复制 4T 数据,如进度条所示。在传输了 2GB 数据后,我停止了 scp。

在远程机器上,LMDB 的大小均为 2GB。 'ls报告正确的大小为 900MB,并且所有条目都在那里。我已验证我可以打印出所有密钥,并且它们是正确的。dupython -mlmdb -e lmdb_copy stat

在这种背景下,我的问题是,为什么 scp 会尝试复制所有 4T 的内存映射大小?理想情况下,我想让 scp 在后台执行其操作,而无需手动终止它。

答案1

您可以尝试使用 rsync 进行复制。它说它可以处理稀疏文件。例如

rsync --rsh=ssh --archive --sparse lmdb user@remotehost:~/lmdb_copy

另外,关于为什么 scp 在本地工作而不是在网络上工作,当 scp 发现它是本地到本地的复制时,它会直接将请求传递给 cp 命令。监控 scp 命令的系统调用时,我发现它正在这样做

execve("/bin/sh", ["sh", "-c", "exec cp -r foo bah"], [/* 20 vars */])

相关内容