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"