mysql_install_db.sh 13 KB
Newer Older
unknown's avatar
unknown committed
1
#!/bin/sh
unknown's avatar
unknown committed
2
# Copyright (C) 2002-2003 MySQL AB
unknown's avatar
unknown committed
3 4 5 6 7 8 9 10 11 12 13 14 15
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
unknown's avatar
unknown committed
16

17
# This scripts creates the MySQL Server system tables
unknown's avatar
unknown committed
18
#
19
# All unrecognized arguments to this script are passed to mysqld.
unknown's avatar
unknown committed
20

21 22 23 24 25 26 27 28 29
basedir=""
ldata=""
srcdir=""

args=""
defaults=""
mysqld_opt=""
user=""

30
force=0
31
in_rpm=0
32
ip_only=0
33
windows=0
unknown's avatar
unknown committed
34

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
usage()
{
  cat <<EOF
Usage: $0 [OPTIONS]
  --basedir=path       The path to the MySQL installation directory.
  --datadir=path       The path to the MySQL data directory.
  --force              Causes mysql_install_db to run even if DNS does not
                       work.  In that case, grant table entries that normally
                       use hostnames will use IP addresses.
  --ldata=path         The path to the MySQL data directory.
  --rpm                For internal use.  This option is used by RPM files
                       during the MySQL installation process.
  --skip-name-resolve  Use IP addresses rather than hostnames when creating
                       grant table entries.  This option can be useful if
                       your DNS does not work.
  --srcdir=path        For internal use.  The directory under which
                       mysql_install_db looks for support files such as the
                       error message file and the file for popoulating the
                       help tables.
  --user=user_name     The login username to use for running mysqld.  Files
                       and directories created by mysqld will be owned by this
                       user.  You must be root to use this option.  By default
                       mysqld runs using your current login name and files and
                       directories that it creates will be owned by you.
  --windows            For internal use.  This option is used for creating
                       Windows distributions.

All other options are passed to the mysqld program

EOF
  exit 1
}

68 69 70 71
s_echo()
{
  if test "$in_rpm" -eq 0 -a "$windows" -eq 0
  then
72
    echo "$1"
73 74 75
  fi
}

76 77 78 79 80 81 82
parse_arg()
{
  echo "$1" | sed -e 's/^[^=]*=//'
}

parse_arguments()
{
83 84 85 86 87 88 89 90 91
  # We only need to pass arguments through to the server if we don't
  # handle them here.  So, we collect unrecognized options (passed on
  # the command line) into the args variable.
  pick_args=
  if test "$1" = PICK-ARGS-FROM-ARGV
  then
    pick_args=1
    shift
  fi
unknown's avatar
unknown committed
92

93 94
  for arg
  do
95 96
    case "$arg" in
      --force) force=1 ;;
97 98 99
      --basedir=*) basedir=`parse_arg "$arg"` ;;
      --srcdir=*)  srcdir=`parse_arg "$arg"` ;;
      --ldata=*|--datadir=*) ldata=`parse_arg "$arg"` ;;
unknown's avatar
unknown committed
100 101 102 103
      --user=*)
        # Note that the user will be passed to mysqld so that it runs
        # as 'user' (crucial e.g. if log-bin=/some_other_path/
        # where a chown of datadir won't help)
104
	 user=`parse_arg "$arg"` ;;
105
      --skip-name-resolve) ip_only=1 ;;
106
      --verbose) verbose=1 ;; # Obsolete
107
      --rpm) in_rpm=1 ;;
108
      --help) usage ;;
109 110
      --no-defaults|--defaults-file=*|--defaults-extra-file=*)
        defaults="$arg" ;;
111 112 113 114 115 116 117 118 119 120 121 122

      --windows)
	# This is actually a "cross bootstrap" argument used when
        # building the MySQL system tables on a different host
        # than the target. The platform independent
        # files that are created in --datadir on the host can
        # be copied to the target system, the most common use for
        # this feature is in the windows installer which will take
        # the files from datadir and include them as part of the install
        # package.
         windows=1 ;;

