initdb.sh 9.1 KB
Newer Older
1 2 3 4
#!/bin/sh
#-------------------------------------------------------------------------
#
# initdb.sh--
5 6 7 8
#     Create (initialize) a Postgres database system.  
# 
#     A database system is a collection of Postgres databases all managed
#     by the same postmaster.  
9
#
10 11 12 13 14 15 16 17 18 19 20 21 22 23
#     To create the database system, we create the directory that contains
#     all its data, create the files that hold the global classes, create
#     a few other control files for it, and create one database:  the
#     template database.
#
#     The template database is an ordinary Postgres database.  Its data
#     never changes, though.  It exists to make it easy for Postgres to 
#     create other databases -- it just copies.
#
#     Optionally, we can skip creating the database system and just create
#     (or replace) the template database.
#
#     To create all those classes, we run the postgres (backend) program and
#     feed it data from bki files that are in the Postgres library directory.
24 25 26 27 28
#
# Copyright (c) 1994, Regents of the University of California
#
#
# IDENTIFICATION
29
#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.12 1996/10/12 07:49:56 bryanh Exp $
30 31 32 33 34
#
#-------------------------------------------------------------------------

# ----------------
#       Set paths from environment or default values.
35 36 37 38 39
#       The _fUnKy_..._sTuFf_ gets set when the script is built (with make)
#       from parameters set in the make file.
#       Currently the only thing we look for from the environment is
#       PGDATA, PGHOST, and PGPORT.  However, we should have environment
#       variables for all the paths.  
40 41 42
#
# ----------------
[ -z "$PGDATA" ] && { PGDATA=_fUnKy_DATADIR_sTuFf_; export PGDATA; }
43
[ -z "$PGPORT" ] && { PGPORT=_fUnKy_POSTPORT_sTuFf_; export PGPORT; }
44 45
[ -z "$PGHOST" ] && { PGHOST=localhost; export PGHOST; }
BINDIR=_fUnKy_BINDIR_sTuFf_
46 47 48
LIBDIR=_fUnKy_LIBDIR_sTuFf_
NAMEDATALEN=_fUnKy_NAMEDATALEN_sTuFf_
OIDNAMELEN=_fUnKy_OIDNAMELEN_sTuFf_
49 50 51 52 53
PATH=$BINDIR:$PATH
export PATH

CMDNAME=`basename $0`

54
# Set defaults:
55 56
debug=0
noclean=0
57 58 59
template_only=0
POSTGRES_SUPERUSERNAME=$USER

60 61 62
while [ "$#" -gt 0 ]
do
# ${ARG#--username=} is not reliable or available on all platforms
63

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
    case "$1" in
	--debug|-d)
		debug=1
		echo "Running with debug mode on."
		;;
	--noclean|-n)
		noclean=1
		echo "Running with noclean mode on.  Mistakes will not be cleaned up."
		;;
	--template|-t)
		template_only=1
		echo "updating template1 database only."
		;;
	--username=*)
		POSTGRES_SUPERUSERNAME="`echo $1 | sed s/^--username=//`"
		;;
	-u)
		shift
		POSTGRES_SUPERUSERNAME="$1"
		;;
	-u*)
		POSTGRES_SUPERUSERNAME="`echo $1 | sed s/^-u//`"
		;;
	--pgdata=*)
		PGDATA="`echo $1 | sed s/^--pgdata=//`"
		;;
	-r)
		shift
		PGDATA="$1"
		;;
	-r*)
		PGDATA="`echo $1 | sed s/^-r//`"
		;;
	*)
		echo "Unrecognized option '$1'.  Syntax is:"
		echo "initdb [-t | --template] [-d | --debug] [-n | --noclean]" \
B
Bruce Momjian 已提交
100
		     "[-u SUPERUSER | --username=SUPERUSER] [-r DATADIR | --pgdata=DATADIR]"
101 102 103
		exit 100
	esac
	shift
104 105
done

