[Moodle Migration][Phase 2] MariaDB 11.4 LTS
Goal: A local-only database with full Unicode and a least-privilege app user; secure defaults and a clean backup/restore story.
Steps
- Install MariaDB 11.4 LTS
- Local-only listen + Unicode defaults
- Baseline hardening
- Create the Moodle DB + app user
- Install MariaDB 11.4 LTS
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=11.4
sudo apt update
sudo apt -y install mariadb-server
sudo systemctl enable --now mariadb
mariadb --version # expect 11.4.x
- Local-only listen + Unicode defaults
sudo tee /etc/mysql/mariadb.conf.d/60-moodle.cnf >/dev/null <<'EOF'
[mysqld]
bind-address = 127.0.0.1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_file_per_table = 1
EOF
sudo systemctl restart mariadb
Why: DB not exposed to the internet; guarantee utf8mb4 for content; cleaner storage per table.
- Baseline hardening
sudo mariadb-secure-installation
Recommended: remove anonymous users, disallow remote root, drop test DB, reload privileges. (Optional but recommended) root via unix_socket:
sudo mariadb -e "ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket; FLUSH PRIVILEGES;"
Why: tie SQL root to Linux sudo; no separate SQL root password to manage.
- Create the Moodle DB + app user
sudo mariadb <<'SQL'
CREATE DATABASE moodle
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG';
GRANT ALL PRIVILEGES ON moodle.* TO 'moodleuser'@'localhost';
FLUSH PRIVILEGES;
SQL
Why: principle of least privilege; user scoped to localhost and the single schema.
Acceptance checks
mariadb --version # 11.4.x
ss -ltnp | grep 3306 # 127.0.0.1:3306 only
sudo mariadb -e "SHOW VARIABLES LIKE 'character_set_server'; \
SHOW VARIABLES LIKE 'collation_server';"
sudo mariadb -e "SELECT user,host,plugin FROM mysql.user WHERE user='root';"
sudo mariadb -e "SELECT user,host FROM mysql.user WHERE user='moodleuser'; \
SHOW GRANTS FOR 'moodleuser'@'localhost';"
Expect: utf8mb4/unicode_ci; root via unix_socket (if you flipped it); moodleuser scoped to moodle.*.