Sun Java System Calendar Server 6 2005Q4 管理指南

处理数据库问题

本节介绍了与日历服务器数据库有关的各种问题:

查找 Berkeley 数据库工具

所要采取的多数错误诊断步骤都需要您具有对 Berkeley 数据库实用程序的访问权限。虽然在 Calendar Server 包中提供了这些实用程序的某个版本,但它们不受支持。您可能希望直接从 Sleepycat Software (http://www.sleepycat.com) 上获得更多信息。

本节包含以下主题:

访问 Berkeley 数据库实用程序

设置并导出 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

验证一个或多个文件及其所包含的数据库的结构。 

Procedure检测和修复数据库死锁

如果 Berkeley 数据库处于死锁状态,则必须重置数据库。尽早检测到此状态是很重要的。

要使系统可以定期检查数据库以检测到死锁状态并通知管理员,请执行以下步骤:

步骤
  1. 以有权更改此配置的管理员身份登录。

  2. 转至 /etc/opt/SUNWics5/cal/config 目录。

  3. 通过复制和重命名旧的 ics.conf 文件来保存该文件。

  4. 如果必要,编辑 ics.conf 使其具有以下值:

    local.caldb.deadlock.autodetect=”yes”


    注 –

    将此参数设置为 "yes" 时,将启动用于监视锁定区域的 db_deadlock 守护进程。


检测数据库损坏

导致日历数据库损坏的原因有多种:系统资源争用、硬件错误、应用程序错误和数据库错误,当然还有人为错误。本节介绍了如何检测日历数据库损坏:

数据库损坏基本知识

没有人可以保证数据库不被损坏。但您可以最小化数据丢失和运行的停机时间。严密监视数据库和日历服务器是尽早检测到损坏的关键。频繁和完整的备份是在发现损坏后从损坏中恢复的关键。

日历数据库中有两种可能的损坏级别:

监视日志文件

查看 Calendar Server 日志文件(包括警报日志)中的错误消息,这些消息可能会表明数据库受到损坏。有关日志文件的信息,请参阅使用 Calendar Server 日志文件

应该定期查看日志文件,看是否发生了 ALERTCRITICALERRORWARNING 级别的错误,如果发现这些错误,请检查事件以找出 Calendar Server 操作可能出现的问题。在 Calendar Server 的正常操作过程中,系统会生成 NOTICEINFORMATION 级别的日志事件,以帮助您监视服务器的活动。

任何情况下都不要移除数据库目录中的任何事务日志文件。事务日志文件包含事务更新(添加、修改或删除),移除这些文件将损坏日历数据库,且无法恢复。


注 –

在请求 Calendar Server 技术支持时,可能需要您提供日志文件以协助解决问题。


使用 csmonitor

使用 csmonitor 实用程序可以监视 Calendar Server。如果该实用程序检测到问题(例如,检测到多个事务日志文件或日历数据库缺少磁盘空间),该实用程序将向管理员发送警报电子邮件。有关更多信息,请参见csmonitor

Procedure检查日历数据库的损坏

使用 check 命令可以扫描日历数据库,包括日历属性 (calprops) 和事件以及待办事件(任务),以查看其中是否存在损坏。如果使用 check 命令发现无法解决的冲突,则将在输出结果中报告该情况。

check 命令不检查警报或组调度引擎 (Group Scheduling Engine, GSE) 数据库中的损坏。

步骤
  1. 以具备管理权限的用户身份登录安装了 Calendar Server 的系统。

  2. Calendar Server 可以正在运行或已经停止,但最好停止 Calendar Server。

  3. 如果尚未备份,请备份日历数据库。

    只需复制数据库 (.db) 文件。无需复制任何共享 (__db.*) 文件或日志 (log.*) 文件。

  4. 转至 cal_svr_base/SUNWics5/cal/sbin 目录。

    例如,在 Solaris 操作系统上为转到默认目录,请输入:


    cd /opt/SUNWics5/cal/sbin
  5. 针对日历数据库副本运行 check 命令:


    ./csdb check dbdir /tmp/check.out 

    如果未指定 dbdir,则 check 命令将针对当前目录中的数据库。

    check 命令会生成许多信息,因此请考虑将所有输出结果(包括 stdoutstderr)重定向到一个文件中(如示例中所示)。

  6. 运行完 check 命令后,查看输出文件。如果数据库已损坏,请运行 rebuild 命令。

    (请参见重建损坏的日历数据库。)

防止在数据库损坏(只读模式)时服务中断

本节介绍了如何在处于恢复模式时使损坏的数据库仍然可访问,包含以下主题:

使用只读模式

如果遇到数据库损坏,一种防止服务中断的方法是将数据库置入只读模式。此模式允许最终用户读取数据库条目,但不允许添加、修改或删除。如果最终用户试图添加、修改或删除任何日历数据,系统将给出错误消息。另外,数据库处于只读模式时,用于添加、修改或删除日历事件和待办事件的管理员工具将不起作用。


注 –

如果数据库被损坏到无法读取的程度,则必须中断服务直到用备份进行了恢复。使用备份进行恢复的最快方法是拥有完好的热备份。请参见恢复之前


Procedure将数据库置入只读模式

步骤
  1. 当然这并不是必需的,您可能选择即刻停止日历服务以防止数据库受到进一步损坏。

    要停止日历服务,请使用以下命令:

    cal_svr_base/SUNWics5/cal/sbin/stop-cal

  2. 在命令行,转到 ics.conf 所在的目录:

    cd /etc/opt/SUNWics5/config

  3. 将日历数据库指定为只读模式:

    caldb.berkeleydb.readonly=”yes”

  4. 编辑完 ics.conf 文件后,重新启动 Calendar Server:

    cal_svr_base/SUNWics5/cal/sbin/start-cal

    必须重新启动这些服务才能使 ics.conf 更改生效。

处理常见数据库故障

本节介绍了一些常见数据库故障,并提供了一些建议的修正方法。本节包含以下主题:

Procedurecsadmind 不启动或在启动过程中崩溃

由于 csadmind 是处理组调度引擎 (Group Scheduling Engine, GSE) 和警报分发引擎的服务,因此,此故障可能是由 GSE 队列或警报队列中的违例条目引起的。

修正方法:

步骤
  1. 如果 csadmind 未运行,则立即发出 stop-cal

    保持日历服务器运行可能导致事务日志累积,从而进一步损坏数据库,并可能需要更长时间才能使事务日志文件与数据库一致。

  2. 尝试再次重新启动 csadmind(再次重新发出 start-cal)。

    如果启动成功,请通过以下操作确保这两个队列正常运行:

    1. 使用 csschedule 检查 GSE 队列。

    2. 使用 dbrig 检查警报队列。

      有关运行 csscheduledbrig 的说明,请参见附录 D,Calendar Server 命令行实用程序参考

  3. 如果 csadmind 发生转储故障,请分析 pstack

    如果您在跟踪中发现任何与 GSE 相关的函数(这些函数将带有 GSE 字母),请查看 GSE 队列中的第一个条目和引用的事件数据库中的条目。通常情况下,GSE 条目中引用的事件就是违例条目。要解决此问题,请执行以下步骤:

    1. 使用 csschedule 删除 GSE 条目。

    2. 使用 cscomponents 从数据库中删除违例事件。

      有关运行 csschedulecscomponents 的说明,请参见附录 D,Calendar Server 命令行实用程序参考

  4. 如果条目未损坏,则可能是日历服务器无法处理的特殊故障。

    请执行以下步骤:

    1. 拍下损坏的数据库的日历环境快照,并与客户支持联系。

      要创建环境备份,请执行以下步骤:

      1. 使用 db_checkpoint 实用程序(位于:

        cal_svr_base/SUNWics5/cal/tools/unsupported/bin/db_checkpoint

      2. 运行 db_archive -s

        使用 -s 选项确定所有数据库文件,并将其复制到可移动介质(例如 CD、DVD 或磁带)中。

      3. 运行 db_archive -l

        使用 -l 选项确定所有日志文件,并将未应用的日志文件复制到可移动介质设备中。

    2. 为避免服务中断,请将日历数据库临时置入只读状态,并恢复为热备份副本。

      • 将日历数据库临时置入只读状态,以防出现添加、修改或删除事务。最终用户尝试添加、修改或删除任何日历数据时,将收到错误消息。数据库处于只读模式时,用于添加、修改或删除日历事件和待办事件的管理员工具也将不起作用。

        要将日历数据库置入只读模式,请编辑 ics.conf 文件,按如下所示将指定参数设置为 "yes"

        caldb.berkeleydb.readonly=”yes”

      • 按照恢复自动备份副本中的说明,恢复为热备份副本。

        配置并启用 csstored 之后,在几分钟的更新后即可使用热备份。还应当始终验证热备份副本以确保其未损坏。(运行 db_verify。)

  5. 如果所有修复操作均失败,请执行转储和重新装入过程以查看是否可以抢修数据库。

    使用转储和装入过程来恢复日历数据库中介绍了此过程。

Procedure服务已挂起,最终用户无法连接—孤立的锁定

这种情况可能是由包含 Berkeley DB 数据库页面锁定的控制线程在退出时没有释放该锁定而引起的。要确认是否存在此问题,请针对 cshttpd 进程和 csadmind 运行 pstack。(pstack 是位于 /usr/bin/pstack 中的标准 UNIX 实用程序)它应当显示为获取锁定而正在等待的线程。

要解决此问题,请重新启动 Calendar Server,如下所示:

步骤
  1. 转到 start-cal 所在的目录。

    cd cal_svr_base/SUNWics5/cal/sbin

  2. 发出 start-cal 命令。

    ./start-cal

Procedurecsdb 的重新建立总不停止—数据库循环

数据库循环通常是由数据库文件损坏引起的。由于是数据库损坏,因此,它是不可修复的。有以下几种选择:

步骤
  1. 恢复为热备份。

    如果是最近发生的损坏,则可以使用其中一个热备份。

  2. 使用灾难归档恢复过程。

    有关建议的过程,请参见恢复自动备份副本

  3. 使用转储和重新装入过程(使用转储和装入过程来恢复日历数据库)。

重建损坏的日历数据库

本节介绍了如何使用 csdb rebuild 命令,并包含以下主题:

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 命令。

Procedure重建日历数据库

步骤
  1. 以具备管理权限的用户身份登录安装了 Calendar Server 的系统。

  2. 停止 Calendar Server。

  3. 制作日历数据库的副本并将其放到 /tmp/db 目录中。

    只需复制数据库 (.db) 文件和日志 (log.*) 文件。无需复制任何共享 (__db.*) 文件。

  4. 转至 cal_svr_base/SUNWics5/cal/sbin 目录。

    例如,在 Solaris 操作系统上,为转到默认目录,请输入:


    cd /opt/SUNWics5/cal/sbin

    注 –

    如果 sbin 目录的磁盘空间不足,请在其他目录中运行 rebuild 命令。


  5. 针对日历数据库副本运行 rebuild 命令:


    ./csdb rebuild /tmp/db /tmp/

    如果未指定数据库路径,rebuild 将使用当前目录。/tmp/ 参数指定了重新建立的数据库所在的目录。

    如果还要重新建立 GSE 数据库,请包含 -g 选项。

    rebuild 命令会生成许多信息,所以请考虑将所有输出结果(包括 stdoutstderr)重定向到一个文件中。


    注 –

    请始终使用最新的备份副本重建日历数据库。

    但是,如果曾丢失大量数据,同时由于定期备份数据库而创建了多个副本,请从最新副本向最旧副本进行重建。(这样做的唯一缺点是已删除的日历组件将重新出现在重建数据库中。)

    例如,如果目录 db_0601db_0615db_0629 中分别有三组备份日历数据库文件,请按以下顺序运行 rebuild 命令:


    ./csdb rebuild db_0629 
    ./csdb rebuild db_0615 
    ./csdb rebuild db_0601

    rebuild 命令然后会将重新建立的数据库写入 cal_svr_base/SUNWics5/cal/sbin/rebuild_db 目录中。


  6. 运行完 rebuild 命令后,查看rebuild.out 文件中的输出结果。

    如果重新建立成功,rebuild.out 文件中的最后一行应如下所示:


    Calendar database has been rebuilt
  7. 在上一步中验证重新建立成功后,将重新建立的数据库 (.db) 文件从 rebuild_db 目录复制到您的生产数据库中。

  8. 如果从已损坏的数据库中恢复了任何共享 (__db.*) 或日志 (log.*) 文件,请将它们移到其他目录中。

  9. 重新启动 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_dumpdb_load 实用程序,它们包含在 Calendar Server 的以下目录中:


cal_svr_base/SUNWics5/cal/tools/unsupported/bin

db_dump 实用程序读取数据库文件并将数据库条目写入输出文件,使用的格式与 db_load 实用程序兼容。

要获得有关 db_dumpdb_load 实用程序的文档,请访问 Sleepycat Software 公司的 Web 站点:

http://www.sleepycat.com/docs/utility/index.html

使用 db_dumpdb_load 实用程序恢复数据库能否成功取决于数据库的损坏程度。可能需要使用多个 db_dump 选项才能成功恢复数据库。但如果数据库严重损坏,不可能再恢复,您可能需要恢复为最近一次完好的数据库热备份或归档备份。


注 –

在执行转储和装入过程之前,您的日历数据库必须为 Berkeley DB version 3.2.9 版本或更高版本。如果使用的是早期版本,请首先运行 cs5migrate 实用程序升级日历数据库。

要获得 cs5migrate 的最新版本,请与 Sun 技术支持联系。


Procedure执行转储和装入过程

步骤
  1. 以运行 Calendar Server 的用户和组(例如 icsusericsgroup)身份登录,或以超级用户 (root) 身份登录。

  2. 如果必要,请停止 Calendar Server。

  3. 使用 csbackup、Sun StorEdge Enterprise BackupTM 软件或 Legato Networker® 等实用程序备份损坏的数据库。

    有关更多信息,请参阅第 17 章,备份和恢复 Calendar Server 数据

  4. 使用 db_dump 实用程序转储每个损坏的数据库文件。

    数据库文件包括 ics50calprops.dbics50journals.dbics50alarms.dbics50events.dbics50todos.dbics50gse.db

    依次使用以下选项运行 db_dump,直到数据库恢复(或确定数据库无法恢复):

    • 没有用于数据库稍微损坏的选项。

    • 对于中等程度的数据库损坏,请使用 -r 选项

    • 对于严重程度的数据库损坏,请使用 -R 选项-R 选项从损坏的数据库中转储的数据(包括不完整的记录和已删除的记录)比 -r 选项要多。

      例如,运行 db_dump 时带上 -r 选项:


      db_dump -r ics50events.db \> ics50events.db.txt
  5. 使用 db_load 实用程序将输出文件装入新数据库文件。

    例如:


    db_load new.ics50events.db < ics50events.db.txt

    如果 db_load 报告奇数个关键字或数据条目,请编辑 db_dump 输出文件,并删除多余的关键字或数据条目。然后再次运行 db_load

  6. 对其他损坏的数据库文件重复以上两步。

    也就是,对其他损坏的数据库文件运行 db_dump

  7. 使用 csdb rebuild 命令重新建立已恢复的数据库文件,如重建损坏的日历数据库所述。

    rebuild 完成后,再次查看输出文件中的输出结果。如果重新建立成功,rebuild.out 文件中的最后一行应如下所示:


    Calendar database has been rebuilt

    如果 csdb rebuild 命令失败,则使用下一个 db_dump 选项(-r-R)来转储数据库。

    如果即使是 db_dump-R 选项也无法恢复损坏的数据库,请与 Sun Microsystems 的技术支持或销售代表联系以获得帮助。在此期间,您可能需要恢复为数据库上次完好无损的备份。

恢复自动备份副本

如果已使用第 10 章,配置自动备份 (csstored)中所述的自动备份功能,则可以在动态数据库损坏时使用热备份副本。

本节介绍了如何恢复两个不同的自动备份:

恢复之前

在恢复备份之前,请确保您已经执行了以下操作:

Procedure恢复热备份

当动态数据库损坏时,热备份应当是首选的备份。要恢复热备份,请执行以下步骤:

步骤
  1. 标识损坏的动态数据库目录中的任何未应用或为写入而打开的日志文件。

  2. 关闭为写入打开的日志。它包含最新事务。

  3. 创建新的(恢复)目录。

  4. 将当前热备份副本复制到新的恢复数据库目录中。

  5. log.* 文件从损坏的动态数据库目录中复制到新的恢复数据库目录中。

  6. 如果您要保留数据库的归档副本,请将尚未应用到动态数据库的日志复制到归档目录中,这样归档备份副本就完整了。

  7. 针对新的恢复数据库运行 db_recover,同时指定 -c -h 选项。

    例如,如果新的恢复目录名为 recoverydb,则命令将如下所示:

    db_recover -c -h recoverydb

  8. log.* 文件保留在新的恢复目录中。

    db_recover 程序将日志文件应用到新的恢复数据库,但是从 4.2 版开始,Berkeley DB 要求保留这些日志文件。

  9. 针对新的恢复目录中的数据库文件运行 db_verify

    有关说明,请参见检查日历数据库的损坏

  10. 针对新的恢复目录运行 csdb -v list

  11. 如果新的恢复目录通过了上述全部三个恢复步骤,则损坏的旧动态数据库将替换为新的恢复数据库。

  12. 将新的动态数据库复制到热备份目录中以用作新快照。

    所有新的日志都将应用到此副本中,直到拍下了下一个定期快照。

  13. 启动 Calendar Server。

  14. 如果新的恢复目录在任何一个步骤失败,则按如下所述确定未损坏的早期热备份:

    1. 从新到旧依次对每个热备份运行 db_verifycsdb -v list ,以找到最近一个未损坏的副本。

    2. 可以将第一个找到的无损热备份副本恢复到动态数据库目录中。

      用未损坏的热备份替换损坏的动态数据库,如恢复热备份所述。(请确保首先阅读恢复之前。)

    3. 如果所有热备份均已损坏且没有可供恢复的归档备份,请致电技术支持。如果具有归档备份,请执行恢复归档备份中的过程。(另请参见恢复之前。)

Procedure恢复归档备份

如果您没有未损坏的热备份,但有归档备份及其事务日志,则可以通过执行以下步骤来恢复最近未损坏版本的已归档数据库:

步骤
  1. 标识损坏的动态数据库目录中的任何未应用或为写入而打开的日志文件。

  2. 关闭为写入打开的日志。它包含最新事务。

  3. 创建新的(恢复)目录。

  4. 将最新的归档副本及其日志文件复制到新的恢复数据库目录中。

  5. 将任何未应用的 log.* 文件从已损坏的动态数据库目录中复制到新的恢复数据库目录中。

  6. 针对新的恢复数据库运行 db_recover,同时指定 -c -h 选项。

    例如,如果新的恢复目录名为 recoverydb,则命令将如下所示:

    db_recover -c -h recoverydb

  7. log.* 文件保留在新的恢复目录中。

    db_recover 程序将日志文件应用到新的恢复数据库中,但是从 4.2 版开始,Berkeley DB 要求保留这些日志文件。

  8. 针对新的恢复目录中的数据库文件运行 db_verify

    有关说明,请参见检查日历数据库的损坏

  9. 针对新的恢复目录运行 csdb -v list

  10. 如果新的恢复目录通过了上述全部三个恢复步骤,则损坏的旧动态数据库将替换为新的恢复数据库。

  11. 将新的动态数据库复制到热备份目录中以用作新快照。

  12. 启动 Calendar Server。

  13. 如果新的恢复目录在任何一个步骤失败,则标识未损坏的早期归档备份,如下所述:

    1. 依次从新到旧对每个归档备份副本运行以下三个恢复程序,以找到最近一个未损坏的副本:db_recover -c-hdb_verifycsdb -v list

    2. 可以将第一个找到的无损归档副本恢复到动态数据库目录中。

      用未损坏的归档备份替换损坏的动态数据库,如恢复归档备份所述。

    3. 如果所有的归档备份均已损坏,请致电技术支持。

修复自定义备份脚本

本节包括以下主题:

现在使用动态库编译 Berkeley 工具

如果使用诸如 db_recover 之类的 Berkeley 数据库工具创建了自定义备份脚本,则在升级到 Calendar Server 后可能会发现该脚本不再工作。出现此问题的原因是早期版本的 Calendar Server 使用静态库来编译这些工具。而现在使用动态库 libdb-4.2.so 编译这些工具。

修复自定义备份脚本

要将新的动态库与现有的自定义脚本结合使用,请设置以下全局变量,如下所示:

LD_LIBRARY_PATH=libdb-4.2.so