2
# Copyright (C) 2002-2003 MySQL AB
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; version 2 of the License.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
# This scripts creates the MySQL Server system tables
19
# All unrecognized arguments to this script are passed to mysqld.
23
ldata="@localstatedir@"
40
--basedir=path The path to the MySQL installation directory.
41
--builddir=path If using --srcdir with out-of-directory builds, you
42
will need to set this to the location of the build
43
directory where built files reside.
44
--cross-bootstrap For internal use. Used when building the MySQL system
45
tables on a different host than the target.
46
--datadir=path The path to the MySQL data directory.
47
--force Causes mysql_install_db to run even if DNS does not
48
work. In that case, grant table entries that normally
49
use hostnames will use IP addresses.
50
--ldata=path The path to the MySQL data directory. Same as --datadir.
51
--rpm For internal use. This option is used by RPM files
52
during the MySQL installation process.
53
--skip-name-resolve Use IP addresses rather than hostnames when creating
54
grant table entries. This option can be useful if
55
your DNS does not work.
56
--srcdir=path The path to the MySQL source directory. This option
57
uses the compiled binaries and support files within the
58
source tree, useful for if you don't want to install
59
MySQL yet and just want to create the system tables.
60
--user=user_name The login username to use for running mysqld. Files
61
and directories created by mysqld will be owned by this
62
user. You must be root to use this option. By default
63
mysqld runs using your current login name and files and
64
directories that it creates will be owned by you.
66
All other options are passed to the mysqld program
74
if test "$in_rpm" -eq 0 -a "$cross_bootstrap" -eq 0
82
echo "$1" | sed -e 's/^[^=]*=//'
87
# We only need to pass arguments through to the server if we don't
88
# handle them here. So, we collect unrecognized options (passed on
89
# the command line) into the args variable.
91
if test "$1" = PICK-ARGS-FROM-ARGV
101
--basedir=*) basedir=`parse_arg "$arg"` ;;
102
--builddir=*) builddir=`parse_arg "$arg"` ;;
103
--srcdir=*) srcdir=`parse_arg "$arg"` ;;
104
--ldata=*|--datadir=*) ldata=`parse_arg "$arg"` ;;
106
# Note that the user will be passed to mysqld so that it runs
107
# as 'user' (crucial e.g. if log-bin=/some_other_path/
108
# where a chown of datadir won't help)
109
user=`parse_arg "$arg"` ;;
110
--skip-name-resolve) ip_only=1 ;;
111
--verbose) verbose=1 ;; # Obsolete
114
--no-defaults|--defaults-file=*|--defaults-extra-file=*)
117
--cross-bootstrap|--windows)
118
# Used when building the MySQL system tables on a different host than
119
# the target. The platform-independent files that are created in
120
# --datadir on the host can be copied to the target system.
122
# The most common use for this feature is in the Windows installer
123
# which will take the files from datadir and include them as part of
124
# the install package. See top-level 'dist-hook' make target.
126
# --windows is a deprecated alias
130
if test -n "$pick_args"
132
# This sed command makes sure that any special chars are quoted,
133
# so the arg gets passed exactly to the server.
134
# XXX: This is broken; true fix requires using eval and proper
135
# quoting of every single arg ($basedir, $ldata, etc.)
136
#args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
144
# Try to find a specific file within --basedir which can either be a binary
145
# release or installed source directory and return the path.
158
if test -f "$basedir/$dir/$file"
160
if test -n "$return_dir"
164
echo "$basedir/$dir/$file"
174
echo "FATAL ERROR: Could not find $*"
176
echo "If you compiled from source, you need to run 'make install' to"
177
echo "copy the software into the correct location ready for operation."
179
echo "If you are using a binary release, you must either be at the top"
180
echo "level of the extracted archive, or pass the --basedir option"
181
echo "pointing to that location."
185
# Ok, let's go. We first need to parse arguments which are required by
186
# my_print_defaults so that we can execute it first, then later re-parse
187
# the command line to add any extra bits that we need.
188
parse_arguments PICK-ARGS-FROM-ARGV "$@"
191
# We can now find my_print_defaults. This script supports:
193
# --srcdir=path pointing to compiled source tree
194
# --basedir=path pointing to installed binary location
196
# or default to compiled-in locations.
198
if test -n "$srcdir" && test -n "$basedir"
200
echo "ERROR: Specify either --basedir or --srcdir, not both."
205
if test -z "$builddir"
209
print_defaults="$builddir/extra/my_print_defaults"
210
elif test -n "$basedir"
212
print_defaults=`find_in_basedir my_print_defaults bin extra`
214
print_defaults="@bindir@/my_print_defaults"
217
if test ! -x "$print_defaults"
219
cannot_find_file "$print_defaults"
223
# Now we can get arguments from the groups [mysqld] and [mysql_install_db]
224
# in the my.cfg file, then re-run to merge with command line arguments.
225
parse_arguments `$print_defaults $defaults mysqld mysql_install_db`
226
parse_arguments PICK-ARGS-FROM-ARGV "$@"
228
# Configure paths to support files
232
bindir="$basedir/client"
233
extra_bindir="$basedir/extra"
234
mysqld="$basedir/sql/mysqld"
235
mysqld_opt="--language=$srcdir/sql/share/english"
236
pkgdatadir="$srcdir/scripts"
237
scriptdir="$srcdir/scripts"
238
elif test -n "$basedir"
240
bindir="$basedir/bin"
241
extra_bindir="$bindir"
242
mysqld=`find_in_basedir mysqld libexec sbin bin`
243
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
244
scriptdir="$basedir/scripts"
248
extra_bindir="$bindir"
249
mysqld="@libexecdir@/mysqld"
250
pkgdatadir="@pkgdatadir@"
251
scriptdir="@scriptdir@"
254
# Set up paths to SQL scripts required for bootstrap
255
fill_help_tables="$pkgdatadir/fill_help_tables.sql"
256
create_system_tables="$pkgdatadir/mysql_system_tables.sql"
258
for f in $fill_help_tables $create_system_tables
262
cannot_find_file "$f"
267
if test ! -x "$mysqld"
269
cannot_find_file "$mysqld"
273
# Try to determine the hostname
274
hostname=`@HOSTNAME@`
276
# Check if hostname is valid
277
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
279
resolved=`$extra_bindir/resolveip $hostname 2>&1`
282
resolved=`$extra_bindir/resolveip localhost 2>&1`
285
echo "Neither host '$hostname' nor 'localhost' could be looked up with"
286
echo "$extra_bindir/resolveip"
287
echo "Please configure the 'hostname' command to return a correct"
289
echo "If you want to solve this at a later stage, restart this script"
290
echo "with the --force option"
293
echo "WARNING: The host '$hostname' could not be looked up with resolveip."
294
echo "This probably means that your libc libraries are not 100 % compatible"
295
echo "with this binary MySQL version. The MySQL daemon, mysqld, should work"
296
echo "normally with the exception that host name resolving will not work."
297
echo "This means that you should use IP addresses instead of hostnames"
298
echo "when specifying MySQL privileges !"
302
if test "$ip_only" -eq 1
304
hostname=`echo "$resolved" | awk '/ /{print $6}'`
307
# Create database directories
308
for dir in $ldata $ldata/mysql $ldata/test
315
if test -w / -a ! -z "$user"
323
args="$args --user=$user"
326
# When doing a "cross bootstrap" install, no reference to the current
327
# host should be added to the system tables. So we filter out any
328
# lines which contain the current host name.
329
if test $cross_bootstrap -eq 1
331
filter_cmd_line="sed -e '/@current_hostname/d'"
333
filter_cmd_line="cat"
336
# Configure mysqld command line
337
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
338
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
339
--basedir=$basedir --datadir=$ldata --log-warnings=0 --loose-skip-innodb \
340
--loose-skip-ndbcluster $args --max_allowed_packet=8M \
341
--net_buffer_length=16K"
343
# Create the system and help tables by passing them to "mysqld --bootstrap"
344
s_echo "Installing MySQL system tables..."
345
if { echo "use mysql;"; cat $create_system_tables; } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null
350
echo "Installation of system tables failed! Examine the logs in"
351
echo "$ldata for more information."
353
echo "You can try to start the mysqld daemon with:"
355
echo " shell> $mysqld --skip-grant &"
357
echo "and use the command line tool $bindir/mysql"
358
echo "to connect to the mysql database and look at the grant tables:"
360
echo " shell> $bindir/mysql -u root mysql"
361
echo " mysql> show tables"
363
echo "Try 'mysqld --help' if you have problems with paths. Using --log"
364
echo "gives you a log in $ldata that may be helpful."
366
echo "The latest information about MySQL is available on the web at"
367
echo "http://www.mysql.com/. Please consult the MySQL manual section"
368
echo "'Problems running mysql_install_db', and the manual section that"
369
echo "describes problems on your OS. Another information source are the"
370
echo "MySQL email archives available at http://lists.mysql.com/."
372
echo "Please check all of the above before mailing us! And remember, if"
373
echo "you do mail us, you MUST use the $scriptdir/mysqlbug script!"
378
s_echo "Filling help tables..."
379
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
384
echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!"
385
echo "The \"HELP\" command might not work properly."
388
# Don't output verbose information if running inside bootstrap or using
389
# --srcdir for testing. In such cases, there's no end user looking at
391
if test "$cross_bootstrap" -eq 0 && test -z "$srcdir"
394
s_echo "To start mysqld at boot time you have to copy"
395
s_echo "support-files/mysql.server to the right place for your system"
398
echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !"
399
echo "To do so, start the server, then issue the following commands:"
401
echo "$bindir/mysqladmin -u root password 'new-password'"
402
echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'"
404
echo "Alternatively you can run:"
405
echo "$bindir/mysql_secure_installation"
407
echo "which will also give you the option of removing the test"
408
echo "databases and anonymous user created by default. This is"
409
echo "strongly recommended for production servers."
411
echo "See the manual for more instructions."
413
if test "$in_rpm" -eq 0
416
echo "You can start the MySQL daemon with:"
417
echo "cd $basedir ; $bindir/mysqld_safe &"
419
echo "You can test the MySQL daemon with mysql-test-run.pl"
420
echo "cd $basedir/mysql-test ; perl mysql-test-run.pl"
424
echo "Please report any problems with the $scriptdir/mysqlbug script!"
426
echo "The latest information about MySQL is available at http://www.mysql.com/"
427
echo "Support MySQL by buying support/licenses from http://shop.mysql.com/"