初版
This commit is contained in:
479
build/lib/mysql/scripts/mysql_install_db
Normal file
479
build/lib/mysql/scripts/mysql_install_db
Normal file
@@ -0,0 +1,479 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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=""
|
||||
builddir=""
|
||||
ldata="./data"
|
||||
langdir=""
|
||||
srcdir=""
|
||||
|
||||
args=""
|
||||
defaults=""
|
||||
mysqld_opt=""
|
||||
user=""
|
||||
|
||||
force=0
|
||||
in_rpm=0
|
||||
ip_only=0
|
||||
cross_bootstrap=0
|
||||
|
||||
usage()
|
||||
{
|
||||
cat <<EOF
|
||||
Usage: $0 [OPTIONS]
|
||||
--basedir=path The path to the MySQL installation directory.
|
||||
--builddir=path If using --srcdir with out-of-directory builds, you
|
||||
will need to set this to the location of the build
|
||||
directory where built files reside.
|
||||
--cross-bootstrap For internal use. Used when building the MySQL system
|
||||
tables on a different host than the target.
|
||||
--datadir=path The path to the MySQL data directory.
|
||||
--defaults-extra-file=name
|
||||
Read this file after the global files are read.
|
||||
--defaults-file=name Only read default options from the given file name.
|
||||
--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.
|
||||
--help Display this help and exit.
|
||||
--ldata=path The path to the MySQL data directory. Same as --datadir.
|
||||
--no-defaults Don't read default options from any option file.
|
||||
--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 The path to the MySQL source directory. This option
|
||||
uses the compiled binaries and support files within the
|
||||
source tree, useful for if you don't want to install
|
||||
MySQL yet and just want to create the system 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.
|
||||
|
||||
All other options are passed to the mysqld program
|
||||
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
s_echo()
|
||||
{
|
||||
if test "$in_rpm" -eq 0 -a "$cross_bootstrap" -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"` ;;
|
||||
--builddir=*) builddir=`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" ;;
|
||||
|
||||
--cross-bootstrap|--windows)
|
||||
# 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. See top-level 'dist-hook' make target.
|
||||
#
|
||||
# --windows is a deprecated alias
|
||||
cross_bootstrap=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
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
cannot_find_file()
|
||||
{
|
||||
echo
|
||||
echo "FATAL ERROR: Could not find $1"
|
||||
|
||||
shift
|
||||
if test $# -ne 0
|
||||
then
|
||||
echo
|
||||
echo "The following directories were searched:"
|
||||
echo
|
||||
for dir in "$@"
|
||||
do
|
||||
echo " $dir"
|
||||
done
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "If you compiled from source, you need to run 'make install' to"
|
||||
echo "copy the software into the correct location ready for operation."
|
||||
echo
|
||||
echo "If you are using a binary release, you must either be at the top"
|
||||
echo "level of the extracted archive, or pass the --basedir option"
|
||||
echo "pointing to that location."
|
||||
echo
|
||||
}
|
||||
|
||||
# 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. This script supports:
|
||||
#
|
||||
# --srcdir=path pointing to compiled source tree
|
||||
# --basedir=path pointing to installed binary location
|
||||
#
|
||||
# or default to compiled-in locations.
|
||||
#
|
||||
if test -n "$srcdir" && test -n "$basedir"
|
||||
then
|
||||
echo "ERROR: Specify either --basedir or --srcdir, not both."
|
||||
exit 1
|
||||
fi
|
||||
if test -n "$srcdir"
|
||||
then
|
||||
if test -z "$builddir"
|
||||
then
|
||||
builddir="$srcdir"
|
||||
fi
|
||||
print_defaults="$builddir/extra/my_print_defaults"
|
||||
elif test -n "$basedir"
|
||||
then
|
||||
print_defaults=`find_in_basedir my_print_defaults bin extra`
|
||||
if test -z "$print_defaults"
|
||||
then
|
||||
cannot_find_file my_print_defaults $basedir/bin $basedir/extra
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
print_defaults="./bin/my_print_defaults"
|
||||
fi
|
||||
|
||||
if test ! -x "$print_defaults"
|
||||
then
|
||||
cannot_find_file "$print_defaults"
|
||||
exit 1
|
||||
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 "$@"
|
||||
|
||||
# Configure paths to support files
|
||||
if test -n "$srcdir"
|
||||
then
|
||||
basedir="$builddir"
|
||||
bindir="$basedir/client"
|
||||
extra_bindir="$basedir/extra"
|
||||
mysqld="$basedir/sql/mysqld"
|
||||
langdir="$srcdir/sql/share/english"
|
||||
pkgdatadir="$srcdir/scripts"
|
||||
scriptdir="$srcdir/scripts"
|
||||
elif test -n "$basedir"
|
||||
then
|
||||
bindir="$basedir/bin"
|
||||
extra_bindir="$bindir"
|
||||
mysqld=`find_in_basedir mysqld libexec sbin bin`
|
||||
if test -z "$mysqld"
|
||||
then
|
||||
cannot_find_file mysqld $basedir/libexec $basedir/sbin $basedir/bin
|
||||
exit 1
|
||||
fi
|
||||
langdir=`find_in_basedir --dir errmsg.sys share/english share/mysql/english`
|
||||
if test -z "$langdir"
|
||||
then
|
||||
cannot_find_file errmsg.sys $basedir/share/english $basedir/share/mysql/english
|
||||
exit 1
|
||||
fi
|
||||
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
|
||||
if test -z "$pkgdatadir"
|
||||
then
|
||||
cannot_find_file fill_help_tables.sql $basedir/share $basedir/share/mysql
|
||||
exit 1
|
||||
fi
|
||||
scriptdir="$basedir/scripts"
|
||||
else
|
||||
basedir="."
|
||||
bindir="./bin"
|
||||
extra_bindir="$bindir"
|
||||
mysqld="./bin/mysqld"
|
||||
pkgdatadir="./share"
|
||||
scriptdir="./bin"
|
||||
fi
|
||||
|
||||
# Set up paths to SQL scripts required for bootstrap
|
||||
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
|
||||
cannot_find_file "$f"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
if test ! -x "$mysqld"
|
||||
then
|
||||
cannot_find_file "$mysqld"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -n "$langdir"
|
||||
then
|
||||
if test ! -f "$langdir/errmsg.sys"
|
||||
then
|
||||
cannot_find_file "$langdir/errmsg.sys"
|
||||
exit 1
|
||||
fi
|
||||
mysqld_opt="--language=$langdir"
|
||||
fi
|
||||
|
||||
# Try to determine the hostname
|
||||
hostname=`/bin/hostname`
|
||||
|
||||
# Check if hostname is valid
|
||||
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
|
||||
then
|
||||
resolved=`$extra_bindir/resolveip $hostname 2>&1`
|
||||
if test $? -ne 0
|
||||
then
|
||||
resolved=`$extra_bindir/resolveip localhost 2>&1`
|
||||
if test $? -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
|
||||
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
|
||||
|
||||
# When doing a "cross bootstrap" install, no reference to the current
|
||||
# host should be added to the system tables. So we filter out any
|
||||
# lines which contain the current host name.
|
||||
if test $cross_bootstrap -eq 1
|
||||
then
|
||||
filter_cmd_line="sed -e '/@current_hostname/d'"
|
||||
else
|
||||
filter_cmd_line="cat"
|
||||
fi
|
||||
|
||||
# Configure mysqld command line
|
||||
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 \
|
||||
--default-storage-engine=myisam \
|
||||
--net_buffer_length=16K"
|
||||
|
||||
# Create the system and help tables by passing them to "mysqld --bootstrap"
|
||||
s_echo "Installing MySQL system tables..."
|
||||
if { echo "use mysql;"; cat $create_system_tables $fill_system_tables; } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null
|
||||
then
|
||||
s_echo "OK"
|
||||
else
|
||||
echo
|
||||
echo "Installation of system tables failed! Examine the logs in"
|
||||
echo "$ldata for more information."
|
||||
echo
|
||||
echo "You can try to start the mysqld daemon with:"
|
||||
echo
|
||||
echo " shell> $mysqld --skip-grant &"
|
||||
echo
|
||||
echo "and use the command line tool $bindir/mysql"
|
||||
echo "to connect to the mysql 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 "Please consult the MySQL manual section"
|
||||
echo "'Problems running mysql_install_db', and the manual section that"
|
||||
echo "describes problems on your OS. Another information source are the"
|
||||
echo "MySQL email archives available at http://lists.mysql.com/."
|
||||
echo
|
||||
echo "Please check all of the above before mailing us! And remember, if"
|
||||
echo "you do mail us, you MUST use the $scriptdir/mysqlbug script!"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
s_echo "Filling help tables..."
|
||||
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
|
||||
then
|
||||
s_echo "OK"
|
||||
else
|
||||
echo
|
||||
echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!"
|
||||
echo "The \"HELP\" command might not work properly."
|
||||
fi
|
||||
|
||||
# Don't output verbose information if running inside bootstrap or using
|
||||
# --srcdir for testing. In such cases, there's no end user looking at
|
||||
# the screen.
|
||||
if test "$cross_bootstrap" -eq 0 && test -z "$srcdir"
|
||||
then
|
||||
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"
|
||||
|
||||
echo
|
||||
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
|
||||
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."
|
||||
|
||||
if test "$in_rpm" -eq 0
|
||||
then
|
||||
echo
|
||||
echo "You can start the MySQL daemon with:"
|
||||
echo "cd $basedir ; $bindir/mysqld_safe &"
|
||||
echo
|
||||
echo "You can test the MySQL daemon with mysql-test-run.pl"
|
||||
echo "cd $basedir/mysql-test ; perl mysql-test-run.pl"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Please report any problems with the $scriptdir/mysqlbug script!"
|
||||
echo
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user