~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
#!/bin/sh
2
# Copyright (C) 2002-2003 MySQL AB
3
# 
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.
7
# 
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.
12
# 
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
16
17
# This scripts creates the MySQL Server system tables
18
#
19
# All unrecognized arguments to this script are passed to mysqld.
20
21
basedir=""
22
builddir=""
23
ldata="@localstatedir@"
24
srcdir=""
25
26
args=""
27
defaults=""
28
mysqld_opt=""
29
user=""
30
31
force=0
32
in_rpm=0
33
ip_only=0
34
cross_bootstrap=0
35
36
usage()
37
{
38
  cat <<EOF
39
Usage: $0 [OPTIONS]
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.
65
66
All other options are passed to the mysqld program
67
68
EOF
69
  exit 1
70
}
71
72
s_echo()
73
{
74
  if test "$in_rpm" -eq 0 -a "$cross_bootstrap" -eq 0
75
  then
76
    echo "$1"
77
  fi
78
}
79
80
parse_arg()
81
{
82
  echo "$1" | sed -e 's/^[^=]*=//'
83
}
84
85
parse_arguments()
86
{
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.
90
  pick_args=
91
  if test "$1" = PICK-ARGS-FROM-ARGV
92
  then
93
    pick_args=1
94
    shift
95
  fi
96
97
  for arg
98
  do
99
    case "$arg" in
100
      --force) force=1 ;;
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"` ;;
105
      --user=*)
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
112
      --rpm) in_rpm=1 ;;
113
      --help) usage ;;
114
      --no-defaults|--defaults-file=*|--defaults-extra-file=*)
115
        defaults="$arg" ;;
116
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.
121
        #
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.
125
        #
126
        # --windows is a deprecated alias
127
        cross_bootstrap=1 ;;
128
129
      *)
130
        if test -n "$pick_args"
131
        then
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'`
137
          args="$args $arg"
138
        fi
139
        ;;
140
    esac
141
  done
142
}
143
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.
146
find_in_basedir()
147
{
148
  case "$1" in
149
    --dir)
150
      return_dir=1; shift
151
      ;;
152
  esac
153
154
  file=$1; shift
155
156
  for dir in "$@"
157
  do
158
    if test -f "$basedir/$dir/$file"
159
    then
160
      if test -n "$return_dir"
161
      then
162
        echo "$basedir/$dir"
163
      else
164
        echo "$basedir/$dir/$file"
165
      fi
166
      break
167
    fi
168
  done
169
}
170
171
cannot_find_file()
172
{
173
  echo
174
  echo "FATAL ERROR: Could not find $*"
175
  echo
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."
178
  echo
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."
182
  echo
183
}
184
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 "$@"
189
190
#
191
# We can now find my_print_defaults.  This script supports:
192
#
193
#   --srcdir=path pointing to compiled source tree
194
#   --basedir=path pointing to installed binary location
195
#
196
# or default to compiled-in locations.
197
#
198
if test -n "$srcdir" && test -n "$basedir"
199
then
200
  echo "ERROR: Specify either --basedir or --srcdir, not both."
201
  exit 1
202
fi
203
if test -n "$srcdir"
204
then
205
  if test -z "$builddir"
206
  then
207
    builddir="$srcdir"
208
  fi
209
  print_defaults="$builddir/extra/my_print_defaults"
210
elif test -n "$basedir"
211
then
212
  print_defaults=`find_in_basedir my_print_defaults bin extra`
213
else
214
  print_defaults="@bindir@/my_print_defaults"
215
fi
216
217
if test ! -x "$print_defaults"
218
then
219
  cannot_find_file "$print_defaults"
220
  exit 1
221
fi
222
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 "$@"
227
228
# Configure paths to support files
229
if test -n "$srcdir"
230
then
231
  basedir="$builddir"
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"
239
then
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"
245
else
246
  basedir="@prefix@"
247
  bindir="@bindir@"
248
  extra_bindir="$bindir"
249
  mysqld="@libexecdir@/mysqld"
250
  pkgdatadir="@pkgdatadir@"
251
  scriptdir="@scriptdir@"
252
fi
253
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"
258
259
for f in $fill_help_tables $create_system_tables $fill_system_tables
260
do
261
  if test ! -f "$f"
262
  then
263
    cannot_find_file "$f"
264
    exit 1
265
  fi
266
done
267
268
if test ! -x "$mysqld"
269
then
270
  cannot_find_file "$mysqld"
271
  exit 1
272
fi
273
274
# Try to determine the hostname
275
hostname=`@HOSTNAME@`
276
277
# Check if hostname is valid
278
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
279
then
280
  resolved=`$extra_bindir/resolveip $hostname 2>&1`
281
  if test $? -ne 0
282
  then
283
    resolved=`$extra_bindir/resolveip localhost 2>&1`
284
    if test $? -ne 0
285
    then
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"
289
      echo "hostname."
290
      echo "If you want to solve this at a later stage, restart this script"
291
      echo "with the --force option"
292
      exit 1
293
    fi
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 !"
300
  fi
301
fi
302
303
if test "$ip_only" -eq 1
304
then
305
  hostname=`echo "$resolved" | awk '/ /{print $6}'`
306
fi
307
308
# Create database directories
309
for dir in $ldata $ldata/mysql $ldata/test
310
do
311
  if test ! -d $dir
312
  then
313
    mkdir -p $dir
314
    chmod 700 $dir
315
  fi
316
  if test -w / -a ! -z "$user"
317
  then
318
    chown $user $dir
319
  fi
320
done
321
322
if test -n "$user"
323
then
324
  args="$args --user=$user"
325
fi
326
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
331
then
332
  filter_cmd_line="sed -e '/@current_hostname/d'"
333
else
334
  filter_cmd_line="cat"
335
fi
336
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"
343
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
347
then
348
  s_echo "OK"
349
else
350
  echo
351
  echo "Installation of system tables failed!  Examine the logs in"
352
  echo "$ldata for more information."
353
  echo
354
  echo "You can try to start the mysqld daemon with:"
355
  echo
356
  echo "    shell> $mysqld --skip-grant &"
357
  echo
358
  echo "and use the command line tool $bindir/mysql"
359
  echo "to connect to the mysql database and look at the grant tables:"
360
  echo
361
  echo "    shell> $bindir/mysql -u root mysql"
362
  echo "    mysql> show tables"
363
  echo
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."
366
  echo
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/."
372
  echo
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!"
375
  echo
376
  exit 1
377
fi
378
379
s_echo "Filling help tables..."
380
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
381
then
382
  s_echo "OK"
383
else
384
  echo
385
  echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!"
386
  echo "The \"HELP\" command might not work properly."
387
fi
388
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
391
# the screen.
392
if test "$cross_bootstrap" -eq 0 && test -z "$srcdir"
393
then
394
  s_echo
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"
397
398
  echo
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:"
401
  echo
402
  echo "$bindir/mysqladmin -u root password 'new-password'"
403
  echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'"
404
  echo
405
  echo "Alternatively you can run:"
406
  echo "$bindir/mysql_secure_installation"
407
  echo
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."
411
  echo
412
  echo "See the manual for more instructions."
413
414
  if test "$in_rpm" -eq 0
415
  then
416
    echo
417
    echo "You can start the MySQL daemon with:"
418
    echo "cd $basedir ; $bindir/mysqld_safe &"
419
    echo
420
    echo "You can test the MySQL daemon with mysql-test-run.pl"
421
    echo "cd $basedir/mysql-test ; perl mysql-test-run.pl"
422
  fi
423
424
  echo
425
  echo "Please report any problems with the $scriptdir/mysqlbug script!"
426
  echo
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/"
429
  echo
430
fi
431
432
exit 0