github.com/drud/ddev@v1.21.5-alpha1.0.20230226034409-94fcc4b94453/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 echo 'Initializing mysql' 16 mysqld --version 17 mysqld_version=$(mysqld --version | awk '{ print $3 }') 18 mysqld_version=${mysqld_version%%-*} 19 mysqld_version=${mysqld_version%.*} 20 echo version=$mysqld_version 21 # Oracle mysql 5.7+ deprecates mysql_install_db 22 if [ "${mysqld_version}" = "5.7" ] || [ "${mysqld_version%%%.*}" = "8.0" ]; then 23 mysqld --initialize-insecure --datadir=/var/lib/mysql --server-id=0 24 else 25 # mysql 5.5 requires running mysql_install_db in /usr/local/mysql 26 if command -v mysqld | grep usr.local; then 27 cd /usr/local/mysql 28 fi 29 mysql_install_db --force --datadir=/var/lib/mysql 30 fi 31 echo "Starting mysqld --skip-networking --socket=${SOCKET}" 32 mysqld --user=root --socket=$SOCKET --innodb_log_file_size=48M --skip-networking --datadir=/var/lib/mysql --server-id=0 --skip-log-bin & 33 pid="$!" 34 35 # Wait for the server to respond to mysqladmin ping, or fail if it never does, 36 # or if the process dies. 37 for i in {90..0}; do 38 if mysqladmin ping -uroot --socket=$SOCKET 2>/dev/null; then 39 break 40 fi 41 # Test to make sure we got it started in the first place. kill -s 0 just tests to see if process exists. 42 if ! kill -s 0 $pid 2>/dev/null; then 43 echo "MariaDB initialization startup failed" 44 exit 3 45 fi 46 sleep 1 47 done 48 if [ "$i" -eq 0 ]; then 49 echo 'MariaDB initialization startup process timed out.' 50 exit 4 51 fi 52 53 54 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot mysql 55 56 mysql -uroot <<EOF 57 CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE; 58 CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD'; 59 CREATE USER '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD'; 60 61 GRANT ALL ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'%'; 62 GRANT ALL ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'localhost'; 63 64 CREATE USER 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; 65 GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; 66 FLUSH PRIVILEGES; 67 FLUSH TABLES; 68 EOF 69 70 mysqladmin -uroot password root 71 72 if [ "${mysqld_version%%%.*}" = "8.0" ]; then 73 mysql -uroot -proot <<EOF 74 ALTER USER 'db'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD'; 75 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'; 76 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'; 77 EOF 78 fi 79 80 81 rm -rf ${OUTDIR}/* 82 83 backuptool=mariabackup 84 streamtool=xbstream 85 if command -v xtrabackup; then 86 backuptool="xtrabackup --datadir=/var/lib/mysql"; 87 streamtool=xbstream 88 fi 89 90 # Initialize with current mariadb_version 91 PATH=$PATH:/usr/sbin:/usr/local/bin:/usr/local/mysql/bin mysqld -V 2>/dev/null | awk '{print $3}' > /tmp/raw_mysql_version.txt 92 # mysqld -V gives us the version in the form of 5.7.28-log for mysql or 93 # 5.5.64-MariaDB-1~trusty for MariaDB. Detect database type and version and output 94 # mysql-8.0 or mariadb-10.5. 95 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) 96 echo ${server_db_version} >/var/lib/mysql/db_mariadb_version.txt 97 ${backuptool} --backup --stream=${streamtool} --user=root --password=root --socket=$SOCKET | gzip >${OUTDIR}/base_db.gz 98 rm -f /tmp/raw_mysql_version.txt 99 100 if ! kill -s TERM "$pid" || ! wait "$pid"; then 101 echo >&2 'Database initialization process failed.' 102 exit 5 103 fi 104 105 echo "The startup database files (in mariabackup/xtradb format) are now in $OUTDIR"