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"
257
fill_system_tables="$pkgdatadir/mysql_system_tables_data.sql"
259
for f in $fill_help_tables $create_system_tables $fill_system_tables
263
cannot_find_file "$f"
268
if test ! -x "$mysqld"
270
cannot_find_file "$mysqld"
274
# Try to determine the hostname
275
hostname=`@HOSTNAME@`
277
# Check if hostname is valid
278
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
280
resolved=`$extra_bindir/resolveip $hostname 2>&1`
283
resolved=`$extra_bindir/resolveip localhost 2>&1`
286
echo "Neither host '$hostname' nor 'localhost' could be looked up with"
287
echo "$extra_bindir/resolveip"
288
echo "Please configure the 'hostname' command to return a correct"
290
echo "If you want to solve this at a later stage, restart this script"
291
echo "with the --force option"
294
echo "WARNING: The host '$hostname' could not be looked up with resolveip."
295
echo "This probably means that your libc libraries are not 100 % compatible"
296
echo "with this binary MySQL version. The MySQL daemon, mysqld, should work"
297
echo "normally with the exception that host name resolving will not work."
298
echo "This means that you should use IP addresses instead of hostnames"
299
echo "when specifying MySQL privileges !"
303
if test "$ip_only" -eq 1
305
hostname=`echo "$resolved" | awk '/ /{print $6}'`
308
# Create database directories
309
for dir in $ldata $ldata/mysql $ldata/test
316
if test -w / -a ! -z "$user"
324
args="$args --user=$user"
327
# When doing a "cross bootstrap" install, no reference to the current
328
# host should be added to the system tables. So we filter out any
329
# lines which contain the current host name.
330
if test $cross_bootstrap -eq 1
332
filter_cmd_line="sed -e '/@current_hostname/d'"
334
filter_cmd_line="cat"
337
# Configure mysqld command line
338
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
339
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
340
--basedir=$basedir --datadir=$ldata --log-warnings=0 --loose-skip-innodb \
341
--loose-skip-ndbcluster $args --max_allowed_packet=8M \
342
--net_buffer_length=16K"
344
# Create the system and help tables by passing them to "mysqld --bootstrap"
345
s_echo "Installing MySQL system tables..."
346
if { echo "use mysql;"; cat $create_system_tables $fill_system_tables; } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null
351
echo "Installation of system tables failed! Examine the logs in"
352
echo "$ldata for more information."
354
echo "You can try to start the mysqld daemon with:"
356
echo " shell> $mysqld --skip-grant &"
358
echo "and use the command line tool $bindir/mysql"
359
echo "to connect to the mysql database and look at the grant tables:"
361
echo " shell> $bindir/mysql -u root mysql"
362
echo " mysql> show tables"
364
echo "Try 'mysqld --help' if you have problems with paths. Using --log"
365
echo "gives you a log in $ldata that may be helpful."
367
echo "The latest information about MySQL is available on the web at"
368
echo "http://www.mysql.com/. Please consult the MySQL manual section"
369
echo "'Problems running mysql_install_db', and the manual section that"
370
echo "describes problems on your OS. Another information source are the"
371
echo "MySQL email archives available at http://lists.mysql.com/."
373
echo "Please check all of the above before mailing us! And remember, if"
374
echo "you do mail us, you MUST use the $scriptdir/mysqlbug script!"
379
s_echo "Filling help tables..."
380
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
385
echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!"
386
echo "The \"HELP\" command might not work properly."
389
# Don't output verbose information if running inside bootstrap or using
390
# --srcdir for testing. In such cases, there's no end user looking at
392
if test "$cross_bootstrap" -eq 0 && test -z "$srcdir"
395
s_echo "To start mysqld at boot time you have to copy"
396
s_echo "support-files/mysql.server to the right place for your system"
399
echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !"
400
echo "To do so, start the server, then issue the following commands:"
402
echo "$bindir/mysqladmin -u root password 'new-password'"
403
echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'"
405
echo "Alternatively you can run:"
406
echo "$bindir/mysql_secure_installation"
408
echo "which will also give you the option of removing the test"
409
echo "databases and anonymous user created by default. This is"
410
echo "strongly recommended for production servers."
412
echo "See the manual for more instructions."
414
if test "$in_rpm" -eq 0
417
echo "You can start the MySQL daemon with:"
418
echo "cd $basedir ; $bindir/mysqld_safe &"
420
echo "You can test the MySQL daemon with mysql-test-run.pl"
421
echo "cd $basedir/mysql-test ; perl mysql-test-run.pl"
425
echo "Please report any problems with the $scriptdir/mysqlbug script!"
427
echo "The latest information about MySQL is available at http://www.mysql.com/"
428
echo "Support MySQL by buying support/licenses from http://shop.mysql.com/"