123 124 125 126 127
      *)
        if test -n "$pick_args"
        then
          # This sed command makes sure that any special chars are quoted,
          # so the arg gets passed exactly to the server.
unknown's avatar
unknown committed
128 129 130 131
          # XXX: This is broken; true fix requires using eval and proper
          # quoting of every single arg ($basedir, $ldata, etc.)
          #args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
          args="$args $arg"
132 133 134 135
        fi
        ;;
    esac
  done
unknown's avatar
unknown committed
136 137
}

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
# Try to find a specific file within --basedir which can either be a binary
# release or installed source directory and return the path.
find_in_basedir()
{
  case "$1" in
    --dir)
      return_dir=1; shift
      ;;
  esac

  file=$1; shift

  for dir in "$@"
  do
    if test -f "$basedir/$dir/$file"
    then
      if test -n "$return_dir"
      then
        echo "$basedir/$dir"
      else
        echo "$basedir/$dir/$file"
      fi
      break
    fi
  done
}

missing_in_basedir()
{
  echo "FATAL ERROR: Could not find $* inside --basedir"
168
  echo
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
  echo "When using --basedir you must point either into a MySQL binary"
  echo "distribution directory or a compiled tree previously populated"
  echo "by 'make install'"
}

# Ok, let's go.  We first need to parse arguments which are required by
# my_print_defaults so that we can execute it first, then later re-parse
# the command line to add any extra bits that we need.
parse_arguments PICK-ARGS-FROM-ARGV "$@"

# We can now find my_print_defaults, either in the supplied --basedir
# location or in the installed area.
if test -n "$basedir"
then
  print_defaults=`find_in_basedir my_print_defaults bin extra`
  if ! test -x "$print_defaults"
  then
    missing_in_basedir my_print_defaults
    exit 1
  fi
else
  print_defaults="@bindir@/my_print_defaults"
  if ! test -x "$print_defaults"
  then
    echo "FATAL ERROR: Could not find $print_defaults"
    echo
    echo "If you are using a binary release, you must run this script from"
    echo "within the directory the archive extracted into.  If you compiled"
    echo "MySQL yourself you must run 'make install' first."
    exit 1
  fi
200
fi
unknown's avatar
unknown committed
201

202
# Now we can get arguments from the groups [mysqld] and [mysql_install_db]
203
# in the my.cfg file, then re-run to merge with command line arguments.
204 205
parse_arguments `$print_defaults $defaults mysqld mysql_install_db`
parse_arguments PICK-ARGS-FROM-ARGV "$@"
unknown's avatar
unknown committed
206

207
# Path to MySQL installation directory
208 209
if test -z "$basedir"
then
210 211 212
  basedir="@prefix@"
  bindir="@bindir@"
  mysqld="@libexecdir@/mysqld"
213
  pkgdatadir="@pkgdatadir@"
214
else
215
  bindir="$basedir/bin"
216 217 218 219 220
  # We set up bootstrap-specific paths later, so skip this for --windows
  if test "$windows" -eq 0
  then
    pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
    if test -z "$pkgdatadir"
unknown's avatar
unknown committed
221
    then
222 223 224 225 226 227 228 229
      missing_in_basedir fill_help_tables.sql
      exit 1
    fi
    mysqld=`find_in_basedir mysqld libexec sbin bin`
    if ! test -x "$mysqld"
    then
      missing_in_basedir mysqld
      exit 1
unknown's avatar
unknown committed
230
    fi
231
  fi
232 233
fi

234 235
# Path to data directory
if test -z "$ldata"
236
then
237
  ldata="@localstatedir@"
unknown's avatar
unknown committed
238 239
fi

