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 |
||
28.1.31
by Monty Taylor
Deleted tons of pointless garbage from scripts. |
258 |
for f in $fill_help_tables $create_system_tables |
1
by brian
clean slate |
259 |
do
|
260 |
if test ! -f "$f" |
|
261 |
then
|
|
262 |
cannot_find_file "$f" |
|
263 |
exit 1 |
|
264 |
fi
|
|
265 |
done
|
|
266 |
||
267 |
if test ! -x "$mysqld" |
|
268 |
then
|
|
269 |
cannot_find_file "$mysqld" |
|
270 |
exit 1 |
|
271 |
fi
|
|
272 |
||
273 |
# Try to determine the hostname
|
|
274 |
hostname=`@HOSTNAME@` |
|
275 |
||
276 |
# Check if hostname is valid
|
|
277 |
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0 |
|
278 |
then
|
|
279 |
resolved=`$extra_bindir/resolveip $hostname 2>&1` |
|
280 |
if test $? -ne 0 |
|
281 |
then
|
|
282 |
resolved=`$extra_bindir/resolveip localhost 2>&1` |
|
283 |
if test $? -ne 0 |
|
284 |
then
|
|
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" |
|
288 |
echo "hostname." |
|
289 |
echo "If you want to solve this at a later stage, restart this script" |
|
290 |
echo "with the --force option" |
|
291 |
exit 1 |
|
292 |
fi
|
|
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 !" |
|
299 |
fi
|
|
300 |
fi
|
|
301 |
||
302 |
if test "$ip_only" -eq 1 |
|
303 |
then
|
|
304 |
hostname=`echo "$resolved" | awk '/ /{print $6}'` |
|
305 |
fi
|
|
306 |
||
307 |
# Create database directories
|
|
308 |
for dir in $ldata $ldata/mysql $ldata/test |
|
309 |
do
|
|
310 |
if test ! -d $dir |
|
311 |
then
|
|
312 |
mkdir -p $dir
|
|
313 |
chmod 700 $dir |
|
314 |
fi
|
|
315 |
if test -w / -a ! -z "$user" |
|
316 |
then
|
|
317 |
chown $user $dir |
|
318 |
fi
|
|
319 |
done
|
|
320 |
||
321 |
if test -n "$user" |
|
322 |
then
|
|
323 |
args="$args --user=$user" |
|
324 |
fi
|
|
325 |
||
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 |
|
330 |
then
|
|
331 |
filter_cmd_line="sed -e '/@current_hostname/d'" |
|
332 |
else
|
|
333 |
filter_cmd_line="cat" |
|
334 |
fi
|
|
335 |
||
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"
|
|
342 |
||
343 |
# Create the system and help tables by passing them to "mysqld --bootstrap"
|
|
344 |
s_echo "Installing MySQL system tables..."
|
|
28.1.31
by Monty Taylor
Deleted tons of pointless garbage from scripts. |
345 |
if { echo "use mysql;"; cat $create_system_tables } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null |
1
by brian
clean slate |
346 |
then
|
347 |
s_echo "OK"
|
|
348 |
else
|
|
349 |
echo
|
|
350 |
echo "Installation of system tables failed! Examine the logs in" |
|
351 |
echo "$ldata for more information." |
|
352 |
echo
|
|
353 |
echo "You can try to start the mysqld daemon with:" |
|
354 |
echo
|
|
355 |
echo " shell> $mysqld --skip-grant &" |
|
356 |
echo
|
|
357 |
echo "and use the command line tool $bindir/mysql" |
|
358 |
echo "to connect to the mysql database and look at the grant tables:" |
|
359 |
echo
|
|
360 |
echo " shell> $bindir/mysql -u root mysql" |
|
361 |
echo " mysql> show tables" |
|
362 |
echo
|
|
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." |
|
365 |
echo
|
|
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/." |
|
371 |
echo
|
|
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!" |
|
374 |
echo
|
|
375 |
exit 1 |
|
376 |
fi
|
|
377 |
||
378 |
s_echo "Filling help tables..."
|
|
379 |
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null |
|
380 |
then
|
|
381 |
s_echo "OK"
|
|
382 |
else
|
|
383 |
echo
|
|
384 |
echo "WARNING: HELP FILES ARE NOT COMPLETELY INSTALLED!" |
|
385 |
echo "The \"HELP\" command might not work properly." |
|
386 |
fi
|
|
387 |
||
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
|
|
390 |
# the screen.
|
|
391 |
if test "$cross_bootstrap" -eq 0 && test -z "$srcdir" |
|
392 |
then
|
|
393 |
s_echo |
|
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"
|
|
396 |
||
397 |
echo
|
|
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:" |
|
400 |
echo
|
|
401 |
echo "$bindir/mysqladmin -u root password 'new-password'" |
|
402 |
echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'" |
|
403 |
echo
|
|
404 |
echo "Alternatively you can run:" |
|
405 |
echo "$bindir/mysql_secure_installation" |
|
406 |
echo
|
|
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." |
|
410 |
echo
|
|
411 |
echo "See the manual for more instructions." |
|
412 |
||
413 |
if test "$in_rpm" -eq 0 |
|
414 |
then
|
|
415 |
echo
|
|
416 |
echo "You can start the MySQL daemon with:" |
|
417 |
echo "cd $basedir ; $bindir/mysqld_safe &" |
|
418 |
echo
|
|
419 |
echo "You can test the MySQL daemon with mysql-test-run.pl" |
|
420 |
echo "cd $basedir/mysql-test ; perl mysql-test-run.pl" |
|
421 |
fi
|
|
422 |
||
423 |
echo
|
|
424 |
echo "Please report any problems with the $scriptdir/mysqlbug script!" |
|
425 |
echo
|
|
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/" |
|
428 |
echo
|
|
429 |
fi
|
|
430 |
||
431 |
exit 0 |