本节包括与 Calendar Server(Berkeley 数据库)数据库有关的各种问题:
本节包含以下主题:
所要采取的多数故障排除步骤都需要您具有对 Berkeley 数据库实用程序的访问权限。虽然在 Calendar Server 包中提供了这些实用程序的某个版本,但它们不受支持。您可能希望直接从 Sleepycat Software (http://www.oracle.com/database/berkeley-db/index.html) 上获得更多信息。
本节包含以下主题:
设置并导出 LD_LIBRARY_PATH 环境变量以反映以下目录:
cal-svr-base/SUNWics5/cal/tools/unsupported/bin/
下表列出了一些常用 Berkeley 数据库工具(实用程序)。
Berkeley 数据库工具 |
说明 |
---|---|
db_archive |
将不再使用的日志文件的路径名写入标准输出结果中,每行一个路径名。 |
db_checkpoint |
一个守护进程,用于监视数据库日志并定期调用检查点例程以对其进行检查点检查。 |
db_deadlock |
遍历数据库环境锁定区域,并在每次检测到死锁或已超时的锁定请求时异常中止锁定请求。 |
db_dump |
将指定文件以 db_load 实用程序能够识别的平面文本格式写入标准输出结果中。 |
db_load |
从标准输入中读取文件并将其载入指定的数据库文件。如果文件尚未存在,此工具将创建它。 |
db_printlog |
调试用于将日志文件转储为用户可读格式的实用程序。 |
db_recover |
在发生意外的应用程序、数据库或系统故障后,将数据库恢复到一致性状态。 |
db_stat |
显示数据库环境的统计信息。 |
db_verify |
验证一个或多个文件及其所包含的数据库的结构。 |
如果 Berkeley 数据库处于死锁状态,则必须重置数据库。尽早检测到此状态是很重要的。
要使系统可以定期检查数据库以检测到死锁状态并通知管理员,请执行以下步骤:
以有权更改此配置的管理员身份登录。
发布 stop-cal 命令停止 Calendar Server 服务。
转至 /etc/opt/SUNWics5/cal/config 目录。
通过复制和重命名旧的 ics.conf 文件来保存该文件。
如果必要,编辑 ics.conf 使其具有以下值:
local.caldb.deadlock.autodetect=”yes”
将此参数设置为 "yes" 时,将启动用于监视锁定区域的 db_deadlock 守护进程。
导致日历数据库损坏的原因有多种:系统资源争用、硬件错误、应用程序错误和数据库错误,当然还有人为错误。本节介绍了如何检测日历数据库损坏:
没有人可以保证数据库不被损坏。但您可以最小化数据丢失和运行的停机时间。严密监视数据库和日历服务器是尽早检测到损坏的关键。频繁和完整的备份是在发现损坏后从损坏中恢复的关键。
日历数据库中有两种可能的损坏级别:
应用程序级别—一个或多个数据库文件中的违例条目会在服务器运行这些条目时阻止服务器继续运行。
数据库级别—Berkeley 数据库页面中的损坏会导致各种问题。一个常见的症状是运行 csdb check 时不断循环。另一个常见症状是显示错误消息,例如:
“非法的页面类型或格式”或 “第 97895 页不存在,未设置创建标志”
查看 Calendar Server 日志文件(包括警报日志)中的错误消息,这些消息可能会表明数据库受到损坏。
应该定期查看日志文件,看是否发生了 ALERT、CRITICAL、ERROR 和 WARNING 级别的错误,如果发现这些错误,请检查事件以找出 Calendar Server 操作可能出现的问题。在 Calendar Server 的正常操作过程中,系统会生成 NOTICE 和 INFORMATION 级别的日志事件,以帮助您监视服务器的活动。
任何情况下都不要移除数据库目录中的任何事务日志文件。事务日志文件包含事务更新(添加、修改或删除),移除这些文件将损坏日历数据库,且无法恢复。
在请求 Calendar Server 技术支持时,可能需要您提供日志文件以协助解决问题。
使用 check 命令可以扫描日历数据库,包括日历属性 (calprops) 和事件以及待办事项(任务),以查看其中是否存在损坏。如果使用 check 命令发现无法解决的冲突,则将在输出结果中报告该情况。
check 命令不检查警报或组调度引擎 (Group Scheduling Engine, GSE) 数据库中的损坏。
以具备管理权限的用户身份登录安装了 Calendar Server 的系统。
Calendar Server 可以正在运行或已经停止,但最好停止 Calendar Server。
如果尚未备份,请备份日历数据库。
只需复制数据库 (.db) 文件。无需复制任何共享 (__db.*) 文件或日志 (log.*) 文件。
转到 cal-svr-base/SUNWics5/cal/sbin 目录。
例如,在 Solaris 操作系统上为转到默认目录,请输入:
cd /opt/SUNWics5/cal/sbin
针对日历数据库副本运行 check 命令:
./csdb check dbdir /tmp/check.out
如果未指定 dbdir,则 check 命令将针对当前目录中的数据库。
check 命令会生成许多信息,因此考虑将所有输出结果(包括 stdout 和 stderr)重定向到一个文件中(如示例中所示)。
运行完 check 命令后,查看输出文件。如果数据库已损坏,运行 rebuild 命令。
(参见22.5.6 重建损坏的日历数据库。)
自动清除配置设置可能没有正确反映出最终用户希望看到的客户机用户界面。事务日志文件数目和大小的急剧增加可能只是长时间延迟清除“删除日志”记录所造成的。如果是有意进行这样的延迟以满足 Connector for Microsoft Outlook 或 Sync Tool 用户的需求,则出现事务日志文件的大小和数目的剧增并非异常。无需进一步的操作。系统最终会恢复正常。不过,如果最终用户正在使用 Communications Express 客户机,将自动清除设置恢复为其默认值应该可以解决此问题。
本节介绍了如何在处于恢复模式时使损坏的数据库仍然可访问,包含以下主题:
如果遇到数据库损坏,一种防止服务中断的方法是将数据库置入只读模式。此模式允许最终用户读取数据库条目,但不允许添加、修改或删除。如果最终用户试图添加、修改或删除任何日历数据,系统将给出错误消息。另外,数据库处于只读模式时,用于添加、修改或删除日历事件和待办事项的管理员工具将不起作用。
如果数据库被损坏到无法读取的程度,则必须中断服务直到用备份进行了恢复。使用备份进行恢复的最快方法是拥有完好的紧急备份。参见22.5.8.1 恢复之前。
以有权更改此配置的管理员身份登录。
发布 stop-cal 命令停止 Calendar Server 服务。
在命令行处,转至 ics.conf 所在的目录:
cd /etc/opt/SUNWics5/config
将参数设置为如下形式以将日历指定为只读模式:
caldb.berkeleydb.readonly=”yes”
通过发出 start-cal 命令重新启动 Calendar Server。
cal-svr-base/SUNWics5/cal/sbin/start-cal
必须重新启动这些服务才能使 ics.conf 更改生效。
本节介绍了一些常见数据库故障,并提供了一些建议的修正方法。本节包含以下主题:
由于 csadmind 是处理组调度引擎 (Group Scheduling Engine, GSE) 和警报分发引擎的服务,因此,此故障可能是由 GSE 队列或警报队列中的违例条目引起的。
修正方法:
如果 csadmind 未处于运行状态,立即发出 stop-cal 命令。
保持日历服务器运行可能导致事务日志累积,从而进一步损坏数据库,并可能需要更长时间才能使事务日志文件与数据库一致。
验证是否已停止所有 Calendar Server 进程。
有关如何验证是否已停止所有进程的说明,参见停止子进程。
通过发出 start-cal -csadmind 命令来尝试再次重新启动 csadmind。
如果启动成功,通过执行以下步骤确保两个队列运行正常:
使用 csschedule 检查 GSE 队列。
使用 dbrig 检查警报队列。
有关运行 csschedule 和 dbrig 的说明,参见附录 D,Calendar Server 命令行实用程序参考。
如果 csadmind 发生转储故障,分析 pstack。
如果您在跟踪中发现任何与 GSE 相关的函数(这些函数将带有 GSE 字母),请查看 GSE 队列中的第一个条目和引用的事件数据库中的条目。通常情况下,GSE 条目中引用的事件就是违例条目。要解决此问题,请执行以下步骤:
使用 csschedule 删除 GSE 条目。
使用 cscomponents 从数据库中删除违例事件。
有关运行 csschedule 和 cscomponents 的说明,参见附录 D,Calendar Server 命令行实用程序参考。
如果条目未损坏,则可能是日历服务器无法处理的特殊故障。
请执行以下步骤:
拍下损坏的数据库的日历环境快照,并与客户支持联系。
要创建环境备份,请执行以下步骤:
为避免服务中断,请将日历数据库临时置入只读状态,并恢复为紧急备份副本。
将日历数据库临时置入只读状态,以防出现添加、修改或删除事务。最终用户尝试添加、修改或删除任何日历数据时,将收到错误消息。数据库处于只读模式时,用于添加、修改或删除日历事件和待办事项的管理员工具也将不起作用。
要将日历数据库置入只读模式,编辑 ics.conf 文件,按如下所示将指定参数设置为 "yes":
caldb.berkeleydb.readonly=”yes”
按照22.5.8 恢复自动备份副本中的说明,恢复为紧急备份副本。
配置并启用 csstored 之后,在几分钟的更新后即可使用紧急备份。还应当始终验证紧急备份副本以确保其未损坏。(运行 db_verify。)
如果所有修复操作均失败,请执行转储和重新装入过程以查看是否可以抢修数据库。
22.5.7 使用转储和装入过程来恢复日历数据库中介绍了此过程。
这种情况可能是由包含 Berkeley DB 数据库页面锁定的控制线程在退出时没有释放该锁定而引起的。要确认是否存在此问题,请针对 cshttpd 进程和 csadmind 运行 pstack。(pstack 是位于/usr/bin/pstack 中的标准 UNIX 实用程序)它应当显示为获取锁定而正在等待的线程。
要解决此问题,请重新启动 Calendar Server,如下所示:
数据库循环通常是由数据库文件损坏引起的。由于是数据库损坏,因此,它是不可修复的。有以下几种选择:
恢复为紧急备份。
如果是最近发生的损坏,则可以使用其中一个紧急备份。
使用灾难归档恢复过程。
有关建议的过程,请参见22.5.8 恢复自动备份副本。
使用转储和重新装入过程(22.5.7 使用转储和装入过程来恢复日历数据库)。
本节介绍了如何使用 csdb rebuild 命令,并包含以下主题:
rebuild 命令可以扫描日历数据库并检查日历属性 (calprops)、事件和待办事项(任务),以确定是否发生了损坏。如果 rebuild 命令发现冲突,它将在 cal-svr-base/SUNWics5/cal/sbin/rebuild_db 目录中重新建立一个日历数据库(.db 文件)。
如果未指定 -g 选项,rebuild 命令将重新建立除组调度引擎 (Group Scheduling Engine, GSE) 数据库之外的所有数据库。如果还要重新建立 GSE 数据库,请包含 -g 选项。
要确定 GSE 数据库中是否存在任何条目,运行 csschedule -v list 命令,然后在 GSE 处理完这些条目后再运行 rebuild 命令。
以具备管理权限的用户身份登录安装了 Calendar Server 的系统。
停止 Calendar Server。
制作日历数据库的副本并将其放到 /tmp/db 目录中。
只需复制数据库 (.db) 文件和日志 (log.*) 文件。无需复制任何共享 (__db.*) 文件。
转到 cal-svr-base/SUNWics5/cal/sbin 目录。
例如,在 Solaris 操作系统上,为转到默认目录,请输入:
cd /opt/SUNWics5/cal/sbin
如果 sbin 目录的磁盘空间不足,在其他目录中运行 rebuild 命令。
针对日历数据库副本运行 rebuild 命令:
./csdb rebuild /tmp/db /tmp/
如果未指定数据库路径,rebuild 将使用当前目录。/tmp/ 参数指定了重新建立的数据库所在的目录。
如果还要重新建立 GSE 数据库,则包含 -g 选项。
rebuild 命令会生成许多信息,所以考虑将所有输出结果(包括 stdout 和 stderr)重定向到一个文件中。
请始终使用最新的备份副本重建日历数据库。
但是,如果曾丢失大量数据,同时由于定期备份数据库而创建了多个副本,请从最新副本向最旧副本进行重建。(这样做的唯一缺点是已删除的日历组件将重新出现在重建数据库中。)
例如,如果目录 db_0601、db_0615 和 db_0629 中分别有三组备份日历数据库文件,按以下顺序运行 rebuild 命令:
./csdb rebuild db_0629 ./csdb rebuild db_0615 ./csdb rebuild db_0601 |
rebuild 命令然后会将重新建立的数据库写入 cal-svr-base/SUNWics5/cal/sbin/rebuild_db 目录中。
运行完 rebuild 命令后,查看 rebuild.out 文件中的输出结果。
如果重新建立成功,rebuild.out 文件中的最后一行应如下所示:
Calendar database has been rebuilt |
在上一步中验证重新建立成功后,将重新建立的数据库 (.db) 文件从 rebuild_db 目录复制到您的生产数据库中。
如果从已损坏的数据库中恢复了任何共享 (__db.*) 或日志 (log.*) 文件,请将它们移到其他目录中。
重新启动 Calendar Server。
以下示例显示了此命令及其生成的输出:
# ./csdb -g rebuild Building calprops based on component information. Please be patient, this may take a while... Scanning events database... 512 events scanned Scanning todos database... 34 todos scanned Scanning events database... 512 events scanned Scanning todos database... 34 todos scanned Scanning deletelog database... 15 deletelog entries scanned Scanning gse database... 21 gse entries scanned Scanning recurring database... 12 recurring entries scanned Successful components db scan Calendar database has been rebuilt Building components based on calprops information. Please be patient, this may take a while... Scanning calprops database to uncover events... 25 calendars scanned Scanning calprops database to uncover todos... 25 calendars scanned Successful calprops db scan Calendar database has been rebuilt |
以上样例输出显示了对事件和待办事项数据库扫描了两次。这不是错误。首次扫描是为了验证日历属性数据库中的信息,再次扫描是为了确保可以访问日历属性数据库。
本节包含以下主题:
使用转储和装入过程尝试恢复损坏的数据库。转储和装入过程使用 Berkeley 数据库 db_dump 和 db_load 实用程序,它们包含在 Calendar Server 的以下目录中:
cal-svr-base /SUNWics5/cal/tools/unsupported/bin
db_dump 实用程序读取数据库文件并将数据库条目写入输出文件,使用的格式与 db_load 实用程序兼容。
要获得有关 db_dump 和 db_load 实用程序的文档,访问 Sleepycat Software 公司的 Web 站点:
http://www.sleepycat.com/docs/utility/index.html
使用 db_dump 和 db_load 实用程序恢复数据库能否成功取决于数据库的损坏程度。可能需要使用多个 db_dump 选项才能成功恢复数据库。但如果数据库严重损坏,不可能再恢复,您可能需要恢复为最近一次完好的数据库紧急备份或归档备份。
在执行转储和装入过程之前,您的日历数据库必须为 Berkeley DB 版本 3.2.9 或更高版本。如果使用的是早期版本,需首先运行 cs5migrate 实用程序升级日历数据库。
要获得 cs5migrate 的最新版本,请与 Sun 技术支持联系。
以运行 Calendar Server 的用户和组(例如 icsuser 和 icsgroup)身份登录,或以超级用户 (root) 身份登录。
如果必要,请停止 Calendar Server。
使用 csbackup、Sun StorEdge Enterprise BackupTM 软件或 Legato Networker® 等实用程序备份损坏的数据库。
有关更多信息,请参阅第 17 章,备份和恢复 Calendar Server 数据。
使用 db_dump 实用程序转储每个损坏的数据库文件。
数据库文件包括 ics50calprops.db、ics50journals.db、ics50alarms.db、ics50events.db、ics50todos.db 和 ics50gse.db。
依次使用以下选项运行 db_dump,直到数据库恢复(或确定数据库无法恢复):
没有用于数据库稍微损坏的选项。
对于中等程度的数据库损坏,使用 -r 选项。
对于严重程度的数据库损坏,使用 -r 选项。-R 选项从损坏的数据库中转储的数据(包括不完整的记录和已删除的记录)比 -r 选项要多。
例如,运行 db_dump 时带上 -r 选项:
db_dump -r ics50events.db \> ics50events.db.txt
使用 db_load 实用程序将输出文件装入新数据库文件。
例如:
db_load new.ics50events.db < ics50events.db.txt
如果 db_load 报告奇数个关键字或数据条目,编辑 db_dump 输出文件,并删除多余的关键字或数据条目。然后再次运行 db_load。
对其他损坏的数据库文件重复以上两步。
也就是,对其他损坏的数据库文件运行 db_dump。
使用 csdb rebuild 命令重新建立已恢复的数据库文件,如22.5.6 重建损坏的日历数据库所述。
rebuild 完成后,再次查看输出文件中的输出结果。如果重新建立成功,rebuild.out 文件中的最后一行应如下所示:
Calendar database has been rebuilt |
如果 csdb rebuild 命令失败,则使用下一个 db_dump 选项(-r 或 -R)来转储数据库。
如果即使是 db_dump 的 -R 选项也无法恢复损坏的数据库,请与 Sun Microsystems 的技术支持或销售代表联系以获得帮助。在此期间,您可能需要恢复为数据库上次完好无损的备份。
如果已使用第 9 章,配置自动备份中所述的自动备份功能,则可以在动态数据库损坏时使用紧急备份副本。
本节介绍了如何恢复两个不同的自动备份:
在恢复备份之前,请确保您已经执行了以下操作:
尝试诊断动态数据库的损坏是由哪个事务引起的。
删除或更正了引起损坏的事务,这样新的归档将不会被损坏。
通过将损坏的数据库复制到另一个目录或可移动介质中来保留它。如果要与技术支持联系,这样做是必要的。
当动态数据库损坏时,紧急备份应当是首选的备份。要恢复紧急备份,请执行以下步骤:
标识损坏的动态数据库目录中的任何未应用或为写入而打开的日志文件。
关闭为写入打开的日志。它包含最新事务。
创建新的(恢复)目录。
将当前紧急备份副本复制到新的恢复数据库目录中。
将 log.* 文件从损坏的动态数据库目录中复制到新的恢复数据库目录中。
如果您要保留数据库的归档副本,请将尚未应用到动态数据库的日志复制到归档目录中,这样归档备份副本就完整了。
针对新的恢复数据库运行 db_recover,同时指定 -c -h 选项。
例如,如果新的恢复目录名为 recoverydb,则命令将如下所示:
db_recover -c -h recoverydb
将 log.* 文件保留在新的恢复目录中。
db_recover 程序将日志文件应用到新的恢复数据库,但是从 4.2 版开始,Berkeley DB 要求保留这些日志文件。
针对新的恢复目录中的数据库文件运行 db_verify。运行 db_verify:
使用这些命令停止 Calendar Server。
cd /opt/SUNWics5/cal/sbin
./stop-cal
使用此命令创建 Calendar Server 数据库 (csdb) 的另一个副本。
cp -Rp /var/opt/SUNWics5/csdb /var/opt/SUNWics5/csdb.db_verify
针对 csdb 的副本运行 db_verify。
请勿针对初始 csdb 运行 db_verify。
LD_LIBRARY_PATH=/opt/SUNWics5/cal/lib export LD_LIBRARY_PATH cd /opt/SUNWics5/cal/tools/unsupported/bin ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50alarms.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50calprops.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50events.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50gse.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50journals.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50recurring.db ./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50todos.db ./db_verify -o -h /var/opt/SUNWics5/csdb.db_verify ics50deletelog.db
针对 ics50deletelog.db 运行 db_verify,同时带上 -o 选项。
如果成功运行完成 db_verify,则不会收到任何错误消息。如果数据库文件已损坏,它会抛出错误消息。例如:
./db_verify -h /var/opt/SUNWics5/csdb.db_verify ics50todos.db db_verify:Page 612: last item on page sorted greater than parent entry db_verify: Page 612: incorrect next_pgno 885 found in leaf chain (should be 501) db_verify: Page 0: page 501 encountered a second time on free list db_verify: DB->verify: ics50todos.db: DB_VERIFY_BAD: Database verification failed |
针对新的恢复目录运行 csdb -v list。
如果新的恢复目录通过了上述全部三个恢复步骤,则损坏的旧动态数据库将替换为新的恢复数据库。
将新的动态数据库复制到紧急备份目录中以用作新快照。
所有新的日志都将应用到此副本中,直到拍下了下一个定期快照。
启动 Calendar Server。
如果新的恢复目录在任何一个步骤失败,则按如下所述确定未损坏的早期紧急备份:
从新到旧依次对每个紧急备份运行 db_verify 和 csdb -v list,以找到最近一个未损坏的副本。
可以将第一个找到的无损紧急备份副本恢复到动态数据库目录中。
用未损坏的紧急备份替换损坏的动态数据库,如恢复紧急备份所述。(请确保首先阅读22.5.8.1 恢复之前。)
如果所有紧急备份均已损坏且没有可供恢复的归档备份,请致电技术支持。如果具有归档备份,请执行恢复归档备份中的过程。(另请参见22.5.8.1 恢复之前。)
如果您没有未损坏的紧急备份,但有归档备份及其事务日志,则可以通过执行以下步骤来恢复最近未损坏版本的已归档数据库:
标识损坏的动态数据库目录中的任何未应用或为写入而打开的日志文件。
关闭为写入打开的日志。它包含最新事务。
创建新的(恢复)目录。
将最新的归档副本及其日志文件复制到新的恢复数据库目录中。
将任何未应用的 log.* 文件从已损坏的动态数据库目录复制到新的恢复数据库目录中。
针对新的恢复数据库运行 db_recover,同时指定 -c -h 选项。
例如,如果新的恢复目录名为 recoverydb,则命令将如下所示:
db_recover -c -h recoverydb
将 log.* 文件保留在新的恢复目录中。
db_recover 程序将日志文件应用到新的恢复数据库中,但是从 4.2 版开始,Berkeley DB 要求保留这些日志文件。
针对新的恢复目录中的数据库文件运行 db_verify。
恢复紧急备份过程中的步骤说明了如何运行 db_verify。
针对新的恢复目录运行 csdb -v list。
如果新的恢复目录通过了上述全部三个恢复步骤,则损坏的旧动态数据库将替换为新的恢复数据库。
将新的动态数据库复制到紧急备份目录中以用作新快照。
启动 Calendar Server。
如果新的恢复目录在任何一个步骤失败,则标识未损坏的早期归档备份,如下所述:
依次从新到旧对每个归档备份副本运行以下三个恢复程序,以找到最近一个未损坏的副本:db_recover -c-h、db_verify 和 csdb -v list。
可以将第一个找到的无损归档副本恢复到动态数据库目录中。
用未损坏的归档备份替换损坏的动态数据库,如恢复归档备份所述。
如果所有的归档备份均已损坏,请致电技术支持。
本节包括以下主题:
如果使用诸如 db_recover 之类的 Berkeley 数据库工具创建了自定义备份脚本,则在升级到 Calendar Server 后可能会发现该脚本不再工作。出现此问题的原因是早期版本的 Calendar Server 使用静态库来编译这些工具。而现在使用动态库 libdb-4.2.so 编译这些工具。
要将新的动态库与现有的自定义脚本结合使用,请设置以下全局变量,如下所示:
LD_LIBRARY_PATH=libdb-4.2.so