github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/containers/ddev-dbserver/files/create_base_db.sh (about)

     1  #!/bin/bash
     2  
     3  set -eu
     4  set -o pipefail
     5  
     6  SOCKET=/var/tmp/mysql.sock
     7  OUTDIR=/mysqlbase
     8  
     9  mkdir -p ${OUTDIR}
    10  chown -R "$(id -u):$(id -g)" $OUTDIR
    11  
    12  chmod ugo+w /var/tmp
    13  mkdir -p /var/lib/mysql /mnt/ddev_config/mysql && rm -f /var/lib/mysql/* && chmod -R ugo+w /var/lib/mysql
    14  
    15  # On Github Actions, it seems that Apparmor prevents mysqld from having access to /etc/my.cnf, so
    16  # copy to a simpler directory
    17  cp /etc/my.cnf /var/tmp
    18  
    19  echo 'Initializing mysql'
    20  mysqld --version
    21  mysqld_version=$(mysqld --version | awk '{ print $3 }')
    22  mysqld_version=${mysqld_version%%-*}
    23  mysqld_version=${mysqld_version%.*}
    24  echo version=$mysqld_version
    25  # Oracle mysql 5.7+ deprecates mysql_install_db
    26  if [ "${mysqld_version}" = "5.7" ] || [  "${mysqld_version%%%.*}" = "8.0" ]; then
    27      mysqld --defaults-file=/var/tmp/my.cnf --initialize-insecure --datadir=/var/lib/mysql --server-id=0
    28  else
    29      # mysql 5.5 requires running mysql_install_db in /usr/local/mysql
    30      if command -v mysqld | grep usr.local; then
    31          cd /usr/local/mysql
    32      fi
    33      mysql_install_db --defaults-file=/var/tmp/my.cnf --force --datadir=/var/lib/mysql
    34  fi
    35  echo "Starting mysqld --skip-networking --socket=${SOCKET}"
    36  mysqld --defaults-file=/var/tmp/my.cnf --user=root --socket=$SOCKET --innodb_log_file_size=48M --skip-networking --datadir=/var/lib/mysql --server-id=0 --skip-log-bin &
    37  pid="$!"
    38  
    39  # Wait for the server to respond to mysqladmin ping, or fail if it never does,
    40  # or if the process dies.
    41  for i in {90..0}; do
    42  	if mysqladmin ping -uroot --socket=$SOCKET 2>/dev/null; then
    43  		break
    44  	fi
    45  	# Test to make sure we got it started in the first place. kill -s 0 just tests to see if process exists.
    46  	if ! kill -s 0 $pid 2>/dev/null; then
    47  		echo "MariaDB initialization startup failed"
    48  		exit 3
    49  	fi
    50  	sleep 1
    51  done
    52  if [ "$i" -eq 0 ]; then
    53  	echo 'MariaDB initialization startup process timed out.'
    54  	exit 4
    55  fi
    56  
    57  
    58  mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot  mysql
    59  
    60  mysql -uroot <<EOF
    61  	CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE;
    62  	CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';
    63  	CREATE USER '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD';
    64  
    65  	GRANT ALL ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'%';
    66  	GRANT ALL ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'localhost';
    67  
    68  	CREATE USER 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';
    69  	GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
    70  	FLUSH PRIVILEGES;
    71  	FLUSH TABLES;
    72  EOF
    73  
    74  mysqladmin -uroot password root
    75  
    76  if [  "${mysqld_version%%%.*}" = "8.0" ]; then
    77      mysql -uroot -proot <<EOF
    78          ALTER USER 'db'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD';
    79          ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD';
    80          ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD';
    81  EOF
    82  fi
    83  
    84  mysql -uroot -proot -e "SELECT @@character_set_database, @@collation_database;"
    85  
    86  rm -rf ${OUTDIR}/*
    87  
    88  backuptool="mariabackup --defaults-file=/var/tmp/my.cnf"
    89  streamtool=xbstream
    90  if command -v xtrabackup; then
    91    backuptool="xtrabackup --defaults-file=/var/tmp/my.cnf --datadir=/var/lib/mysql";
    92    streamtool=xbstream
    93  fi
    94  
    95  # Initialize with current mariadb_version
    96  PATH=$PATH:/usr/sbin:/usr/local/bin:/usr/local/mysql/bin mysqld -V 2>/dev/null  | awk '{print $3}' > /tmp/raw_mysql_version.txt
    97  # mysqld -V gives us the version in the form of 5.7.28-log for mysql or
    98  # 5.5.64-MariaDB-1~trusty for MariaDB. Detect database type and version and output
    99  # mysql-8.0 or mariadb-10.5.
   100  server_db_version=$(awk -F- '{ sub( /\.[0-9]+(-.*)?$/, "", $1); server_type="mysql"; if ($2 ~ /^MariaDB/) { server_type="mariadb" }; print server_type "_" $1 }' /tmp/raw_mysql_version.txt)
   101  echo ${server_db_version} >/var/lib/mysql/db_mariadb_version.txt
   102  ${backuptool} --backup --stream=${streamtool} --user=root --password=root --socket=$SOCKET  | gzip >${OUTDIR}/base_db.gz
   103  rm -f /tmp/raw_mysql_version.txt
   104  
   105  if ! kill -s TERM "$pid" || ! wait "$pid"; then
   106  	echo >&2 'Database initialization process failed.'
   107  	exit 5
   108  fi
   109  
   110  echo "The startup database files (in mariabackup/xtradb format) are now in $OUTDIR"