diff options
author | jperkin@production.mysql.com <> | 2007-07-27 20:28:34 +0200 |
---|---|---|
committer | jperkin@production.mysql.com <> | 2007-07-27 20:28:34 +0200 |
commit | 87a297061c7a9001478e39e9a8af23c553b5ce97 (patch) | |
tree | c3196fa97b47d5a093093d6309b83cb706d168df /scripts/mysql_install_db.sh | |
parent | 6df53ea2df58e94cda2dfe9bc2ddb126f5efbd04 (diff) | |
parent | d5293e45840f532c9100cd37c87bdef9ed879601 (diff) | |
download | mariadb-git-87a297061c7a9001478e39e9a8af23c553b5ce97.tar.gz |
Merge production.mysql.com:/usersnfs/jperkin/bk/bug-28585-5.0
into production.mysql.com:/usersnfs/jperkin/bk/bug-28585-5.1
Diffstat (limited to 'scripts/mysql_install_db.sh')
-rw-r--r-- | scripts/mysql_install_db.sh | 343 |
1 files changed, 199 insertions, 144 deletions
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index bd90e6916b1..67084f416e0 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -18,26 +18,68 @@ # # All unrecognized arguments to this script are passed to mysqld. -in_rpm=0 -windows=0 +basedir="" +ldata="" +srcdir="" + +args="" defaults="" +mysqld_opt="" user="" -case "$1" in - --no-defaults|--defaults-file=*|--defaults-extra-file=*) - defaults="$1"; shift - ;; -esac +force=0 +in_rpm=0 +ip_only=0 +windows=0 + +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 +} s_echo() { if test "$in_rpm" -eq 0 -a "$windows" -eq 0 then - echo $1 + echo "$1" fi } -parse_arguments() { +parse_arg() +{ + echo "$1" | sed -e 's/^[^=]*=//' +} + +parse_arguments() +{ # 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. @@ -48,20 +90,24 @@ parse_arguments() { shift fi - for arg do + for arg + do case "$arg" in --force) force=1 ;; - --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; - --srcdir=*) srcdir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; - --ldata=*|--datadir=*) ldata=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --basedir=*) basedir=`parse_arg "$arg"` ;; + --srcdir=*) srcdir=`parse_arg "$arg"` ;; + --ldata=*|--datadir=*) ldata=`parse_arg "$arg"` ;; --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) - user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + user=`parse_arg "$arg"` ;; --skip-name-resolve) ip_only=1 ;; --verbose) verbose=1 ;; # Obsolete --rpm) in_rpm=1 ;; + --help) usage ;; + --no-defaults|--defaults-file=*|--defaults-extra-file=*) + defaults="$arg" ;; --windows) # This is actually a "cross bootstrap" argument used when @@ -89,137 +135,152 @@ parse_arguments() { done } -# Get first arguments from the my.cfg file, groups [mysqld] and -# [mysql_install_db], and then merge with the command line arguments -if test -x ./bin/my_print_defaults -then - print_defaults="./bin/my_print_defaults" -elif test -x ./extra/my_print_defaults -then - print_defaults="./extra/my_print_defaults" -elif test -x @bindir@/my_print_defaults -then - print_defaults="@bindir@/my_print_defaults" -elif test -x @bindir@/mysql_print_defaults -then - print_defaults="@bindir@/mysql_print_defaults" -else - print_defaults="my_print_defaults" -fi +# 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 -args= -ldata= -execdir= -bindir= -basedir= -srcdir= -force=0 + file=$1; shift -parse_arguments `$print_defaults $defaults mysqld mysql_install_db` + 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" + echo + 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 "$@" -test -z "$ldata" && ldata=@localstatedir@ -if test -z "$basedir" +# We can now find my_print_defaults, either in the supplied --basedir +# location or in the installed area. +if test -n "$basedir" then - basedir=@prefix@ - bindir=@bindir@ - execdir=@libexecdir@ - pkgdatadir=@pkgdatadir@ -else - bindir="$basedir/bin" - if test -x "$basedir/libexec/mysqld" + print_defaults=`find_in_basedir my_print_defaults bin extra` + if ! test -x "$print_defaults" then - execdir="$basedir/libexec" - elif test -x "$basedir/sbin/mysqld" + missing_in_basedir my_print_defaults + exit 1 + fi +else + print_defaults="@bindir@/my_print_defaults" + if ! test -x "$print_defaults" then - execdir="$basedir/sbin" - else - execdir="$basedir/bin" + 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 fi -# Find SQL scripts needed for bootstrap -fill_help_tables="fill_help_tables.sql" -create_system_tables="mysql_system_tables.sql" -fill_system_tables="mysql_system_tables_data.sql" -if test -n "$srcdir" +# Now we can get arguments from the groups [mysqld] and [mysql_install_db] +# in the my.cfg file, then re-run to merge with command line arguments. +parse_arguments `$print_defaults $defaults mysqld mysql_install_db` +parse_arguments PICK-ARGS-FROM-ARGV "$@" + +# Path to MySQL installation directory +if test -z "$basedir" then - fill_help_tables=$srcdir/scripts/$fill_help_tables - create_system_tables=$srcdir/scripts/$create_system_tables - fill_system_tables=$srcdir/scripts/$fill_system_tables + basedir="@prefix@" + bindir="@bindir@" + mysqld="@libexecdir@/mysqld" + pkgdatadir="@pkgdatadir@" else - for i in $basedir/support-files $basedir/share $basedir/share/mysql \ - $basedir/scripts `pwd` `pwd`/scripts @pkgdatadir@ - do - if test -f $i/$fill_help_tables + bindir="$basedir/bin" + # 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" then - pkgdatadir=$i - break + missing_in_basedir fill_help_tables.sql + exit 1 fi - done - - fill_help_tables=$pkgdatadir/$fill_help_tables - create_system_tables=$pkgdatadir/$create_system_tables - fill_system_tables=$pkgdatadir/$fill_system_tables + mysqld=`find_in_basedir mysqld libexec sbin bin` + if ! test -x "$mysqld" + then + missing_in_basedir mysqld + exit 1 + fi + fi fi -if test ! -f $create_system_tables +# Path to data directory +if test -z "$ldata" then - echo "FATAL ERROR: Could not find SQL file '$create_system_tables' in" - echo "@pkgdatadir@ or inside $basedir" - exit 1; + ldata="@localstatedir@" fi -if test ! -f $fill_help_tables +# Set up paths to SQL scripts required for bootstrap and ensure they exist. +if test -n "$srcdir" then - echo "FATAL ERROR: Could not find help file '$fill_help_tables' in" - echo "@pkgdatadir@ or inside $basedir" - exit 1; + pkgdatadir="$srcdir/scripts" fi -if test ! -f $fill_system_tables -then - echo "FATAL ERROR: Could not find help file '$fill_system_tables' in" - echo "@pkgdatadir@ or inside $basedir" - exit 1; -fi +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" -# Find executables and paths -mysqld=$execdir/mysqld -mysqld_opt="" -scriptdir=$bindir +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 -if test "$windows" = 1 +# Set up Windows-specific paths +if test "$windows" -eq 1 then mysqld="./sql/mysqld" - if test -n "$srcdir" -a -f $srcdir/sql/share/english/errmsg.sys + if test -n "$srcdir" -a -f "$srcdir/sql/share/english/errmsg.sys" then - langdir=$srcdir/sql/share/english + mysqld_opt="--language=$srcdir/sql/share/english" else - langdir=./sql/share/english + mysqld_opt="--language=./sql/share/english" fi - mysqld_opt="--language=$langdir" - scriptdir="./scripts" fi -if test ! -x $mysqld +# Make sure mysqld is available in default location (--basedir option is +# already tested above). +if test ! -x "$mysqld" then - if test "$in_rpm" = 1 - then - echo "FATAL ERROR $mysqld not found!" - exit 1 - else - echo "FATAL ERROR Didn't find $mysqld" - echo "You should do a 'make install' before executing this script" - exit 1 - fi + echo "FATAL ERROR: $mysqld not found!" + exit 1 fi # Try to determine the hostname hostname=`@HOSTNAME@` # Check if hostname is valid -if test "$windows" = 0 -a "$in_rpm" = 0 -a $force = 0 +if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0 then resolved=`$bindir/resolveip $hostname 2>&1` if [ $? -ne 0 ] @@ -244,39 +305,36 @@ then fi fi -if test "$ip_only" = "1" +if test "$ip_only" -eq 1 then - ip=`echo "$resolved" | awk '/ /{print $6}'` - hostname=$ip + hostname=`echo "$resolved" | awk '/ /{print $6}'` fi # Create database directories mysql & test -if test ! -d $ldata; then - mkdir $ldata; - chmod 700 $ldata ; -fi -if test ! -d $ldata/mysql; then - mkdir $ldata/mysql; - chmod 700 $ldata/mysql ; -fi -if test ! -d $ldata/test; then - mkdir $ldata/test; - chmod 700 $ldata/test ; -fi -if test -w / -a ! -z "$user"; then - chown $user $ldata $ldata/mysql $ldata/test; -fi +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 -if test -n "$user"; then +if test -n "$user" +then args="$args --user=$user" fi # Peform the install of system tables mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}" mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \ ---basedir=$basedir --datadir=$ldata --loose-skip-innodb \ ---loose-skip-ndbcluster $args --max_allowed_packet=8M \ ---net_buffer_length=16K" + --basedir=$basedir --datadir=$ldata --loose-skip-innodb \ + --loose-skip-ndbcluster $args --max_allowed_packet=8M \ + --net_buffer_length=16K" # Pipe mysql_system_tables.sql to "mysqld --bootstrap" s_echo "Installing MySQL system tables..." @@ -284,23 +342,20 @@ if `(echo "use mysql;"; cat $create_system_tables $fill_system_tables) | $mysqld then s_echo "OK" - if test -n "$fill_help_tables" + 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` then - 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` - then - # Fill suceeded - s_echo "OK" - else - echo "" - echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!" - echo "The \"HELP\" command might not work properly" - echo "" - fi + # Fill suceeded + s_echo "OK" + else + echo + echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!" + echo "The \"HELP\" command might not work properly" + echo fi - s_echo "" + s_echo 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 @@ -319,7 +374,7 @@ then echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'" echo "See the manual for more instructions." - if test "$in_rpm" = "0" + if test "$in_rpm" -eq 0 then echo "You can start the MySQL daemon with:" echo "cd @prefix@ ; $bindir/mysqld_safe &" |