mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Bug #32219: too many hosts in default grant tables 6.0.3
Fix is to remove any references to the current hostname when running mysql_install_db --cross-bootstrap. (The dist-hook make target makes this call, and the resulting data directory is included in the source distribution as win/data/*.) Also, a few other clean-ups to mysql_install_db while there. Makefile.am: Adapt to clean-up in mysql_install_db (--windows becomes --cross-bootstrap) scripts/mysql_install_db.sh: Filter out references to the current hostname when performing a cross-bootstrap installation by removing any lines which contain the string "@current_hostname". Deprecate the old --windows option; use --cross-bootstrap instead, since it more accurately reflects the purpose. Other clean-up: the wrong syntax was being used to test the exit status of mysqld --bootstrap. It mostly worked, as long as mysqld succeeded. However, it was not robust. scripts/mysql_system_tables_data.sql: Rename local @hostname variable to @current_hostname, which is a more unique label to search on. mysql_install_db now filters out all lines which include "@current_hostname" during a --cross-bootstrap installation.
This commit is contained in:
parent
a6f8ec0b95
commit
3308d8794e
3 changed files with 46 additions and 33 deletions
|
@ -102,7 +102,7 @@ dist-hook:
|
|||
rm -rf `find $(distdir) -type d -name SCCS -print`
|
||||
rm -f `find $(distdir) -type l -print`
|
||||
mkdir -p $(distdir)/win
|
||||
scripts/mysql_install_db --no-defaults --windows \
|
||||
scripts/mysql_install_db --no-defaults --cross-bootstrap \
|
||||
--basedir=$(top_builddir) \
|
||||
--datadir=$(distdir)/win/data \
|
||||
--srcdir=$(top_srcdir)
|
||||
|
|
|
@ -30,13 +30,15 @@ user=""
|
|||
force=0
|
||||
in_rpm=0
|
||||
ip_only=0
|
||||
windows=0
|
||||
cross_bootstrap=0
|
||||
|
||||
usage()
|
||||
{
|
||||
cat <<EOF
|
||||
Usage: $0 [OPTIONS]
|
||||
--basedir=path The path to the MySQL installation directory.
|
||||
--cross-bootstrap For internal use. Used when building the MySQL system
|
||||
tables on a different host than the target.
|
||||
--datadir=path The path to the MySQL data directory.
|
||||
--force Causes mysql_install_db to run even if DNS does not
|
||||
work. In that case, grant table entries that normally
|
||||
|
@ -56,8 +58,6 @@ Usage: $0 [OPTIONS]
|
|||
user. You must be root to use this option. By default
|
||||
mysqld runs using your current login name and files and
|
||||
directories that it creates will be owned by you.
|
||||
--windows For internal use. This option is used for creating
|
||||
Windows distributions.
|
||||
|
||||
All other options are passed to the mysqld program
|
||||
|
||||
|
@ -67,7 +67,7 @@ EOF
|
|||
|
||||
s_echo()
|
||||
{
|
||||
if test "$in_rpm" -eq 0 -a "$windows" -eq 0
|
||||
if test "$in_rpm" -eq 0 -a "$cross_bootstrap" -eq 0
|
||||
then
|
||||
echo "$1"
|
||||
fi
|
||||
|
@ -109,16 +109,17 @@ parse_arguments()
|
|||
--no-defaults|--defaults-file=*|--defaults-extra-file=*)
|
||||
defaults="$arg" ;;
|
||||
|
||||
--windows)
|
||||
# This is actually a "cross bootstrap" argument used when
|
||||
# building the MySQL system tables on a different host
|
||||
# than the target. The platform independent
|
||||
# files that are created in --datadir on the host can
|
||||
# be copied to the target system, the most common use for
|
||||
# this feature is in the windows installer which will take
|
||||
# the files from datadir and include them as part of the install
|
||||
# package.
|
||||
windows=1 ;;
|
||||
--cross-bootstrap|--windows)
|
||||
# Used when building the MySQL system tables on a different host than
|
||||
# the target. The platform-independent files that are created in
|
||||
# --datadir on the host can be copied to the target system.
|
||||
#
|
||||
# The most common use for this feature is in the Windows installer
|
||||
# which will take the files from datadir and include them as part of
|
||||
# the install package. See top-level 'dist-hook' make target.
|
||||
#
|
||||
# --windows is a deprecated alias
|
||||
cross_bootstrap=1 ;;
|
||||
|
||||
*)
|
||||
if test -n "$pick_args"
|
||||
|
@ -213,8 +214,8 @@ then
|
|||
pkgdatadir="@pkgdatadir@"
|
||||
else
|
||||
bindir="$basedir/bin"
|
||||
# We set up bootstrap-specific paths later, so skip this for --windows
|
||||
if test "$windows" -eq 0
|
||||
# We set up bootstrap-specific paths later, so skip this for now
|
||||
if test "$cross_bootstrap" -eq 0
|
||||
then
|
||||
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
|
||||
if test -z "$pkgdatadir"
|
||||
|
@ -256,8 +257,8 @@ do
|
|||
fi
|
||||
done
|
||||
|
||||
# Set up Windows-specific paths
|
||||
if test "$windows" -eq 1
|
||||
# Set up bootstrap-specific paths
|
||||
if test "$cross_bootstrap" -eq 1
|
||||
then
|
||||
mysqld="./sql/mysqld"
|
||||
if test -n "$srcdir" -a -f "$srcdir/sql/share/english/errmsg.sys"
|
||||
|
@ -280,7 +281,7 @@ fi
|
|||
hostname=`@HOSTNAME@`
|
||||
|
||||
# Check if hostname is valid
|
||||
if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
|
||||
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
|
||||
then
|
||||
resolved=`$bindir/resolveip $hostname 2>&1`
|
||||
if [ $? -ne 0 ]
|
||||
|
@ -329,6 +330,16 @@ then
|
|||
args="$args --user=$user"
|
||||
fi
|
||||
|
||||
# When doing a "cross bootstrap" install, no reference to the current
|
||||
# host should be added to the system tables. So we filter out any
|
||||
# lines which contain the current host name.
|
||||
if test $cross_bootstrap -eq 1
|
||||
then
|
||||
filter_cmd_line="sed -e '/@current_hostname/d'"
|
||||
else
|
||||
filter_cmd_line="cat"
|
||||
fi
|
||||
|
||||
# Peform the install of system tables
|
||||
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
|
||||
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
|
||||
|
@ -337,15 +348,14 @@ mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
|
|||
|
||||
# Pipe mysql_system_tables.sql to "mysqld --bootstrap"
|
||||
s_echo "Installing MySQL system tables..."
|
||||
if `(echo "use mysql;"; cat $create_system_tables $fill_system_tables) | $mysqld_install_cmd_line`
|
||||
if { echo "use mysql;"; cat $create_system_tables $fill_system_tables; } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null
|
||||
then
|
||||
s_echo "OK"
|
||||
|
||||
s_echo "Filling help tables..."
|
||||
# Pipe fill_help_tables.sql to "mysqld --bootstrap"
|
||||
if `(echo "use mysql;"; cat $fill_help_tables) | $mysqld_install_cmd_line`
|
||||
if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
|
||||
then
|
||||
# Fill suceeded
|
||||
s_echo "OK"
|
||||
else
|
||||
echo
|
||||
|
@ -359,14 +369,12 @@ then
|
|||
s_echo "support-files/mysql.server to the right place for your system"
|
||||
s_echo
|
||||
|
||||
if test "$windows" -eq 0
|
||||
if test "$cross_bootstrap" -eq 0
|
||||
then
|
||||
# A root password should of course also be set on Windows!
|
||||
# The reason for not displaying these prompts here is that when
|
||||
# executing this script with the --windows argument the script
|
||||
# is used to generate system tables mainly used by the
|
||||
# windows installer. And thus the password should not be set until
|
||||
# those files has been copied to the target system
|
||||
# This is not a true installation on a running system. The end user must
|
||||
# set a password after installing the data files on the real host system.
|
||||
# At this point, there is no end user, so it does not make sense to print
|
||||
# this reminder.
|
||||
echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !"
|
||||
echo "To do so, start the server, then issue the following commands:"
|
||||
echo "$bindir/mysqladmin -u root password 'new-password'"
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
-- The inital data for system tables of MySQL Server
|
||||
--
|
||||
|
||||
-- When setting up a "cross bootstrap" database (e.g., creating data on a Unix
|
||||
-- host which will later be included in a Windows zip file), any lines
|
||||
-- containing "@current_hostname" are filtered out by mysql_install_db.
|
||||
set @current_hostname= @@hostname;
|
||||
|
||||
|
||||
-- Fill "db" table with default grants for anyone to
|
||||
-- access database 'test' and 'test_%' if "db" table didn't exist
|
||||
CREATE TEMPORARY TABLE tmp_db LIKE db;
|
||||
|
@ -15,10 +21,9 @@ DROP TABLE tmp_db;
|
|||
-- from local machine if "users" table didn't exist before
|
||||
CREATE TEMPORARY TABLE tmp_user LIKE user;
|
||||
INSERT INTO tmp_user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
set @hostname= @@hostname;
|
||||
REPLACE INTO tmp_user VALUES (@hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES (@current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
INSERT INTO tmp_user (host,user) VALUES ('localhost','');
|
||||
INSERT INTO tmp_user (host,user) VALUES (@@hostname,'');
|
||||
INSERT INTO tmp_user (host,user) VALUES (@current_hostname,'');
|
||||
INSERT INTO user SELECT * FROM tmp_user WHERE @had_user_table=0;
|
||||
DROP TABLE tmp_user;
|
||||
|
|
Loading…
Reference in a new issue