240 241
# Set up paths to SQL scripts required for bootstrap and ensure they exist.
if test -n "$srcdir"
unknown's avatar
unknown committed
242
then
243
  pkgdatadir="$srcdir/scripts"
244
fi
unknown's avatar
unknown committed
245

246 247 248
fill_help_tables="$pkgdatadir/fill_help_tables.sql"
create_system_tables="$pkgdatadir/mysql_system_tables.sql"
fill_system_tables="$pkgdatadir/mysql_system_tables_data.sql"
249

250 251 252 253 254 255 256 257
for f in $fill_help_tables $create_system_tables $fill_system_tables
do
  if test ! -f "$f"
  then
    echo "FATAL ERROR: Could not find SQL file '$f'"
    exit 1
  fi
done
unknown's avatar
unknown committed
258

259 260
# Set up Windows-specific paths
if test "$windows" -eq 1
261 262
then
  mysqld="./sql/mysqld"
263
  if test -n "$srcdir" -a -f "$srcdir/sql/share/english/errmsg.sys"
unknown's avatar
unknown committed
264
  then
265
    mysqld_opt="--language=$srcdir/sql/share/english"
unknown's avatar
unknown committed
266
  else
unknown's avatar
unknown committed
267
    mysqld_opt="--language=./sql/share/english"
unknown's avatar
unknown committed
268
  fi
269 270
fi

271 272 273
# Make sure mysqld is available in default location (--basedir option is
# already tested above).
if test ! -x "$mysqld"
unknown's avatar
unknown committed
274
then
275 276
  echo "FATAL ERROR: $mysqld not found!"
  exit 1
unknown's avatar
unknown committed
277 278
fi

279 280
# Try to determine the hostname
hostname=`@HOSTNAME@`
unknown's avatar
unknown committed
281 282

# Check if hostname is valid
283
if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
unknown's avatar
unknown committed
284 285 286 287 288
then
  resolved=`$bindir/resolveip $hostname 2>&1`
  if [ $? -ne 0 ]
  then
    resolved=`$bindir/resolveip localhost 2>&1`
unknown's avatar
unknown committed
289
    if [ $? -ne 0 ]
unknown's avatar
unknown committed
290
    then
unknown's avatar
unknown committed
291
      echo "Neither host '$hostname' nor 'localhost' could be looked up with"
292
      echo "$bindir/resolveip"
293 294 295 296
      echo "Please configure the 'hostname' command to return a correct"
      echo "hostname."
      echo "If you want to solve this at a later stage, restart this script"
      echo "with the --force option"
unknown's avatar
unknown committed
297 298
      exit 1
    fi
unknown's avatar
unknown committed
299 300
    echo "WARNING: The host '$hostname' could not be looked up with resolveip."
    echo "This probably means that your libc libraries are not 100 % compatible"
unknown's avatar
unknown committed
301
    echo "with this binary MySQL version. The MySQL daemon, mysqld, should work"
unknown's avatar
unknown committed
302 303 304
    echo "normally with the exception that host name resolving will not work."
    echo "This means that you should use IP addresses instead of hostnames"
    echo "when specifying MySQL privileges !"
unknown's avatar
unknown committed
305 306 307
  fi
fi

308
if test "$ip_only" -eq 1
309
then
310
  hostname=`echo "$resolved" | awk '/ /{print $6}'`
311 312
fi

unknown's avatar
unknown committed
313
# Create database directories mysql & test
314 315 316 317 318 319 320 321 322 323 324 325
for dir in $ldata $ldata/mysql $ldata/test
do
  if test ! -d $dir
  then
    mkdir -p $dir
    chmod 700 $dir
  fi
  if test -w / -a ! -z "$user"
  then
    chown $user $dir
  fi
done
unknown's avatar
unknown committed
326

327 328
if test -n "$user"
then
329 330 331
  args="$args --user=$user"
fi

