initdb.sh 8.8 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
B
Bruce Momjian 已提交
29
#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.8 1996/10/03 04:20:11 momjian 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
    if [ "$1" = "-d" ]; then
63 64
        debug=1
        echo "Running with debug mode on."
65
    elif [ "$1" = "-n" ]; then
66 67
        noclean=1
        echo "Running with noclean mode on.  Mistakes will not be cleaned up."
68
    elif [ "$1" = "-t" ]; then
69 70
        template_only=1
        echo "updating template1 database only."
71 72 73 74 75 76
    elif [ "$1" = "-u" ]; then
	shift
        POSTGRES_SUPERUSERNAME="$1"
    elif [ "$1" = "-r" ]; then
	shift
        PGDATA=$1
77
    else    
78 79
        echo "initdb [-t] [-d] [-n] [-u superuser] [-r datadir]" 1>&2
	exit 1
80
    fi
81
    shift
82 83
done

84
if [ "$debug" -eq 1 ]; then
M
Marc G. Fournier 已提交
85
    BACKENDARGS="-boot -C -F -d"
86
else
M
Marc G. Fournier 已提交
87
    BACKENDARGS="-boot -C -F -Q"
88 89
fi

90 91 92
TEMPLATE=$LIBDIR/local1_template1.bki.source
GLOBAL=$LIBDIR/global1.bki.source
PG_HBA_SAMPLE=$LIBDIR/pg_hba.sample
93

94 95 96
#-------------------------------------------------------------------------
# Find the input files
#-------------------------------------------------------------------------
97

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
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."
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
122 123
fi

124
POSTGRES_SUPERUID=`pg_id $POSTGRES_SUPERUSERNAME`
125

126 127 128 129 130 131 132
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
133

134 135 136 137 138
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
139 140
fi

141 142 143
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 已提交
144
echo "to the database can act as user $POSTGRES_SUPERUSERNAME" \
145
     "with very little effort."
146

147 148 149
# -----------------------------------------------------------------------
# Create the data directory if necessary
# -----------------------------------------------------------------------
150 151 152 153

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

154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
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"
        mkdir $PGDATA
        if [ $? -ne 0 ]; then exit 5; fi
    fi
    if [ ! -d $PGDATA/base ]; then
        echo "Creating Postgres database system directory $PGDATA/base"
        mkdir $PGDATA/base
        if [ $? -ne 0 ]; then exit 5; fi
    fi
176 177
fi

178 179 180
#----------------------------------------------------------------------------
# Create the template1 database
#----------------------------------------------------------------------------
181

182 183
rm -rf $PGDATA/base/template1
mkdir $PGDATA/base/template1
184

185 186 187 188 189 190 191 192 193 194 195
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
196
    echo "$CMDNAME: could not create template database"
197 198 199 200 201
    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."
202
    fi
203
    exit 1;
204 205 206 207
fi

pg_version $PGDATA/base/template1

208 209 210
#----------------------------------------------------------------------------
# Create the global classes, if requested.
#----------------------------------------------------------------------------
211

212 213
if [ $template_only -eq 0 ]; then
    echo "$CMDNAME: creating global classes in $PGDATA"
214

215 216
    echo "Creating global classes in $PG_DATA/base"
    echo "Running: postgres $BACKENDARGS template1"
217

218 219 220 221 222 223
    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
224

225
    if (test $? -ne 0)
226
    then
227 228 229 230 231 232 233 234
        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;
235 236
    fi

237
    pg_version $PGDATA
238

239
    cp $PG_HBA_SAMPLE $PGDATA/pg_hba
240

241
    echo "Adding template1 database to pg_database..."
242

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
    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;
261
    fi
262
    rm -f /tmp/create.$$
263 264
fi

265
if [ $debug -eq 0 ]; then
266 267
    echo "vacuuming template1"

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

271