Troubleshooting MariaDB Startup Failures on Arch Linux: Permission Issues and Missing System Tables


1 views

The error logs reveal two distinct phases of failure:

Phase 1: File permission issues
2016-11-02 16:55:12 140082509282496 [Warning] Can't create test file /var/lib/mysql/pranav-laptop.lower-test

Phase 2: Missing system tables
2016-11-02 21:03:24 140412958252224 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist

First, let's address the filesystem permissions. MariaDB requires proper ownership of its data directory:

sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod 700 /var/lib/mysql
sudo restorecon -R /var/lib/mysql  # For SELinux systems

The correct modern method for initializing MariaDB system tables is:

sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
sudo systemctl start mariadb

If you encounter the my_print_defaults error, specify the correct paths:

sudo mariadb-install-db --user=mysql \
--basedir=/usr \
--datadir=/var/lib/mysql \
--auth-root-authentication-method=normal

After installation, verify your my.cnf contains these critical sections:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

For cases where tables are corrupted, try the recovery mode:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql_upgrade -u root
sudo systemctl restart mariadb

After successful startup, verify the installation:

mysql -u root -e "SELECT version(); SHOW DATABASES;"
sudo systemctl enable --now mariadb

# Check service status with verbose output
sudo systemctl status mariadb.service -l
# View detailed logs
sudo journalctl -u mariadb.service --no-pager -n 50

The initial error shows permission problems with creating test files:

2016-11-02 16:55:12 140082509282496 [Warning] Can't create test file /var/lib/mysql/pranav-laptop.lower-test

Follow these steps to fix permissions:

# Stop any running MySQL processes
sudo killall -9 mysqld mysqld_safe

# Change ownership of MySQL directories
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql

# Fix apparmor/selinux if needed
sudo setenforce 0
sudo aa-complain /usr/sbin/mysqld

The subsequent error indicates missing MySQL system tables:

2016-11-02 21:03:24 140412958252224 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist

Here's how to properly initialize them:

# Backup existing data first
sudo cp -a /var/lib/mysql /var/lib/mysql.bak

# Initialize system tables with correct path
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

# Alternative for older versions
sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

Check your my.cnf configuration:

# Verify config file locations
sudo mysql --verbose --help | grep -A1 "Default options"

# Sample minimal working configuration
[mysqld]
datadir=/var/lib/mysql
socket=/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
pid-file=/run/mysqld/mysqld.pid

[client]
socket=/run/mysqld/mysqld.sock

After fixing all issues, follow this sequence:

# Clean up any existing pid files
sudo rm -f /var/lib/mysql/*.pid /run/mysqld/mysqld.pid

# Start MariaDB in safe mode for testing
sudo mysqld_safe --skip-grant-tables &

# Once verified, start normally
sudo systemctl start mariadb
sudo systemctl enable mariadb

# Secure installation
sudo mysql_secure_installation

For persistent problems, try these diagnostic commands:

# Check for missing dependencies
ldd /usr/sbin/mysqld

# Run in debug mode
sudo mysqld --debug --console

# Verify database consistency
sudo mysqlcheck --all-databases --check-upgrade --auto-repair