332
# Peform the install of system tables
333 334
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
335 336
  --basedir=$basedir --datadir=$ldata --skip-innodb --skip-bdb \
  --skip-ndbcluster $args --max_allowed_packet=8M --net_buffer_length=16K"
337 338 339

# Pipe mysql_system_tables.sql to "mysqld --bootstrap"
s_echo "Installing MySQL system tables..."
340
if `(echo "use mysql;"; cat $create_system_tables $fill_system_tables) | $mysqld_install_cmd_line`
unknown's avatar
unknown committed
341
then
342 343
  s_echo "OK"

344 345 346
  s_echo "Filling help tables..."
  # Pipe fill_help_tables.sql to "mysqld --bootstrap"
  if `(echo "use mysql;"; cat $fill_help_tables) | $mysqld_install_cmd_line`
347
  then
348 349 350 351 352 353 354
    # Fill suceeded
    s_echo "OK"
  else
    echo
    echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!"
    echo "The \"HELP\" command might not work properly"
    echo
355
  fi
356

357
  s_echo
358 359 360 361
  s_echo "To start mysqld at boot time you have to copy"
  s_echo "support-files/mysql.server to the right place for your system"
  s_echo

362 363
  if test "$windows" -eq 0
  then
364 365 366 367 368 369 370 371 372 373
    # A root password should of course also be set on Windows!
    # The reason for not displaying these prompts here is that when
    # executing this script with the --windows argument the script
    # is used to generate system tables mainly used by the
    # windows installer. And thus the password should not be set until
    # those files has been copied to the target system
    echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !"
    echo "To do so, start the server, then issue the following commands:"
    echo "$bindir/mysqladmin -u root password 'new-password'"
    echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'"
374 375 376 377 378 379 380 381
    echo
    echo "Alternatively you can run:"
    echo "$bindir/mysql_secure_installation"
    echo
    echo "which will also give you the option of removing the test"
    echo "databases and anonymous user created by default.  This is"
    echo "strongly recommended for production servers."
    echo
382
    echo "See the manual for more instructions."
383
    echo
384

385
    if test "$in_rpm" -eq 0
386 387 388 389 390 391 392 393 394
    then
      echo "You can start the MySQL daemon with:"
      echo "cd @prefix@ ; $bindir/mysqld_safe &"
      echo
      echo "You can test the MySQL daemon with mysql-test-run.pl"
      echo "cd mysql-test ; perl mysql-test-run.pl"
      echo
    fi
    echo "Please report any problems with the @scriptdir@/mysqlbug script!"
unknown's avatar
unknown committed
395
    echo
396 397 398
    echo "The latest information about MySQL is available on the web at"
    echo "http://www.mysql.com"
    echo "Support MySQL by buying support/licenses at http://shop.mysql.com"
399
  fi
unknown's avatar
unknown committed
400 401
  exit 0
else
402
  echo "Installation of system tables failed!"
unknown's avatar
unknown committed
403 404
  echo
  echo "Examine the logs in $ldata for more information."
405
  echo "You can try to start the mysqld daemon with:"
406
  echo "$mysqld --skip-grant &"
407
  echo "and use the command line tool"
unknown's avatar
unknown committed
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
  echo "$bindir/mysql to connect to the mysql"
  echo "database and look at the grant tables:"
  echo
  echo "shell> $bindir/mysql -u root mysql"
  echo "mysql> show tables"
  echo
  echo "Try 'mysqld --help' if you have problems with paths. Using --log"
  echo "gives you a log in $ldata that may be helpful."
  echo
  echo "The latest information about MySQL is available on the web at"
  echo "http://www.mysql.com"
  echo "Please consult the MySQL manual section: 'Problems running mysql_install_db',"
  echo "and the manual section that describes problems on your OS."
  echo "Another information source is the MySQL email archive."
  echo "Please check all of the above before mailing us!"
  echo "And if you do mail us, you MUST use the @scriptdir@/mysqlbug script!"
  exit 1
fi