106
if [ "$debug" -eq 1 ]; then
M
Marc G. Fournier 已提交
107
    BACKENDARGS="-boot -C -F -d"
108
else
M
Marc G. Fournier 已提交
109
    BACKENDARGS="-boot -C -F -Q"
110 111
fi

112 113
TEMPLATE=$LIBDIR/local1_template1.bki.source
GLOBAL=$LIBDIR/global1.bki.source
114
PG_HBA_SAMPLE=$LIBDIR/pg_hba.conf.sample
115

116 117 118
#-------------------------------------------------------------------------
# Find the input files
#-------------------------------------------------------------------------
119

120 121 122 123 124 125 126 127 128 129 130 131 132
for PREREQ_FILE in $TEMPLATE $GLOBAL $PG_HBA_SAMPLE; do
    if [ ! -f $PREREQ_FILE ]; then 
        echo "$CMDNAME does not find the file '$PREREQ_FILE'."
        echo "This means Postgres95 is incorrectly installed."
        exit 1
    fi
done

echo "$CMDNAME: using $TEMPLATE as input to create the template database."
if [ $template_only -eq 0 ]; then
    echo "$CMDNAME: using $GLOBAL as input to create the global classes."
    echo "$CMDNAME: using $PG_HBA_SAMPLE as the host-based authentication" \
         "control file."
133
    echo
134 135 136 137 138 139 140 141 142 143 144
fi  

#---------------------------------------------------------------------------
# Figure out who the Postgres superuser for the new database system will be.
#---------------------------------------------------------------------------

if [ -z $POSTGRES_SUPERUSERNAME ]; then 
    echo "Can't tell what username to use.  You don't have the USER"
    echo "environment variable set to your username and didn't specify the "
    echo "--username option"
    exit 1
145 146
fi

147
POSTGRES_SUPERUID=`pg_id $POSTGRES_SUPERUSERNAME`
148

149 150 151 152 153 154 155
if [ $POSTGRES_SUPERUID = NOUSER ]; then
    echo "Valid username not given.  You must specify the username for "
    echo "the Postgres superuser for the database system you are "
    echo "initializing, either with the --username option or by default "
    echo "to the USER environment variable."
    exit 10
fi
156

157 158 159 160 161
if [ $POSTGRES_SUPERUID -ne `pg_id` -a `pg_id` -ne 0 ]; then 
    echo "Only the unix superuser may initialize a database with a different"
    echo "Postgres superuser.  (You must be able to create files that belong"
    echo "to the specified Postgres userid)."
    exit 2
162 163
fi

164 165 166
echo "We are initializing the database system with username" \
  "$POSTGRES_SUPERUSERNAME (uid=$POSTGRES_SUPERUID)."   
echo "Please be aware that Postgres is not secure.  Anyone who can connect"
B
Bruce Momjian 已提交
167
echo "to the database can act as user $POSTGRES_SUPERUSERNAME" \
168
     "with very little effort."
169
echo
170

171 172 173
# -----------------------------------------------------------------------
# Create the data directory if necessary
# -----------------------------------------------------------------------
174 175 176 177

# umask must disallow access to group, other for files and dirs
umask 077

178 179 180 181 182 183 184 185 186 187 188 189 190 191
if [ -d "$PGDATA" ]; then
    if [ $template_only -eq 0 ]; then
        echo "$CMDNAME: error: Directory $PGDATA already exists."
        echo "This probably means initdb has already been run and the "
        echo "database system already exists."
        echo 
        echo "If you want to create a new database system, either remove "
        echo "the $PGDATA directory or run initdb with environment variable"
        echo "PGDATA set to something other than $PGDATA."
        exit 1
    fi
else
    if [ ! -d $PGDATA ]; then
        echo "Creating Postgres database system directory $PGDATA"
192
        echo
193 194 195 196 197
        mkdir $PGDATA
        if [ $? -ne 0 ]; then exit 5; fi
    fi
    if [ ! -d $PGDATA/base ]; then
        echo "Creating Postgres database system directory $PGDATA/base"
