mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
a006263f8b
into production.mysql.com:/usersnfs/jperkin/bk/build/5.1 mysql-test/mysql-test-run.pl: Auto merged scripts/mysql_install_db.sh: Auto merged
461 lines
14 KiB
Bash
461 lines
14 KiB
Bash
#!/bin/sh
|
|
# Copyright (C) 2002-2003 MySQL AB
|
|
#
|
|
# 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
|
|
|
|
# This scripts creates the MySQL Server system tables
|
|
#
|
|
# All unrecognized arguments to this script are passed to mysqld.
|
|
|
|
basedir=""
|
|
ldata=""
|
|
srcdir=""
|
|
|
|
args=""
|
|
defaults=""
|
|
mysqld_opt=""
|
|
user=""
|
|
|
|
force=0
|
|
in_rpm=0
|
|
ip_only=0
|
|
windows=0
|
|
source_install=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. Same as --datadir.
|
|
--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"
|
|
fi
|
|
}
|
|
|
|
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.
|
|
pick_args=
|
|
if test "$1" = PICK-ARGS-FROM-ARGV
|
|
then
|
|
pick_args=1
|
|
shift
|
|
fi
|
|
|
|
for arg
|
|
do
|
|
case "$arg" in
|
|
--force) force=1 ;;
|
|
--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=`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
|
|
# 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 ;;
|
|
|
|
--source-install)
|
|
# This is used when you want to run mysqld directly from the
|
|
# source tree (for example when you are developing MySQL and
|
|
# only want to create the default tables but don't want to
|
|
# install mysqld yet.
|
|
source_install=1 ;;
|
|
|
|
*)
|
|
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.
|
|
# 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"
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# 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
|
|
|
|
base="$basedir"
|
|
if test -z "$base"
|
|
then
|
|
# Assume source installation if basedir is not given
|
|
base="."
|
|
fi
|
|
|
|
for dir in "$@"
|
|
do
|
|
if test -f "$base/$dir/$file"
|
|
then
|
|
if test -n "$return_dir"
|
|
then
|
|
echo "$base/$dir"
|
|
else
|
|
echo "$base/$dir/$file"
|
|
fi
|
|
break
|
|
fi
|
|
done
|
|
}
|
|
|
|
missing_in_basedir()
|
|
{
|
|
if test -z "$basedir"
|
|
then
|
|
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'"
|
|
else
|
|
echo "FATAL ERROR: Can't find $*. Please specify your installation"
|
|
echo "directory with the '--basedir=' option."
|
|
fi
|
|
}
|
|
|
|
# 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.
|
|
|
|
print_defaults=`find_in_basedir my_print_defaults bin extra`
|
|
if test -z "$print_defaults"
|
|
then
|
|
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 or use"
|
|
echo "use --source-install --install-dir=xxx from the top source directory"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# 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" -a "$source_install" = 0
|
|
then
|
|
basedir="@prefix@"
|
|
bindir="@bindir@"
|
|
extra_bindir="$bindir"
|
|
mysqld="@libexecdir@/mysqld"
|
|
pkgdatadir="@pkgdatadir@"
|
|
else
|
|
bindir="$basedir/bin"
|
|
extra_bindir="$bindir"
|
|
# We set up bootstrap-specific paths later, so skip this for --windows
|
|
if test "$windows" -eq 0
|
|
then
|
|
mysqld=`find_in_basedir mysqld libexec sbin bin`
|
|
if test -z "$basedir"
|
|
then
|
|
# We come here when source-install is given
|
|
bindir="$basedir/bin"
|
|
extra_bindir="$bindir"
|
|
fi
|
|
if test -x "$mysqld"
|
|
then
|
|
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql scripts`
|
|
if test -z "$pkgdatadir"
|
|
then
|
|
missing_in_basedir fill_help_tables.sql
|
|
exit 1
|
|
fi
|
|
else
|
|
if test -x "./sql/mysqld"
|
|
then
|
|
# Source installation
|
|
mysqld="./sql/mysqld"
|
|
bindir="./client"
|
|
extra_bindir="./extra"
|
|
pkgdatadir="./scripts"
|
|
mysqld_opt="--language=./sql/share/english"
|
|
else
|
|
missing_in_basedir mysqld
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Path to data directory
|
|
if test -z "$ldata"
|
|
then
|
|
ldata="@localstatedir@"
|
|
fi
|
|
|
|
# Set up paths to SQL scripts required for bootstrap and ensure they exist.
|
|
if test -n "$srcdir"
|
|
then
|
|
pkgdatadir="$srcdir/scripts"
|
|
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"
|
|
|
|
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
|
|
|
|
# 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"
|
|
then
|
|
mysqld_opt="--language=$srcdir/sql/share/english"
|
|
else
|
|
mysqld_opt="--language=./sql/share/english"
|
|
fi
|
|
fi
|
|
|
|
# Make sure mysqld is available in default location (--basedir option is
|
|
# already tested above).
|
|
if test ! -x "$mysqld"
|
|
then
|
|
echo "FATAL ERROR: 'mysqld' executable not found!"
|
|
exit 1
|
|
fi
|
|
|
|
# Try to determine the hostname
|
|
hostname=`@HOSTNAME@`
|
|
|
|
# Check if hostname is valid
|
|
if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
|
|
then
|
|
resolved=`$extra_bindir/resolveip $hostname 2>&1`
|
|
if [ $? -ne 0 ]
|
|
then
|
|
resolved=`$extra_bindir/resolveip localhost 2>&1`
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "Neither host '$hostname' nor 'localhost' could be looked up with"
|
|
echo "$extra_bindir/resolveip"
|
|
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"
|
|
exit 1
|
|
fi
|
|
echo "WARNING: The host '$hostname' could not be looked up with resolveip."
|
|
echo "This probably means that your libc libraries are not 100 % compatible"
|
|
echo "with this binary MySQL version. The MySQL daemon, mysqld, should work"
|
|
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 !"
|
|
fi
|
|
fi
|
|
|
|
if test "$ip_only" -eq 1
|
|
then
|
|
hostname=`echo "$resolved" | awk '/ /{print $6}'`
|
|
fi
|
|
|
|
# Create database directories mysql & test
|
|
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
|
|
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 --log-warnings=0 --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..."
|
|
if `(echo "use mysql;"; cat $create_system_tables $fill_system_tables) | $mysqld_install_cmd_line`
|
|
then
|
|
s_echo "OK"
|
|
|
|
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
|
|
|
|
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
|
|
|
|
if test "$windows" -eq 0
|
|
then
|
|
# 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'"
|
|
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
|
|
echo "See the manual for more instructions."
|
|
echo
|
|
|
|
if test "$in_rpm" -eq 0 -a "$source_install" -eq 0
|
|
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!"
|
|
echo
|
|
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"
|
|
fi
|
|
exit 0
|
|
else
|
|
echo "Installation of system tables failed!"
|
|
echo
|
|
echo "Examine the logs in $ldata for more information."
|
|
echo "You can try to start the mysqld daemon with:"
|
|
echo "$mysqld --skip-grant &"
|
|
echo "and use the command line tool"
|
|
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
|