Sakai requires a relational database for storing system data, user information, and content metadata. This guide covers setup and configuration for supported databases.
Edit /etc/mysql/mariadb.conf.d/50-server.cnf (Ubuntu) or /etc/my.cnf (RHEL):
[mysqld]# Character set configurationcharacter-set-server=utf8mb4collation-server=utf8mb4_unicode_ci# Case-insensitive table names (required for Sakai)lower_case_table_names=1# Performance tuningmax_allowed_packet=64Minnodb_buffer_pool_size=1Ginnodb_log_file_size=256Minnodb_flush_log_at_trx_commit=2# Connection settingsmax_connections=200wait_timeout=600# Binary logging (for replication/backup)log_bin=mysql-binbinlog_format=ROWexpire_logs_days=7
Restart MariaDB:
sudo systemctl restart mariadb
4
Create Sakai Database
Connect to MariaDB:
mysql -u root -p
Create database and user:
-- Create databaseCREATE DATABASE sakai DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- Create user and grant privilegesCREATE USER 'sakai'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';GRANT ALL PRIVILEGES ON sakai.* TO 'sakai'@'localhost';-- For remote connections (adjust hostname as needed)CREATE USER 'sakai'@'%' IDENTIFIED BY 'STRONG_PASSWORD_HERE';GRANT ALL PRIVILEGES ON sakai.* TO 'sakai'@'%';FLUSH PRIVILEGES;
5
Verify Database Creation
Confirm the database exists:
SHOW DATABASES;USE sakai;SHOW TABLES;
Initially, the tables list will be empty. Sakai creates tables on first startup.
# MariaDB Configurationvendor@org.sakaiproject.db.api.SqlService=mysqldriverClassName@javax.sql.BaseDataSource=org.mariadb.jdbc.Driverhibernate.dialect=org.hibernate.dialect.MariaDBDialecturl@javax.sql.BaseDataSource=jdbc:mariadb://localhost:3306/sakai?useUnicode=true&characterEncoding=UTF-8validationQuery@javax.sql.BaseDataSource=defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTED# Database credentialsusername@javax.sql.BaseDataSource=sakaipassword@javax.sql.BaseDataSource=STRONG_PASSWORD_HERE# Auto-create schema on first startupauto.ddl=true
[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_unicode_cilower_case_table_names=1max_allowed_packet=64Minnodb_buffer_pool_size=1Gmax_connections=200# MySQL 8 specificdefault_authentication_plugin=mysql_native_password
Restart MySQL:
sudo systemctl restart mysql
4
Create Database
CREATE DATABASE sakai DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER 'sakai'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';GRANT ALL PRIVILEGES ON sakai.* TO 'sakai'@'localhost';FLUSH PRIVILEGES;
# MySQL 8 Configurationvendor@org.sakaiproject.db.api.SqlService=mysqldriverClassName@javax.sql.BaseDataSource=com.mysql.jdbc.Driverhibernate.dialect=org.hibernate.dialect.MySQL8Dialecturl@javax.sql.BaseDataSource=jdbc:mysql://localhost:3306/sakai?useUnicode=true&characterEncoding=UTF-8validationQuery@javax.sql.BaseDataSource=defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTEDusername@javax.sql.BaseDataSource=sakaipassword@javax.sql.BaseDataSource=STRONG_PASSWORD_HEREauto.ddl=true
CREATE TABLESPACE sakai_data DATAFILE '/u01/app/oracle/oradata/sakai_data01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;CREATE TEMPORARY TABLESPACE sakai_temp TEMPFILE '/u01/app/oracle/oradata/sakai_temp01.dbf' SIZE 512M AUTOEXTEND ON;
2
Create User
CREATE USER sakai IDENTIFIED BY STRONG_PASSWORD_HERE DEFAULT TABLESPACE sakai_data TEMPORARY TABLESPACE sakai_temp QUOTA UNLIMITED ON sakai_data;GRANT CONNECT, RESOURCE TO sakai;GRANT CREATE SESSION TO sakai;GRANT CREATE TABLE TO sakai;GRANT CREATE SEQUENCE TO sakai;GRANT CREATE VIEW TO sakai;GRANT CREATE TRIGGER TO sakai;
# Increase buffer pool (set to 70-80% of available RAM)innodb_buffer_pool_size=4G# Optimize log filesinnodb_log_file_size=512Minnodb_log_buffer_size=16M# Flush optimizationinnodb_flush_log_at_trx_commit=2innodb_flush_method=O_DIRECT# Query cache (MySQL 5.7 and earlier)query_cache_type=1query_cache_size=64M# Connection poolingmax_connections=500thread_cache_size=50# Table cachetable_open_cache=4000table_definition_cache=2000
-- Enable slow query logSET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = 2;-- Review slow queriesSELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;
-- Connection statisticsSHOW STATUS LIKE 'Threads_connected';SHOW STATUS LIKE 'Max_used_connections';-- InnoDB buffer pool usageSHOW STATUS LIKE 'Innodb_buffer_pool%';-- Table sizesSELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"FROM information_schema.TABLESWHERE table_schema = 'sakai'ORDER BY (data_length + index_length) DESCLIMIT 20;-- Event table size checkSELECT COUNT(*) FROM SAKAI_EVENT;