198
        echo
199 200 201
        mkdir $PGDATA/base
        if [ $? -ne 0 ]; then exit 5; fi
    fi
202 203
fi

204 205 206
#----------------------------------------------------------------------------
# Create the template1 database
#----------------------------------------------------------------------------
207

208 209
rm -rf $PGDATA/base/template1
mkdir $PGDATA/base/template1
210

211 212 213 214 215 216 217 218 219 220 221
echo "$CMDNAME: creating template database in $PGDATA/base/template1"
echo "Running: postgres $BACKENDARGS template1"

cat $TEMPLATE \
| sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \
      -e "s/NAMEDATALEN/$NAMEDATALEN/g" \
      -e "s/OIDNAMELEN/$OIDNAMELEN/g" \
      -e "s/PGUID/$POSTGRES_SUPERUID/" \
| postgres $BACKENDARGS template1

if [ $? -ne 0 ]; then
222
    echo "$CMDNAME: could not create template database"
223 224 225 226 227
    if [ $noclean -eq 0 ]; then
        echo "$CMDNAME: cleaning up by wiping out $PGDATA/base/template1"
        rm -rf $PGDATA/base/template1
    else
        echo "$CMDNAME: cleanup not done because noclean options was used."
228
    fi
229
    exit 1;
230 231
fi

232 233
echo

234 235
pg_version $PGDATA/base/template1

236 237 238
#----------------------------------------------------------------------------
# Create the global classes, if requested.
#----------------------------------------------------------------------------
239

240 241 242
if [ $template_only -eq 0 ]; then
    echo "Creating global classes in $PG_DATA/base"
    echo "Running: postgres $BACKENDARGS template1"
243

244 245 246 247 248 249
    cat $GLOBAL \
    | sed -e "s/postgres PGUID/$POSTGRES_SUPERUSERNAME $POSTGRES_SUPERUID/" \
        -e "s/NAMEDATALEN/$NAMEDATALEN/g" \
        -e "s/OIDNAMELEN/$OIDNAMELEN/g" \
        -e "s/PGUID/$POSTGRES_SUPERUID/" \
    | postgres $BACKENDARGS template1
250

251
    if (test $? -ne 0)
252
    then
253 254 255 256 257 258 259 260
        echo "$CMDNAME: could not create global classes."
        if (test $noclean -eq 0); then
            echo "$CMDNAME: cleaning up."
            rm -rf $PGDATA
        else
            echo "$CMDNAME: cleanup not done (noclean mode set)."
        fi
        exit 1;
261 262
    fi

263 264
    echo

265
    pg_version $PGDATA
266

267
    cp $PG_HBA_SAMPLE $PGDATA/pg_hba.conf
268

269
    echo "Adding template1 database to pg_database..."
270

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
    echo "open pg_database" > /tmp/create.$$
    echo "insert (template1 $POSTGRES_SUPERUID template1)" >> /tmp/create.$$
    #echo "show" >> /tmp/create.$$
    echo "close pg_database" >> /tmp/create.$$

    echo "Running: postgres $BACKENDARGS template1 < /tmp/create.$$"

    postgres $BACKENDARGS template1 < /tmp/create.$$ 

    if [ $? -ne 0 ]; then
        echo "$CMDNAME: could not log template database"
        if [ $noclean -eq 0 ]; then
            echo "$CMDNAME: cleaning up."
            rm -rf $PGDATA
        else
            echo "$CMDNAME: cleanup not done (noclean mode set)."
        fi
        exit 1;
289
    fi
290
    rm -f /tmp/create.$$
291 292
fi

293 294
echo

295
if [ $debug -eq 0 ]; then
296 297
    echo "vacuuming template1"

M
Marc G. Fournier 已提交
298
    echo "vacuum" | postgres -F -Q template1 > /dev/null
299
fi