# MySQL Server Start Failed: Troubleshooting Startup Errors
You attempt to start MySQL and it fails immediately:
systemctl start mysqld
# Job for mysqld.service failed because the control process exited with error code.
# See "systemctl status mysqld" and "journalctl -xe" for details.Or when running manually:
mysqld --user=mysql
# mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)The server won't start, and you need to diagnose the root cause quickly.
Step 1: Check the Error Log
The MySQL error log is your primary diagnostic tool:
```bash # Find the error log location mysqld --help --verbose 2>/dev/null | grep -A 1 "Default options"
# Common locations cat /var/log/mysql/error.log cat /var/lib/mysql/$(hostname).err cat /usr/local/mysql/data/$(hostname).err ```
Look for specific error patterns:
[ERROR] Can't start server: Bind on TCP/IP port: Address already in use
[ERROR] Do you already have another mysqld server running on port: 3306?
[ERROR] AbortingStep 2: Check for Port Conflicts
Another MySQL instance or process might be using port 3306:
```bash # Check what's using port 3306 netstat -tlnp | grep 3306 ss -tlnp | grep 3306 lsof -i :3306
# Kill any existing MySQL processes pkill -9 mysqld pkill -9 mysql ```
If another service is using the port, either stop that service or change MySQL's port:
# /etc/my.cnf or /etc/mysql/my.cnf
[mysqld]
port = 3307Step 3: Check Data Directory Permissions
Permission issues are a common cause of startup failures:
```bash # Check MySQL data directory ownership ls -la /var/lib/mysql/
# The directory should be owned by mysql user chown -R mysql:mysql /var/lib/mysql/ chmod 750 /var/lib/mysql/ ```
Check the MySQL user's home directory and tmp directory:
```bash # Check mysql user exists id mysql
# Create user if missing useradd -r -s /sbin/nologin mysql
# Check tmp directory permissions ls -la /tmp/ chmod 1777 /tmp/ ```
Step 4: Check Configuration File Syntax
Syntax errors in my.cnf can prevent startup:
```bash # Validate configuration syntax mysqld --validate-config
# Or use my_print_defaults my_print_defaults mysqld ```
Common configuration errors:
```ini # Wrong: Missing quotes for paths with spaces datadir = /var/lib/mysql data
# Correct: datadir = /var/lib/mysql-data
# Wrong: Invalid option name inno_db_buffer_pool_size = 1G
# Correct: innodb_buffer_pool_size = 1G ```
Check for conflicting options:
```bash # Check all config files that are loaded mysqld --print-defaults
# Common config locations cat /etc/my.cnf cat /etc/mysql/my.cnf cat /etc/mysql/conf.d/*.cnf cat ~/.my.cnf ```
Step 5: Check InnoDB Corruption
InnoDB corruption can prevent startup:
[ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace database/table uses space ID: 54 at filepath: ./database/table.ibd
[ERROR] InnoDB: Cannot open tablespace database/table which uses space ID 54Start MySQL in recovery mode:
# Add to my.cnf under [mysqld]
[mysqld]
innodb_force_recovery = 1Recovery levels: - Level 1-2: Minimal, allows SELECT and some operations - Level 3: More aggressive, may lose data - Level 4-6: Severe recovery, may have significant data loss
```bash # Start with recovery mode systemctl start mysqld
# If successful, dump data immediately mysqldump --all-databases --routines --triggers --events > backup.sql
# Stop and remove corrupted data systemctl stop mysqld rm -rf /var/lib/mysql/ibdata1 rm -rf /var/lib/mysql/ib_logfile*
# Reinitialize (WARNING: destroys all data) mysqld --initialize --user=mysql
# Restore from backup mysql < backup.sql ```
Step 6: Check Disk Space
Full disks prevent MySQL from writing logs and temp files:
```bash # Check disk usage df -h
# Check inodes (for small files issue) df -i
# Check MySQL data directory size du -sh /var/lib/mysql/
# Clean up old logs if needed rm -f /var/lib/mysql/mysql-bin.*.index # Then purge old binary logs from MySQL ```
Step 7: Check SELinux or AppArmor
Security modules can block MySQL access:
```bash # Check SELinux status getenforce
# Temporarily disable for testing setenforce 0
# Check SELinux context ls -Z /var/lib/mysql/
# Reset MySQL context restorecon -Rv /var/lib/mysql/
# For AppArmor (Ubuntu/Debian) aa-status apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld ```
Step 8: Check Missing Required Directories
MySQL needs certain directories to exist:
```bash # Check and create required directories mkdir -p /var/run/mysqld chown mysql:mysql /var/run/mysqld chmod 755 /var/run/mysqld
mkdir -p /var/log/mysql chown mysql:mysql /var/log/mysql chmod 750 /var/log/mysql
# Check tmpdir exists mkdir -p /tmp chmod 1777 /tmp ```
Step 9: Check Binary Log Issues
Corrupted binary logs can prevent startup:
```bash # Check for binary log errors in error log grep "binary log" /var/log/mysql/error.log
# Temporarily disable binary logging for recovery # Add to my.cnf [mysqld] skip-log-bin
# Or rename corrupted log files cd /var/lib/mysql mv mysql-bin.000001 mysql-bin.000001.corrupted ```
Step 10: Check for Table Corruption
MyISAM table corruption:
```bash # Check and repair MyISAM tables myisamchk -r /var/lib/mysql/database/*.MYI
# For severe corruption myisamchk -o /var/lib/mysql/database/*.MYI ```
For InnoDB, use recovery mode as described earlier.
Verification
After fixing the issue:
```bash # Start MySQL systemctl start mysqld
# Check status systemctl status mysqld
# Verify MySQL is listening netstat -tlnp | grep 3306
# Connect and verify mysql -u root -p -e "SELECT 1;"
# Check error log for clean startup tail -f /var/log/mysql/error.log ```
Look for these good signs in the error log:
[Note] mysqld: ready for connections.
Version: '8.0.33' socket: '/var/lib/mysql/mysql.sock' port: 3306Common Startup Error Quick Reference
| Error Message | Cause | Solution |
|---|---|---|
| Permission denied | Wrong ownership | chown -R mysql:mysql /var/lib/mysql |
| Address already in use | Port conflict | Kill existing process or change port |
| Can't find file | Missing datadir | Run mysqld --initialize |
| Unknown variable | Bad config | Check my.cnf syntax |
| Disk full | No space | Free disk space |
| Table 'mysql.user' doesn't exist | Uninitialized | Initialize MySQL |
| InnoDB: Cannot open tablespace | Corruption | Use innodb_force_recovery |
Prevention Best Practices
- 1.Always backup before making configuration changes
- 2.Test config changes:
mysqld --validate-config - 3.Monitor disk space and set alerts
- 4.Keep error log accessible and check regularly
- 5.Use LVM or ZFS snapshots for quick recovery
```bash # Test startup without actually starting mysqld --user=mysql --verbose --help | head -20
# Always check logs after config changes systemctl restart mysqld && journalctl -u mysqld -n 50 ```