~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to scripts/mysql_install_db.sh

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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