使用 TDB 文件

Samba 附带了三种用于处理 TDB 文件的工具:

●tdbdump:打印 TDB 文件的内容。

●tdbbackup:备份并验证 TDB 文件。

●tdbtool:创建、查看并修改 TDB 文件。

快速查看 TDB 文件内部

查看 TDB 文件中的内容的最快方式是通过 tdbdump 命令将其转储。清单 2 显示了 ntprinters.tdb 文件的转储。

清单 2. 在 TDB 文件上使用 tdbdump

[root@bob ~]# tdbdump /var/lib/samba/ntprinters.tdb
{
key(21) = "GLOBALS/c_setprinter\00"
data(4) = "\00\00\00\00"
}
{
key(13) = "SECDESC/test\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}
{
key(17) = "SECDESC/cups-pdf\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}

从清单 2 的输出,您可以看到在数据库中有三个键。第一个键为 21 字节(字节长度显示在括号中 [()]),被称为GLOBALS/c_setprinter,后跟 NULL,其为 ASCII 码零。非输出字符用十六进制格式显示,其是后跟两个十六进制字符的反斜线。第一个键的值为 4 字节且其完全为 NULL。

接下来的两个键被称为 SECDESC/test 和 SECDESC/cups-pdf 且两个都是以 NULL 结束。因为该数据完全是二进制且不可输出,所以已经以十六进制格式的非输出字符输出了。

备份并恢复 TDB 文件

表 1 显示了几种在重启持久存在并应该备份的 TDB 文件。像大多数数据库那样,您不能只复制文件,因为复制可能会损坏。如果文件正在被写入时您复制该文件,会发生备份损坏,从而您具有处于不一致状态的备份。一个替代办法是关闭 Samba 守护进程,然后复制这些文件。

备份 TDB 文件最容易的方式是使用 Samba 附带的 tdbbackup 实用工具。此实用工具可以安全复制 TDB 文件,即使其正在被积极地写入。tdbbackup 的另一帮助功能是可以查看 TDB 文件是否损坏,且如果发现损坏则自动恢复为备份文件。清单 3 显示了正在备份的 TDB 文件。

清单 3. 备份 TDB 文件

[root@bob samba]# ls -l account_policy.*
-rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb
[root@bob samba]# tdbbackup account_policy.tdb
[root@bob samba]# ls -l account_policy.*
-rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb
-rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak
[root@bob samba]# tdbdump account_policy.tdb | md5sum
53ea608f0d93061480549c511756b778 -
[root@bob samba]# tdbdump account_policy.tdb.bak | md5sum
53ea608f0d93061480549c511756b778 -

清单 3 中的第一个命令简要列出了所有以 account_policy 开始的文件,以便确认只存在一份副本。接下来通过运行 tdbbackup account_policy.tdb 来备份帐户策略数据库。第三个命令寻找任何以 account_policy 开始的文件,以便显示已经创建的带有 .bak 扩展名的新文件。虽然大小不同于原文件,但是转储每一个文件并计算 MD5 哈希显示了它们的校验和是相同的。因此更大的文件大小并不是问题,因为每个键值对的内容是相同的。

如果由于某种原因原始的 account_policy.tdb 文件受到损坏,例如在系统不正常关机期间,您可以从其备份恢复旧的文件。清单 4 显示了此过程。

清单 4. 验证并恢复 TDB 文件

[root@bob samba]# ls -l account_policy.tdb
-rw------- 1 root root 1213 Dec 8 21:49 account_policy.tdb
[root@bob samba]# tdbbackup -v account_policy.tdb
tdb_oob len 1256 beyond eof at 1213
restoring account_policy.tdb
[root@bob samba]# ls -l account_policy.tdb*
-rw------- 1 root root 36864 Dec 8 21:49 account_policy.tdb
-rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak
[root@bob samba]# tdbbackup -v account_policy.tdb
account_policy.tdb : 17 records
[root@bob samba]# tdbdump account_policy.tdb | md5sum
53ea608f0d93061480549c511756b778 -

清单 4 中的第一个命令显示文件大小已经显著地减少。tdbbackup 命令再次运行,但是带有 -v 标记,其验证 TDB 文件。如果该文件受到损坏,您将看到错误摘要,后面是文件已经恢复的通知。通过 ls 命令比较文件的大小,您可以看到备份被用于替换当前的数据库。

您可以安全地多次运行 tdbbackup 命令。在有效的数据库文件上运行它,类似 清单 4 中的倒数第二个命令, 则会提供文件中的记录数。MD5 总和与损坏之前所看到的相匹配。

注意:tdbbackup 命令接受通配,所以您可以同时备份并验证多个文件。

变更 TDB 文件

tdbtool 实用工具使您可以更改 TDB 文件内部的数据。此实用工具还检查文件内的个别键和值,而不必转储整个文件并对整个输出排序。

tdbtool 可在命令行上接受命令,或者您可以打开交互式控制台。要在命令行上完成任务,请运行 tdbtool example.tdb command options,其中 example.tdb 是文件名,command 是命令,针对命令的选项位于最后。要使用 tdb shell,只需单独运行 tdbtool 或在命令行上传递文件的名称。

要创建数据库,请单独运行 tdbtool,然后输入 create test.tdb。这样做可以在磁盘上创建名为 test.tdb 的数据库并打开它以便您在此会话中进行的任何变更都在该文件上。如果您有现成的 TDB 文件,您可以在命令行上指定该名称或使用 open 命令。奇怪的是,直接从命令行创建 TDB 文件的惟一方式涉及指定名称两次,例如 tdbtool test.tdb create test.tdb,其返回一个错误但成功地创建一个数据库。

在您创建完数据库或者打开现有数据库时,可以使用以下选项:

●dump:显示数据库中的所有内容,就像 tdbdump。

●keys:只以 ASCII 显示键,或通过 hexkeys 命令,用十六进制格式显示它们。

●erase:在没有提示的情况下删除数据库中的所有内容。

●info:显示数据库使用的键和字节数的概要。

●check:查看数据库是否有效。

●speed:执行测试以便查看数据以多快的速度读取并写入数据库。

●show key:输出与键存储在一起的值。

●delete key:删除键和值。

要添加并处理数据,您需要有 insert 和 store 命令。它们每一个都接受键和值的参数,值为可选。如果您不指定一个值,那么您将看到键在值中存储零字节数据。

插入记录 意味着创建新的记录,而存储记录 可以覆盖现有的条目。清单 5 显示了这两个命令之间的差异。

清单 5. 存储与插入记录

tdb> insert mykey myvalue
tdb> insert mykey newvalue
insert failed
tdb> store mykey newvalue
Storing key:
key 5 bytes
mykey
data 8 bytes
[000] 6E 65 77 76 61 6C 75 65 newvalue
tdb> store newkey someothervalue
Storing key:
key 6 bytes
newkey
data 14 bytes
[000] 73 6F 6D 65 6F 74 68 65 72 76 61 6C 75 65 someothe rvalue

清单 5 中的事件顺序是:

1、插入名为 mykey 的键,具有值 myvalue。此操作成功。

2、插入与以前名称相同的键但是具有新的值。此操作失败,因为键已经存在。

3、存储键而不是插入它。此操作成功,且您将获得更详细的输出。

4、存储具有新值的新键。即使键不存在此操作也会成功。

您可以在 tdb shell 中使用事务,以便允许您运行一系列命令并作为一个组应用它们,或者作为一个组取消它们。清单 6 显示了两个事务。

清单 6. 使用事务

tdb> transaction_start
tdb> insert somekey somevalue
tdb> show somekey
key 7 bytes
somekey
data 9 bytes
[000] 73 6F 6D 65 76 61 6C 75 65 somevalu e
tdb> transaction_cancel
tdb> show somekey
fetch failed
tdb> transaction_start
tdb> insert somekey somevalue
tdb> transaction_commit
tdb> show somekey
key 7 bytes
somekey
data 9 bytes
[000] 73 6F 6D 65 76 61 6C 75 65 somevalu e

该事务首先以 transaction_start 命令开始。下一步是插入一个键。如果另一个进程要读取数据库,则不会看到此键,因为它是没有提交。打开该事务的进程确实可以看到该键。然后,通过 transaction_cancel 取消该事务。该键不再出现。

然后重新运行该进程,但是通过 transaction_commit 提交事务。然后该键对于所有读取器都存在。

如果您位于事务中,则其他读取器可能受阻,这意味着它们将挂起直到事务完成。所以当在生产数据库中使用事务时请小心!虽然它们是非常安全的功能,但是如果过度使用就会潜在地伤害性能。


相关内容