Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
6d27cfdd
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6d27cfdd
编写于
8月 29, 2002
作者:
P
Peter Eisentraut
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make pg_resetxlog options parsing more standard and prepare messages for
translation.
上级
41a85627
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
247 addition
and
202 deletion
+247
-202
contrib/pg_upgrade/pg_upgrade
contrib/pg_upgrade/pg_upgrade
+2
-2
doc/src/sgml/ref/pg_resetxlog.sgml
doc/src/sgml/ref/pg_resetxlog.sgml
+2
-2
src/bin/pg_resetxlog/nls.mk
src/bin/pg_resetxlog/nls.mk
+5
-0
src/bin/pg_resetxlog/pg_resetxlog.c
src/bin/pg_resetxlog/pg_resetxlog.c
+238
-198
未找到文件。
contrib/pg_upgrade/pg_upgrade
浏览文件 @
6d27cfdd
...
...
@@ -3,7 +3,7 @@
# pg_upgrade: update a database without needing a full dump/reload cycle.
# CAUTION: Read the manual page before trying to use this!
# $Header: /cvsroot/pgsql/contrib/pg_upgrade/Attic/pg_upgrade,v 1.1
4 2002/07/03 14:38:19 momjian
Exp $
# $Header: /cvsroot/pgsql/contrib/pg_upgrade/Attic/pg_upgrade,v 1.1
5 2002/08/29 22:19:03 petere
Exp $
#
# To migrate this to newer versions of PostgreSQL:
# 1) Update the version numbers at the top of the file
...
...
@@ -461,7 +461,7 @@ fi
# Set checkpoint location of new database
pg_resetxlog
-l
"
$LOG_ID
"
"
$SEG_ID
"
"
$PGDATA
"
pg_resetxlog
-l
"
$LOG_ID
"
,
"
$SEG_ID
"
"
$PGDATA
"
if
[
"
$?
"
-ne
0
]
then
echo
"Unable to set new log file/segment id. Exiting."
1>&2
exit
1
...
...
doc/src/sgml/ref/pg_resetxlog.sgml
浏览文件 @
6d27cfdd
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_resetxlog.sgml,v 1.
4 2002/08/17 20:24:51 tgl
Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_resetxlog.sgml,v 1.
5 2002/08/29 22:19:03 petere
Exp $
PostgreSQL documentation
-->
...
...
@@ -21,7 +21,7 @@ PostgreSQL documentation
<arg> -f </arg>
<arg> -n </arg>
<arg> -x <replaceable class="parameter">xid</replaceable> </arg>
<arg> -l <replaceable class="parameter">fileid</replaceable>
<replaceable class="parameter">seg</replaceable> </arg>
<arg> -l <replaceable class="parameter">fileid</replaceable>
,
<replaceable class="parameter">seg</replaceable> </arg>
<arg choice="plain"><replaceable>datadir</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
...
...
src/bin/pg_resetxlog/nls.mk
0 → 100644
浏览文件 @
6d27cfdd
# $Header: /cvsroot/pgsql/src/bin/pg_resetxlog/nls.mk,v 1.1 2002/08/29 22:19:03 petere Exp $
CATALOG_NAME
:=
pg_resetxlog
AVAIL_LANGUAGES
:=
GETTEXT_FILES
:=
pg_resetxlog.c
GETTEXT_TRIGGERS
:=
_
src/bin/pg_resetxlog/pg_resetxlog.c
浏览文件 @
6d27cfdd
...
...
@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.
2 2002/08/17 15:12:07 momjian
Exp $
* $Header: /cvsroot/pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.
3 2002/08/29 22:19:03 petere
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -36,9 +36,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#ifdef USE_LOCALE
#include <locale.h>
#endif
#include "access/xlog.h"
#include "catalog/catversion.h"
...
...
@@ -65,8 +63,8 @@
/******************** end of stuff copied from xlog.c ********************/
#define _(x) gettext((x))
static
char
*
DataDir
;
/* locations of important stuff */
static
char
XLogDir
[
MAXPGPATH
];
static
char
ControlFilePath
[
MAXPGPATH
];
...
...
@@ -74,6 +72,182 @@ static ControlFileData ControlFile; /* pg_control values */
static
uint32
newXlogId
,
newXlogSeg
;
/* ID/Segment of new XLOG segment */
static
bool
guessed
=
false
;
/* T if we had to guess at any values */
static
char
*
progname
;
static
bool
ReadControlFile
(
void
);
static
void
GuessControlValues
(
void
);
static
void
PrintControlValues
(
bool
guessed
);
static
void
RewriteControlFile
(
void
);
static
void
KillExistingXLOG
(
void
);
static
void
WriteEmptyXLOG
(
void
);
static
void
usage
(
void
);
int
main
(
int
argc
,
char
*
argv
[])
{
int
c
;
bool
force
=
false
;
bool
noupdate
=
false
;
TransactionId
set_xid
=
0
;
uint32
minXlogId
=
0
,
minXlogSeg
=
0
;
char
*
DataDir
;
int
fd
;
char
path
[
MAXPGPATH
];
setlocale
(
LC_ALL
,
""
);
#ifdef ENABLE_NLS
bindtextdomain
(
"pg_resetxlog"
,
LOCALEDIR
);
textdomain
(
"pg_resetxlog"
);
#endif
if
(
!
strrchr
(
argv
[
0
],
'/'
))
progname
=
argv
[
0
];
else
progname
=
strrchr
(
argv
[
0
],
'/'
)
+
1
;
if
(
argc
>
1
)
{
if
(
strcmp
(
argv
[
1
],
"--help"
)
==
0
||
strcmp
(
argv
[
1
],
"-?"
)
==
0
)
{
usage
();
exit
(
0
);
}
if
(
strcmp
(
argv
[
1
],
"--version"
)
==
0
||
strcmp
(
argv
[
1
],
"-V"
)
==
0
)
{
puts
(
"pg_resetxlog (PostgreSQL) "
PG_VERSION
);
exit
(
0
);
}
}
while
((
c
=
getopt
(
argc
,
argv
,
"fl:nx:"
))
!=
-
1
)
{
switch
(
c
)
{
case
'f'
:
force
=
true
;
break
;
case
'n'
:
noupdate
=
true
;
break
;
case
'x'
:
set_xid
=
strtoul
(
optarg
,
NULL
,
0
);
if
(
set_xid
==
0
)
{
fprintf
(
stderr
,
_
(
"%s: transaction ID (-x) must not be 0
\n
"
),
progname
);
exit
(
1
);
}
break
;
case
'l'
:
if
(
sscanf
(
optarg
,
"%u,%u"
,
&
minXlogId
,
&
minXlogSeg
)
!=
2
)
{
fprintf
(
stderr
,
_
(
"%s: invalid argument for -l option
\n
"
),
progname
);
fprintf
(
stderr
,
_
(
"Try '%s --help' for more information.
\n
"
),
progname
);
exit
(
1
);
}
break
;
default:
fprintf
(
stderr
,
_
(
"Try '%s --help' for more information.
\n
"
),
progname
);
exit
(
1
);
}
}
if
(
optind
==
argc
)
{
fprintf
(
stderr
,
_
(
"%s: no data directory specified
\n
"
),
progname
);
fprintf
(
stderr
,
_
(
"Try '%s --help' for more information.
\n
"
),
progname
);
exit
(
1
);
}
DataDir
=
argv
[
optind
];
snprintf
(
XLogDir
,
MAXPGPATH
,
"%s/pg_xlog"
,
DataDir
);
snprintf
(
ControlFilePath
,
MAXPGPATH
,
"%s/global/pg_control"
,
DataDir
);
/*
* Check for a postmaster lock file --- if there is one, refuse to
* proceed, on grounds we might be interfering with a live
* installation.
*/
snprintf
(
path
,
MAXPGPATH
,
"%s/postmaster.pid"
,
DataDir
);
if
((
fd
=
open
(
path
,
O_RDONLY
))
<
0
)
{
if
(
errno
!=
ENOENT
)
{
fprintf
(
stderr
,
_
(
"%s: could not open %s for reading: %s
\n
"
),
progname
,
path
,
strerror
(
errno
));
exit
(
1
);
}
}
else
{
fprintf
(
stderr
,
_
(
"%s: lock file %s exists
\n
"
"Is a server running? If not, delete the lock file and try again.
\n
"
),
progname
,
path
);
exit
(
1
);
}
/*
* Attempt to read the existing pg_control file
*/
if
(
!
ReadControlFile
())
GuessControlValues
();
/*
* If we had to guess anything, and -f was not given, just print the
* guessed values and exit. Also print if -n is given.
*/
if
((
guessed
&&
!
force
)
||
noupdate
)
{
PrintControlValues
(
guessed
);
if
(
!
noupdate
)
{
printf
(
_
(
"
\n
If these values seem acceptable, use -f to force reset.
\n
"
));
exit
(
1
);
}
else
exit
(
0
);
}
/*
* Don't reset from a dirty pg_control without -f, either.
*/
if
(
ControlFile
.
state
!=
DB_SHUTDOWNED
&&
!
force
)
{
printf
(
_
(
"The database server was not shut down cleanly.
\n
"
"Resetting the transaction log may cause data to be lost.
\n
"
"If you want to proceed anyway, use -f to force reset.
\n
"
));
exit
(
1
);
}
/*
* Else, do the dirty deed.
*
* First adjust fields if required by switches.
*/
if
(
set_xid
!=
0
)
ControlFile
.
checkPointCopy
.
nextXid
=
set_xid
;
if
(
minXlogId
>
ControlFile
.
logId
||
(
minXlogId
==
ControlFile
.
logId
&&
minXlogSeg
>
ControlFile
.
logSeg
))
{
ControlFile
.
logId
=
minXlogId
;
ControlFile
.
logSeg
=
minXlogSeg
;
}
RewriteControlFile
();
KillExistingXLOG
();
WriteEmptyXLOG
();
printf
(
_
(
"Transaction log reset
\n
"
));
return
0
;
}
/*
...
...
@@ -97,11 +271,13 @@ ReadControlFile(void)
* odds are we've been handed a bad DataDir path, so give up. User
* can do "touch pg_control" to force us to proceed.
*/
perror
(
"Failed to open $PGDATA/global/pg_control for reading"
);
fprintf
(
stderr
,
_
(
"%s: could not open %s for reading: %s
\n
"
),
progname
,
ControlFilePath
,
strerror
(
errno
));
if
(
errno
==
ENOENT
)
fprintf
(
stderr
,
"If you're sure the PGDATA path is correct, do
\n
"
" touch %s
\n
"
"and try again.
\n
"
,
ControlFilePath
);
fprintf
(
stderr
,
_
(
"If you are sure the data directory path is correct, do
\n
"
" touch %s
\n
"
"and try again.
\n
"
),
ControlFilePath
);
exit
(
1
);
}
...
...
@@ -111,7 +287,8 @@ ReadControlFile(void)
len
=
read
(
fd
,
buffer
,
BLCKSZ
);
if
(
len
<
0
)
{
perror
(
"Failed to read $PGDATA/global/pg_control"
);
fprintf
(
stderr
,
_
(
"%s: could not read %s: %s
\n
"
),
progname
,
ControlFilePath
,
strerror
(
errno
));
exit
(
1
);
}
close
(
fd
);
...
...
@@ -133,7 +310,8 @@ ReadControlFile(void)
return
true
;
}
fprintf
(
stderr
,
"pg_control exists but has invalid CRC; proceed with caution.
\n
"
);
fprintf
(
stderr
,
_
(
"%s: pg_control exists but has invalid CRC; proceed with caution
\n
"
),
progname
);
/* We will use the data anyway, but treat it as guessed. */
memcpy
(
&
ControlFile
,
buffer
,
sizeof
(
ControlFile
));
guessed
=
true
;
...
...
@@ -141,7 +319,8 @@ ReadControlFile(void)
}
/* Looks like it's a mess. */
fprintf
(
stderr
,
"pg_control exists but is broken or unknown version; ignoring it.
\n
"
);
fprintf
(
stderr
,
_
(
"%s: pg_control exists but is broken or unknown version; ignoring it
\n
"
),
progname
);
return
false
;
}
...
...
@@ -152,9 +331,7 @@ ReadControlFile(void)
static
void
GuessControlValues
(
void
)
{
#ifdef USE_LOCALE
char
*
localeptr
;
#endif
/*
* Set up a completely default set of pg_control values.
...
...
@@ -181,25 +358,20 @@ GuessControlValues(void)
ControlFile
.
blcksz
=
BLCKSZ
;
ControlFile
.
relseg_size
=
RELSEG_SIZE
;
#ifdef USE_LOCALE
localeptr
=
setlocale
(
LC_COLLATE
,
""
);
if
(
!
localeptr
)
{
fprintf
(
stderr
,
"Invalid LC_COLLATE setting
\n
"
);
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
,
"Invalid LC_CTYPE setting
\n
"
);
fprintf
(
stderr
,
_
(
"%s: invalid LC_CTYPE setting
\n
"
),
progname
);
exit
(
1
);
}
StrNCpy
(
ControlFile
.
lc_ctype
,
localeptr
,
LOCALE_NAME_BUFLEN
);
#else
strcpy
(
ControlFile
.
lc_collate
,
"C"
);
strcpy
(
ControlFile
.
lc_ctype
,
"C"
);
#endif
/*
* XXX eventually, should try to grovel through old XLOG to develop
...
...
@@ -217,31 +389,22 @@ GuessControlValues(void)
static
void
PrintControlValues
(
bool
guessed
)
{
printf
(
"%spg_control values:
\n\n
"
"pg_control version number: %u
\n
"
"Catalog version number: %u
\n
"
"Current log file id: %u
\n
"
"Next log file segment: %u
\n
"
"Latest checkpoint's StartUpID: %u
\n
"
"Latest checkpoint's NextXID: %u
\n
"
"Latest checkpoint's NextOID: %u
\n
"
"Database block size: %u
\n
"
"Blocks per segment of large relation: %u
\n
"
"LC_COLLATE: %s
\n
"
"LC_CTYPE: %s
\n
"
,
(
guessed
?
"Guessed-at "
:
""
),
ControlFile
.
pg_control_version
,
ControlFile
.
catalog_version_no
,
ControlFile
.
logId
,
ControlFile
.
logSeg
,
ControlFile
.
checkPointCopy
.
ThisStartUpID
,
ControlFile
.
checkPointCopy
.
nextXid
,
ControlFile
.
checkPointCopy
.
nextOid
,
ControlFile
.
blcksz
,
ControlFile
.
relseg_size
,
ControlFile
.
lc_collate
,
ControlFile
.
lc_ctype
);
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
(
_
(
"LC_COLLATE: %s
\n
"
),
ControlFile
.
lc_collate
);
printf
(
_
(
"LC_CTYPE: %s
\n
"
),
ControlFile
.
lc_ctype
);
}
...
...
@@ -293,7 +456,9 @@ RewriteControlFile(void)
*/
if
(
sizeof
(
ControlFileData
)
>
BLCKSZ
)
{
fprintf
(
stderr
,
"sizeof(ControlFileData) is too large ... fix xlog.c
\n
"
);
fprintf
(
stderr
,
_
(
"%s: internal error -- sizeof(ControlFileData) is too large ... fix xlog.c
\n
"
),
progname
);
exit
(
1
);
}
...
...
@@ -305,7 +470,8 @@ RewriteControlFile(void)
fd
=
open
(
ControlFilePath
,
O_RDWR
|
O_CREAT
|
O_EXCL
|
PG_BINARY
,
S_IRUSR
|
S_IWUSR
);
if
(
fd
<
0
)
{
perror
(
"RewriteControlFile failed to create pg_control file"
);
fprintf
(
stderr
,
_
(
"%s: could not create pg_control file: %s
\n
"
),
progname
,
strerror
(
errno
));
exit
(
1
);
}
...
...
@@ -315,13 +481,14 @@ RewriteControlFile(void)
/* if write didn't set errno, assume problem is no disk space */
if
(
errno
==
0
)
errno
=
ENOSPC
;
perror
(
"RewriteControlFile failed to write pg_control file"
);
fprintf
(
stderr
,
_
(
"%s: could not write pg_control file: %s
\n
"
),
progname
,
strerror
(
errno
));
exit
(
1
);
}
if
(
fsync
(
fd
)
!=
0
)
{
perror
(
"fsync"
);
fprintf
(
stderr
,
_
(
"%s: fsync error: %s
\n
"
),
progname
,
strerror
(
errno
)
);
exit
(
1
);
}
...
...
@@ -342,7 +509,8 @@ KillExistingXLOG(void)
xldir
=
opendir
(
XLogDir
);
if
(
xldir
==
NULL
)
{
perror
(
"KillExistingXLOG: cannot open $PGDATA/pg_xlog directory"
);
fprintf
(
stderr
,
_
(
"%s: could not open directory %s: %s
\n
"
),
progname
,
XLogDir
,
strerror
(
errno
));
exit
(
1
);
}
...
...
@@ -355,15 +523,18 @@ KillExistingXLOG(void)
snprintf
(
path
,
MAXPGPATH
,
"%s/%s"
,
XLogDir
,
xlde
->
d_name
);
if
(
unlink
(
path
)
<
0
)
{
perror
(
path
);
fprintf
(
stderr
,
_
(
"%s: could not delete file %s: %s
\n
"
),
progname
,
path
,
strerror
(
errno
));
exit
(
1
);
}
}
errno
=
0
;
}
if
(
errno
)
{
perror
(
"KillExistingXLOG: cannot read $PGDATA/pg_xlog directory"
);
fprintf
(
stderr
,
_
(
"%s: could not read from directory %s: %s
\n
"
),
progname
,
XLogDir
,
strerror
(
errno
));
exit
(
1
);
}
closedir
(
xldir
);
...
...
@@ -425,7 +596,8 @@ WriteEmptyXLOG(void)
S_IRUSR
|
S_IWUSR
);
if
(
fd
<
0
)
{
perror
(
path
);
fprintf
(
stderr
,
_
(
"%s: could not open %s: %s
\n
"
),
progname
,
path
,
strerror
(
errno
));
exit
(
1
);
}
...
...
@@ -435,7 +607,8 @@ WriteEmptyXLOG(void)
/* if write didn't set errno, assume problem is no disk space */
if
(
errno
==
0
)
errno
=
ENOSPC
;
perror
(
"WriteEmptyXLOG: failed to write xlog file"
);
fprintf
(
stderr
,
_
(
"%s: could not write %s: %s
\n
"
),
progname
,
path
,
strerror
(
errno
));
exit
(
1
);
}
...
...
@@ -448,14 +621,15 @@ WriteEmptyXLOG(void)
{
if
(
errno
==
0
)
errno
=
ENOSPC
;
perror
(
"WriteEmptyXLOG: failed to write xlog file"
);
fprintf
(
stderr
,
_
(
"%s: could not write %s: %s
\n
"
),
progname
,
path
,
strerror
(
errno
));
exit
(
1
);
}
}
if
(
fsync
(
fd
)
!=
0
)
{
perror
(
"fsync"
);
fprintf
(
stderr
,
_
(
"%s: fsync error: %s
\n
"
),
progname
,
strerror
(
errno
)
);
exit
(
1
);
}
...
...
@@ -466,146 +640,12 @@ WriteEmptyXLOG(void)
static
void
usage
(
void
)
{
fprintf
(
stderr
,
"Usage: pg_resetxlog [-f] [-n] [-x xid] [ -l fileid seg ] PGDataDirectory
\n
"
" -f
\t\t
force update to be done
\n
"
" -n
\t\t
no update, just show extracted pg_control values (for testing)
\n
"
" -x xid
\t
set next transaction ID
\n
"
" -l fileid seg
\t
force minimum WAL starting location for new xlog
\n
"
);
exit
(
1
);
}
int
main
(
int
argc
,
char
**
argv
)
{
int
argn
;
bool
force
=
false
;
bool
noupdate
=
false
;
TransactionId
set_xid
=
0
;
uint32
minXlogId
=
0
,
minXlogSeg
=
0
;
int
fd
;
char
path
[
MAXPGPATH
];
for
(
argn
=
1
;
argn
<
argc
;
argn
++
)
{
if
(
argv
[
argn
][
0
]
!=
'-'
)
break
;
/* end of switches */
if
(
strcmp
(
argv
[
argn
],
"-f"
)
==
0
)
force
=
true
;
else
if
(
strcmp
(
argv
[
argn
],
"-n"
)
==
0
)
noupdate
=
true
;
else
if
(
strcmp
(
argv
[
argn
],
"-x"
)
==
0
)
{
argn
++
;
if
(
argn
==
argc
)
usage
();
set_xid
=
strtoul
(
argv
[
argn
],
NULL
,
0
);
if
(
set_xid
==
0
)
{
fprintf
(
stderr
,
"XID can not be 0.
\n
"
);
exit
(
1
);
}
}
else
if
(
strcmp
(
argv
[
argn
],
"-l"
)
==
0
)
{
argn
++
;
if
(
argn
==
argc
)
usage
();
minXlogId
=
strtoul
(
argv
[
argn
],
NULL
,
0
);
argn
++
;
if
(
argn
==
argc
)
usage
();
minXlogSeg
=
strtoul
(
argv
[
argn
],
NULL
,
0
);
}
else
usage
();
}
if
(
argn
!=
argc
-
1
)
/* one required non-switch argument */
usage
();
DataDir
=
argv
[
argn
++
];
snprintf
(
XLogDir
,
MAXPGPATH
,
"%s/pg_xlog"
,
DataDir
);
snprintf
(
ControlFilePath
,
MAXPGPATH
,
"%s/global/pg_control"
,
DataDir
);
/*
* Check for a postmaster lock file --- if there is one, refuse to
* proceed, on grounds we might be interfering with a live
* installation.
*/
snprintf
(
path
,
MAXPGPATH
,
"%s/postmaster.pid"
,
DataDir
);
if
((
fd
=
open
(
path
,
O_RDONLY
))
<
0
)
{
if
(
errno
!=
ENOENT
)
{
perror
(
"Failed to open $PGDATA/postmaster.pid for reading"
);
exit
(
1
);
}
}
else
{
fprintf
(
stderr
,
"Lock file '%s' exists --- is a postmaster running?
\n
"
"If not, delete the lock file and try again.
\n
"
,
path
);
exit
(
1
);
}
/*
* Attempt to read the existing pg_control file
*/
if
(
!
ReadControlFile
())
GuessControlValues
();
/*
* If we had to guess anything, and -f was not given, just print the
* guessed values and exit. Also print if -n is given.
*/
if
((
guessed
&&
!
force
)
||
noupdate
)
{
PrintControlValues
(
guessed
);
if
(
!
noupdate
)
{
printf
(
"
\n
If these values seem acceptable, use -f to force reset.
\n
"
);
exit
(
1
);
}
else
exit
(
0
);
}
/*
* Don't reset from a dirty pg_control without -f, either.
*/
if
(
ControlFile
.
state
!=
DB_SHUTDOWNED
&&
!
force
)
{
printf
(
"The database was not shut down cleanly.
\n
"
"Resetting the xlog may cause data to be lost!
\n
"
"If you want to proceed anyway, use -f to force reset.
\n
"
);
exit
(
1
);
}
/*
* Else, do the dirty deed.
*
* First adjust fields if required by switches.
*/
if
(
set_xid
!=
0
)
ControlFile
.
checkPointCopy
.
nextXid
=
set_xid
;
if
(
minXlogId
>
ControlFile
.
logId
||
(
minXlogId
==
ControlFile
.
logId
&&
minXlogSeg
>
ControlFile
.
logSeg
))
{
ControlFile
.
logId
=
minXlogId
;
ControlFile
.
logSeg
=
minXlogSeg
;
}
RewriteControlFile
();
KillExistingXLOG
();
WriteEmptyXLOG
();
printf
(
"XLOG reset.
\n
"
);
return
0
;
printf
(
_
(
"%s resets the PostgreSQL transaction log.
\n\n
"
),
progname
);
printf
(
_
(
"Usage:
\n
%s [OPTIONS] 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
(
_
(
" -x XID set next transaction ID
\n
"
));
printf
(
_
(
"
\n
Report bugs to <pgsql-bugs@postgresql.org>.
\n
"
));
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录