[MDEV-30130] mariadb_install_db argument parsing of "" incorrect Created: 2022-11-30  Updated: 2024-02-06

Status: Open
Project: MariaDB Server
Component/s: Docker
Affects Version/s: 10.6.11
Fix Version/s: 10.4, 10.5, 10.6

Type: Bug Priority: Minor
Reporter: Daniel Black Assignee: Daniel Black
Resolution: Unresolved Votes: 0
Labels: None


 Description   

In the official MariaDB container image, the old_mode variable - when set at the command line - behaves inconsistently with a locally-installed version of MariaDB 10.6.11 on the same machine.

In addition, the command-line argument handling is inconsistent for string-valued flags when setting them to the empty string.

Environment:

  • Docker client and server: Docker Engine Community, 20.10.21
  • Host: Rocky Linux 8.7 on x64
  • MariaDB version: 10.6.11, installed via RPM or run inside a Docker container.

docker run --rm -e=MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6 --old-mode=""

2022-11-29 11:05:05+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.6.11+maria~ubu2004 started.
2022-11-29 11:05:05+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-11-29 11:05:05+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.6.11+maria~ubu2004 started.
2022-11-29 11:05:05+00:00 [Note] [Entrypoint]: Initializing database files
ERROR: 1071  Specified key was too long; max key length is 2300 bytes
2022-11-29 11:05:05 0 [ERROR] Aborting
 
Installation of system tables failed!  Examine the logs in
/var/lib/mysql/ for more information.
 
The problem could be conflicting information in an external
my.cnf files. You can ignore these by doing:
 
    shell> /usr/bin/mariadb-install-db --defaults-file=~/.my.cnf
 
You can also try to start the mysqld daemon with:
 
    shell> /usr/sbin/mariadbd --skip-grant-tables --general-log &
 
and use the command line tool /usr/bin/mariadb
to connect to the mysql database and look at the grant tables:
 
    shell> /usr/bin/mysql -u root mysql
    mysql> show tables;
 
Try 'mysqld --help' if you have problems with paths.  Using
--general-log gives you a log in /var/lib/mysql/ that may be helpful.
 
The latest information about mysql_install_db is available at
https://mariadb.com/kb/en/installing-system-tables-mysql_install_db
You can find the latest source at https://downloads.mariadb.org and
the maria-discuss email list at https://launchpad.net/~maria-discuss
 
Please check all of the above before submitting a bug report
at https://mariadb.org/jira

docker run --rm -e=MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6 --old-mode ""

2022-11-29 11:06:50+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.6.11+maria~ubu2004 started.
2022-11-29 11:06:50+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-11-29 11:06:50+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.6.11+maria~ubu2004 started.
2022-11-29 11:06:50+00:00 [Note] [Entrypoint]: Initializing database files
2022-11-29 11:06:50 0 [ERROR] /usr/sbin/mariadbd: Error while setting value '--default-time-zone=SYSTEM' to 'old_mode'
 
Installation of system tables failed!  Examine the logs in
/var/lib/mysql/ for more information.
[...]

Despite the message given, no logs are left in /var/lib/mysql/ inside the container.

The behaviour changes when the /var/lib/mysql directory is set as a mount inside the container. The first run fails with the "2300 bytes" error, while the second run with the same volume mounted succeeds. (e.g. docker run --mount=type=volume,source=mariadb-test,destination=/var/lib/mysql --rm -e=MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6 --old-mode="")



 Comments   
Comment by Daniel Black [ 2022-11-30 ]

seang, cloned from MDEV-30126. Technically producable out of containers by formulating the arguments to mysql_install_db the same way.

$ mkdir -p /tmp/${PWD##*/}-datadir && scripts/mysql_install_db --no-defaults --srcdir=$OLDPWD --builddir=$PWD --rpm --auth-root-authentication-method=normal --datadir=/tmp/${PWD##*/}-datadir --old-mode ""  --skip-test-db --default-time-zone=SYSTEM --enforce-storage-engine= --skip-log-bin \
                --expire-logs-days=0 \
                --loose-innodb_buffer_pool_load_at_startup=0 \
                --loose-innodb_buffer_pool_dump_at_shutdown=0
2022-11-30 11:32:18 0 [ERROR] /home/dan/repos/build-mariadb-server-10.6/sql/mysqld: Error while setting value '--default-time-zone=SYSTEM' to 'old_mode'

Appears to the in the mysql_install_db.sh arg parsing rather than the server.

Affects 10.3

~/repos/build-mariadb-server-10.3 
$ rm -rf /tmp/build-mariadb-server-10.3-datadir
 
~/repos/build-mariadb-server-10.3 
$  mkdir -p /tmp/${PWD##*/}-datadir && scripts/mysql_install_db --no-defaults --srcdir=$OLDPWD --builddir=$PWD --rpm  --datadir=/tmp/${PWD##*/}-datadir --old-mode "" --default-time-zone=SYSTEM --enforce-storage-engine= --skip-log-bin \
                --expire-logs-days=0 \
                --loose-innodb_buffer_pool_load_at_startup=0 \
                --loose-innodb_buffer_pool_dump_at_shutdown=0
2022-11-30 11:41:13 0 [ERROR] /home/dan/repos/build-mariadb-server-10.3/sql/mysqld: Error while setting value '--default-time-zone=SYSTEM' to 'old_mode'

Generated at Thu Feb 08 10:13:52 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.