db_recover.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char copyright[] =
  10.     "Copyright (c) 1996-2000nSleepycat Software Inc.  All rights reserved.n";
  11. static const char revid[] =
  12.     "$Id: db_recover.c,v 11.17 2001/01/18 18:36:58 bostic Exp $";
  13. #endif
  14. #ifndef NO_SYSTEM_INCLUDES
  15. #include <sys/types.h>
  16. #if TIME_WITH_SYS_TIME
  17. #include <sys/time.h>
  18. #include <time.h>
  19. #else
  20. #if HAVE_SYS_TIME_H
  21. #include <sys/time.h>
  22. #else
  23. #include <time.h>
  24. #endif
  25. #endif
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <unistd.h>
  29. #endif
  30. #include "db_int.h"
  31. #include "common_ext.h"
  32. #include "txn.h"
  33. int  main __P((int, char *[]));
  34. void  read_timestamp __P((char *, time_t *));
  35. void  usage __P((void));
  36. void  version_check __P((void));
  37. DB_ENV *dbenv;
  38. const char
  39. *progname = "db_recover"; /* Program name. */
  40. int
  41. main(argc, argv)
  42. int argc;
  43. char *argv[];
  44. {
  45. extern char *optarg;
  46. extern int optind;
  47. DB_TXNREGION *region;
  48. time_t now, timestamp;
  49. u_int32_t flags;
  50. int ch, exitval, fatal_recover, ret, verbose;
  51. char *home;
  52. version_check();
  53. home = NULL;
  54. timestamp = 0;
  55. exitval = fatal_recover = verbose = 0;
  56. while ((ch = getopt(argc, argv, "ch:t:Vv")) != EOF)
  57. switch (ch) {
  58. case 'c':
  59. fatal_recover = 1;
  60. break;
  61. case 'h':
  62. home = optarg;
  63. break;
  64. case 't':
  65. read_timestamp(optarg, &timestamp);
  66. break;
  67. case 'V':
  68. printf("%sn", db_version(NULL, NULL, NULL));
  69. exit(0);
  70. case 'v':
  71. verbose = 1;
  72. break;
  73. case '?':
  74. default:
  75. usage();
  76. }
  77. argc -= optind;
  78. argv += optind;
  79. if (argc != 0)
  80. usage();
  81. /* Handle possible interruptions. */
  82. __db_util_siginit();
  83. /*
  84.  * Create an environment object and initialize it for error
  85.  * reporting.
  86.  */
  87. if ((ret = db_env_create(&dbenv, 0)) != 0) {
  88. fprintf(stderr,
  89.     "%s: db_env_create: %sn", progname, db_strerror(ret));
  90. exit (1);
  91. }
  92. dbenv->set_errfile(dbenv, stderr);
  93. dbenv->set_errpfx(dbenv, progname);
  94. if (verbose) {
  95. (void)dbenv->set_verbose(dbenv, DB_VERB_RECOVERY, 1);
  96. (void)dbenv->set_verbose(dbenv, DB_VERB_CHKPOINT, 1);
  97. }
  98. if (timestamp &&
  99.     (ret = dbenv->set_tx_timestamp(dbenv, &timestamp)) != 0) {
  100. dbenv->err(dbenv, ret, "DBENV->set_timestamp");
  101. goto shutdown;
  102. }
  103. /*
  104.  * Initialize the environment -- we don't actually do anything
  105.  * else, that all that's needed to run recovery.
  106.  *
  107.  * Note that we specify a private environment, as we're about to
  108.  * create a region, and we don't want to to leave it around.  If
  109.  * we leave the region around, the application that should create
  110.  * it will simply join it instead, and will then be running with
  111.  * incorrectly sized (and probably terribly small) caches.
  112.  */
  113. flags = 0;
  114. LF_SET(DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG |
  115.     DB_INIT_MPOOL | DB_INIT_TXN | DB_PRIVATE | DB_USE_ENVIRON);
  116. LF_SET(fatal_recover ? DB_RECOVER_FATAL : DB_RECOVER);
  117. if ((ret = dbenv->open(dbenv, home, flags, 0)) != 0) {
  118. dbenv->err(dbenv, ret, "DBENV->open");
  119. goto shutdown;
  120. }
  121. if (verbose) {
  122. (void)time(&now);
  123. region = ((DB_TXNMGR *)dbenv->tx_handle)->reginfo.primary;
  124. dbenv->errx(dbenv, "Recovery complete at %.24s", ctime(&now));
  125. dbenv->errx(dbenv, "%s %lx %s [%lu][%lu]",
  126.     "Maximum transaction id", (u_long)region->last_txnid,
  127.     "Recovery checkpoint", (u_long)region->last_ckp.file,
  128.     (u_long)region->last_ckp.offset);
  129. }
  130. if (0) {
  131. shutdown: exitval = 1;
  132. }
  133. /* Clean up the environment. */
  134. if ((ret = dbenv->close(dbenv, 0)) != 0) {
  135. exitval = 1;
  136. fprintf(stderr,
  137.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  138. }
  139. /* Resend any caught signal. */
  140. __db_util_sigresend();
  141. return (exitval);
  142. }
  143. #define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
  144. /*
  145.  * read_timestamp --
  146.  * Convert a time argument to Epoch seconds.
  147.  *
  148.  * Copyright (c) 1993
  149.  * The Regents of the University of California.  All rights reserved.
  150.  *
  151.  * Redistribution and use in source and binary forms, with or without
  152.  * modification, are permitted provided that the following conditions
  153.  * are met:
  154.  * 1. Redistributions of source code must retain the above copyright
  155.  *    notice, this list of conditions and the following disclaimer.
  156.  * 2. Redistributions in binary form must reproduce the above copyright
  157.  *    notice, this list of conditions and the following disclaimer in the
  158.  *    documentation and/or other materials provided with the distribution.
  159.  * 3. Neither the name of the University nor the names of its contributors
  160.  *    may be used to endorse or promote products derived from this software
  161.  *    without specific prior written permission.
  162.  *
  163.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  164.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  165.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  166.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  167.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  168.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  169.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  170.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  171.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  172.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  173.  * SUCH DAMAGE.
  174.  */
  175. void
  176. read_timestamp(arg, timep)
  177. char *arg;
  178. time_t *timep;
  179. {
  180. struct tm *t;
  181. time_t now;
  182. int yearset;
  183. char *p;
  184. /* Start with the current time. */
  185. (void)time(&now);
  186. if ((t = localtime(&now)) == NULL) {
  187. fprintf(stderr,
  188.     "%s: localtime: %sn", progname, strerror(errno));
  189. exit (1);
  190. }
  191. /* [[CC]YY]MMDDhhmm[.SS] */
  192. if ((p = strchr(arg, '.')) == NULL)
  193. t->tm_sec = 0; /* Seconds defaults to 0. */
  194. else {
  195. if (strlen(p + 1) != 2)
  196. goto terr;
  197. *p++ = '';
  198. t->tm_sec = ATOI2(p);
  199. }
  200. yearset = 0;
  201. switch(strlen(arg)) {
  202. case 12: /* CCYYMMDDhhmm */
  203. t->tm_year = ATOI2(arg);
  204. t->tm_year *= 100;
  205. yearset = 1;
  206. /* FALLTHOUGH */
  207. case 10: /* YYMMDDhhmm */
  208. if (yearset) {
  209. yearset = ATOI2(arg);
  210. t->tm_year += yearset;
  211. } else {
  212. yearset = ATOI2(arg);
  213. if (yearset < 69)
  214. t->tm_year = yearset + 2000;
  215. else
  216. t->tm_year = yearset + 1900;
  217. }
  218. t->tm_year -= 1900; /* Convert to UNIX time. */
  219. /* FALLTHROUGH */
  220. case 8: /* MMDDhhmm */
  221. t->tm_mon = ATOI2(arg);
  222. --t->tm_mon; /* Convert from 01-12 to 00-11 */
  223. t->tm_mday = ATOI2(arg);
  224. t->tm_hour = ATOI2(arg);
  225. t->tm_min = ATOI2(arg);
  226. break;
  227. default:
  228. goto terr;
  229. }
  230. t->tm_isdst = -1; /* Figure out DST. */
  231. *timep = mktime(t);
  232. if (*timep == -1) {
  233. terr: fprintf(stderr,
  234. "%s: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]",
  235.     progname);
  236. exit (1);
  237. }
  238. }
  239. void
  240. usage()
  241. {
  242. (void)fprintf(stderr,
  243.     "usage: db_recover [-cVv] [-h home] [-t [[CC]YY]MMDDhhmm[.SS]]n");
  244. exit(1);
  245. }
  246. void
  247. version_check()
  248. {
  249. int v_major, v_minor, v_patch;
  250. /* Make sure we're loaded with the right version of the DB library. */
  251. (void)db_version(&v_major, &v_minor, &v_patch);
  252. if (v_major != DB_VERSION_MAJOR ||
  253.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  254. fprintf(stderr,
  255. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  256.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  257.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  258. exit (1);
  259. }
  260. }