⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pg_resetxlog.c

📁 PostgreSQL7.4.6 for Linux
💻 C
📖 第 1 页 / 共 2 页
字号:
		return true;	}	/* Looks like it's a mess. */	fprintf(stderr, _("%s: pg_control exists but is broken or unknown version; ignoring it\n"),			progname);	return false;}/* * Guess at pg_control values when we can't read the old ones. */static voidGuessControlValues(void){	char	   *localeptr;	/*	 * Set up a completely default set of pg_control values.	 */	guessed = true;	memset(&ControlFile, 0, sizeof(ControlFile));	ControlFile.pg_control_version = PG_CONTROL_VERSION;	ControlFile.catalog_version_no = CATALOG_VERSION_NO;	ControlFile.checkPointCopy.redo.xlogid = 0;	ControlFile.checkPointCopy.redo.xrecoff = SizeOfXLogPHD;	ControlFile.checkPointCopy.undo = ControlFile.checkPointCopy.redo;	ControlFile.checkPointCopy.ThisStartUpID = 0;	ControlFile.checkPointCopy.nextXid = (TransactionId) 514;	/* XXX */	ControlFile.checkPointCopy.nextOid = BootstrapObjectIdData;	ControlFile.checkPointCopy.time = time(NULL);	ControlFile.state = DB_SHUTDOWNED;	ControlFile.time = time(NULL);	ControlFile.logId = 0;	ControlFile.logSeg = 1;	ControlFile.checkPoint = ControlFile.checkPointCopy.redo;	ControlFile.blcksz = BLCKSZ;	ControlFile.relseg_size = RELSEG_SIZE;	ControlFile.nameDataLen = NAMEDATALEN;	ControlFile.funcMaxArgs = FUNC_MAX_ARGS;#ifdef HAVE_INT64_TIMESTAMP	ControlFile.enableIntTimes = TRUE;#else	ControlFile.enableIntTimes = FALSE;#endif	ControlFile.localeBuflen = LOCALE_NAME_BUFLEN;	localeptr = setlocale(LC_COLLATE, "");	if (!localeptr)	{		fprintf(stderr, _("%s: invalid LC_COLLATE setting\n"), progname);		exit(1);	}	StrNCpy(ControlFile.lc_collate, localeptr, LOCALE_NAME_BUFLEN);	localeptr = setlocale(LC_CTYPE, "");	if (!localeptr)	{		fprintf(stderr, _("%s: invalid LC_CTYPE setting\n"), progname);		exit(1);	}	StrNCpy(ControlFile.lc_ctype, localeptr, LOCALE_NAME_BUFLEN);	/*	 * XXX eventually, should try to grovel through old XLOG to develop	 * more accurate values for startupid, nextXID, and nextOID.	 */}/* * Print the guessed pg_control values when we had to guess. * * NB: this display should be just those fields that will not be * reset by RewriteControlFile(). */static voidPrintControlValues(bool guessed){	if (guessed)		printf(_("Guessed pg_control values:\n\n"));	else		printf(_("pg_control values:\n\n"));	printf(_("pg_control version number:            %u\n"), ControlFile.pg_control_version);	printf(_("Catalog version number:               %u\n"), ControlFile.catalog_version_no);	printf(_("Current log file ID:                  %u\n"), ControlFile.logId);	printf(_("Next log file segment:                %u\n"), ControlFile.logSeg);	printf(_("Latest checkpoint's StartUpID:        %u\n"), ControlFile.checkPointCopy.ThisStartUpID);	printf(_("Latest checkpoint's NextXID:          %u\n"), ControlFile.checkPointCopy.nextXid);	printf(_("Latest checkpoint's NextOID:          %u\n"), ControlFile.checkPointCopy.nextOid);	printf(_("Database block size:                  %u\n"), ControlFile.blcksz);	printf(_("Blocks per segment of large relation: %u\n"), ControlFile.relseg_size);	printf(_("Maximum length of identifiers:        %u\n"), ControlFile.nameDataLen);	printf(_("Maximum number of function arguments: %u\n"), ControlFile.funcMaxArgs);	printf(_("Date/time type storage:               %s\n"),		   (ControlFile.enableIntTimes ? _("64-bit integers") : _("floating-point numbers")));	printf(_("Maximum length of locale name:        %u\n"), ControlFile.localeBuflen);	printf(_("LC_COLLATE:                           %s\n"), ControlFile.lc_collate);	printf(_("LC_CTYPE:                             %s\n"), ControlFile.lc_ctype);}/* * Write out the new pg_control file. */static voidRewriteControlFile(void){	int			fd;	char		buffer[BLCKSZ]; /* need not be aligned */	/*	 * Adjust fields as needed to force an empty XLOG starting at the next	 * available segment.	 */	newXlogId = ControlFile.logId;	newXlogSeg = ControlFile.logSeg;	/* be sure we wrap around correctly at end of a logfile */	NextLogSeg(newXlogId, newXlogSeg);	ControlFile.checkPointCopy.redo.xlogid = newXlogId;	ControlFile.checkPointCopy.redo.xrecoff =		newXlogSeg * XLogSegSize + SizeOfXLogPHD;	ControlFile.checkPointCopy.undo = ControlFile.checkPointCopy.redo;	ControlFile.checkPointCopy.time = time(NULL);	ControlFile.state = DB_SHUTDOWNED;	ControlFile.time = time(NULL);	ControlFile.logId = newXlogId;	ControlFile.logSeg = newXlogSeg + 1;	ControlFile.checkPoint = ControlFile.checkPointCopy.redo;	ControlFile.prevCheckPoint.xlogid = 0;	ControlFile.prevCheckPoint.xrecoff = 0;	/* Contents are protected with a CRC */	INIT_CRC64(ControlFile.crc);	COMP_CRC64(ControlFile.crc,			   (char *) &ControlFile + sizeof(crc64),			   sizeof(ControlFileData) - sizeof(crc64));	FIN_CRC64(ControlFile.crc);	/*	 * We write out BLCKSZ bytes into pg_control, zero-padding the excess	 * over sizeof(ControlFileData).  This reduces the odds of	 * premature-EOF errors when reading pg_control.  We'll still fail	 * when we check the contents of the file, but hopefully with a more	 * specific error than "couldn't read pg_control".	 */	if (sizeof(ControlFileData) > BLCKSZ)	{		fprintf(stderr,				_("%s: internal error -- sizeof(ControlFileData) is too large ... fix xlog.c\n"),				progname);		exit(1);	}	memset(buffer, 0, BLCKSZ);	memcpy(buffer, &ControlFile, sizeof(ControlFileData));	unlink(ControlFilePath);	fd = open(ControlFilePath, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, S_IRUSR | S_IWUSR);	if (fd < 0)	{		fprintf(stderr, _("%s: could not create pg_control file: %s\n"),				progname, strerror(errno));		exit(1);	}	errno = 0;	if (write(fd, buffer, BLCKSZ) != BLCKSZ)	{		/* if write didn't set errno, assume problem is no disk space */		if (errno == 0)			errno = ENOSPC;		fprintf(stderr, _("%s: could not write pg_control file: %s\n"),				progname, strerror(errno));		exit(1);	}	if (fsync(fd) != 0)	{		fprintf(stderr, _("%s: fsync error: %s\n"), progname, strerror(errno));		exit(1);	}	close(fd);}/* * Remove existing XLOG files */static voidKillExistingXLOG(void){	DIR		   *xldir;	struct dirent *xlde;	char		path[MAXPGPATH];	xldir = opendir(XLogDir);	if (xldir == NULL)	{		fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),				progname, XLogDir, strerror(errno));		exit(1);	}	errno = 0;	while ((xlde = readdir(xldir)) != NULL)	{		if (strlen(xlde->d_name) == 16 &&			strspn(xlde->d_name, "0123456789ABCDEF") == 16)		{			snprintf(path, MAXPGPATH, "%s/%s", XLogDir, xlde->d_name);			if (unlink(path) < 0)			{				fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"),						progname, path, strerror(errno));				exit(1);			}		}		errno = 0;	}	if (errno)	{		fprintf(stderr, _("%s: could not read from directory \"%s\": %s\n"),				progname, XLogDir, strerror(errno));		exit(1);	}	closedir(xldir);}/* * Write an empty XLOG file, containing only the checkpoint record * already set up in ControlFile. */static voidWriteEmptyXLOG(void){	char	   *buffer;	XLogPageHeader page;	XLogRecord *record;	crc64		crc;	char		path[MAXPGPATH];	int			fd;	int			nbytes;	/* Use malloc() to ensure buffer is MAXALIGNED */	buffer = (char *) malloc(BLCKSZ);	page = (XLogPageHeader) buffer;	/* Set up the first page with initial record */	memset(buffer, 0, BLCKSZ);	page->xlp_magic = XLOG_PAGE_MAGIC;	page->xlp_info = 0;	page->xlp_sui = ControlFile.checkPointCopy.ThisStartUpID;	page->xlp_pageaddr.xlogid =		ControlFile.checkPointCopy.redo.xlogid;	page->xlp_pageaddr.xrecoff =		ControlFile.checkPointCopy.redo.xrecoff - SizeOfXLogPHD;	record = (XLogRecord *) ((char *) page + SizeOfXLogPHD);	record->xl_prev.xlogid = 0;	record->xl_prev.xrecoff = 0;	record->xl_xact_prev = record->xl_prev;	record->xl_xid = InvalidTransactionId;	record->xl_len = sizeof(CheckPoint);	record->xl_info = XLOG_CHECKPOINT_SHUTDOWN;	record->xl_rmid = RM_XLOG_ID;	memcpy(XLogRecGetData(record), &ControlFile.checkPointCopy,		   sizeof(CheckPoint));	INIT_CRC64(crc);	COMP_CRC64(crc, &ControlFile.checkPointCopy, sizeof(CheckPoint));	COMP_CRC64(crc, (char *) record + sizeof(crc64),			   SizeOfXLogRecord - sizeof(crc64));	FIN_CRC64(crc);	record->xl_crc = crc;	/* Write the first page */	XLogFileName(path, newXlogId, newXlogSeg);	unlink(path);	fd = open(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,			  S_IRUSR | S_IWUSR);	if (fd < 0)	{		fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),				progname, path, strerror(errno));		exit(1);	}	errno = 0;	if (write(fd, buffer, BLCKSZ) != BLCKSZ)	{		/* if write didn't set errno, assume problem is no disk space */		if (errno == 0)			errno = ENOSPC;		fprintf(stderr, _("%s: could not write file \"%s\": %s\n"),				progname, path, strerror(errno));		exit(1);	}	/* Fill the rest of the file with zeroes */	memset(buffer, 0, BLCKSZ);	for (nbytes = BLCKSZ; nbytes < XLogSegSize; nbytes += BLCKSZ)	{		errno = 0;		if (write(fd, buffer, BLCKSZ) != BLCKSZ)		{			if (errno == 0)				errno = ENOSPC;			fprintf(stderr, _("%s: could not write file \"%s\": %s\n"),					progname, path, strerror(errno));			exit(1);		}	}	if (fsync(fd) != 0)	{		fprintf(stderr, _("%s: fsync error: %s\n"), progname, strerror(errno));		exit(1);	}	close(fd);}static voidusage(void){	printf(_("%s resets the PostgreSQL transaction log.\n\n"), progname);	printf(_("Usage:\n  %s [OPTION]... DATADIR\n\n"), progname);	printf(_("Options:\n"));	printf(_("  -f              force update to be done\n"));	printf(_("  -l FILEID,SEG   force minimum WAL starting location for new transaction log\n"));	printf(_("  -n              no update, just show extracted control values (for testing)\n"));	printf(_("  -o OID          set next OID\n"));	printf(_("  -x XID          set next transaction ID\n"));	printf(_("  --help          show this help, then exit\n"));	printf(_("  --version       output version information, then exit\n"));	printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -