Database Administration

Fixing a MySQL 8.0 Startup Failure on Windows Caused by a Missing `uploads` Directory

📅 May 12, 2026 ✎ GetModNest Editor Tested on: Windows 10, MySQL 8.0 Level: Intermediate

Overview

This article documents a troubleshooting process for a MySQL 8.0 startup failure on Windows.

When mysqld.exe was started manually with the configured my.ini file, MySQL failed during initialization and reported that it could not read the directory specified for file upload restrictions.

The issue was traced to a missing uploads directory referenced by the secure-file-priv setting in my.ini. After creating the directory, verifying the configuration file, and reinstalling the Windows service with the correct configuration path, MySQL could be started normally again.

Environment

  • OS: Windows
  • Database: MySQL 8.0
  • MySQL binary path:
    D:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe
  • MySQL configuration file:
    D:\ProgramData\MySQL\MySQL Server 8.0\my.ini
  • MySQL data directory:
    D:\ProgramData\MySQL\MySQL Server 8.0\Data
  • Directory involved in the startup failure:
    D:\ProgramData\MySQL\MySQL Server 8.0\uploads
  • Windows service name:
    mysql80

Problem

When trying to start MySQL manually, the following command was used:

mysqld.exe --defaults-file="D:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console

MySQL failed to start and reported an error similar to:

Can't read dir of 'C:\ProgramData\MySQL\MySQL Server 8.0\uploads\' (OS errno 2 - No such file or directory)

This indicated that MySQL was trying to access a directory defined in its configuration, but that directory did not exist on disk.

Root Cause

The startup failure was caused by the secure-file-priv setting in my.ini.

This option restricts file import and export operations to a specific directory. If the configured directory does not exist, MySQL may fail to start correctly.

In this case, the configured path pointed to an uploads directory under:

D:\ProgramData\MySQL\MySQL Server 8.0\uploads

but that directory had not been created yet.

Step 1: Create the Missing uploads Directory

The first fix was to manually create the missing directory in PowerShell.

Example command:

New-Item -ItemType Directory -Path "D:\ProgramData\MySQL\MySQL Server 8.0\uploads" -Force

Then confirm that the directory exists:

Get-ChildItem "D:\ProgramData\MySQL\MySQL Server 8.0\"

If the uploads folder appears in the listing, the first part of the issue has been fixed.

Step 2: Verify the my.ini Configuration File

Open the MySQL configuration file and check the path settings:

notepad "D:\ProgramData\MySQL\MySQL Server 8.0\my.ini"

The important section should be reviewed carefully.

A representative example looks like this:

[mysqld]
basedir="D:/Program Files/MySQL/MySQL Server 8.0"
datadir="D:/ProgramData/MySQL/MySQL Server 8.0/Data"
secure-file-priv="D:/ProgramData/MySQL/MySQL Server 8.0/uploads"

Make sure that:

  • basedir points to the actual MySQL installation directory
  • datadir points to the real data directory
  • secure-file-priv points to a directory that really exists
  • path separators and quotation marks are correct

Step 3: Test MySQL Startup Manually

After creating the directory and checking my.ini, start MySQL manually again:

mysqld.exe --defaults-file="D:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console

If no error appears, it means the configuration problem has likely been resolved.

If MySQL starts in the foreground successfully, stop the temporary process with:

Ctrl + C

This is only needed if you started mysqld.exe manually for verification.

Step 4: Reinstall the Windows Service with the Correct Configuration

If the Windows service configuration may have been pointing to an incorrect or outdated setup, reinstalling the service can help ensure that it uses the correct my.ini file.

Stop and remove the existing service:

Stop-Service mysql80 -Force
mysqld --remove mysql80

Step 5: Reinstall the Service

Install the service again and explicitly specify the correct configuration file:

mysqld --install mysql80 --defaults-file="D:\ProgramData\MySQL\MySQL Server 8.0\my.ini"

This ensures that the service starts with the intended MySQL configuration.

Step 6: Start the Service Again

Start the reinstalled service:

Start-Service mysql80

Then verify its status:

Get-Service mysql80

If the service shows a running state, the startup issue has been resolved.

Step 7: Test MySQL Login

After the service is back online, test the MySQL client:

mysql -u root -p

If the login prompt appears and authentication succeeds, both the service and configuration are working normally again.

Why secure-file-priv Matters

The secure-file-priv option controls which directory MySQL can use for file-based operations such as:

  • LOAD DATA INFILE
  • SELECT ... INTO OUTFILE
  • other controlled import / export tasks

If this path points to a directory that does not exist, MySQL may reject the configuration or fail during startup checks.

That is why even a simple missing folder can prevent the service from starting.

Troubleshooting Checklist

  • Does the uploads directory actually exist?
  • Does secure-file-priv point to the correct path?
  • Are basedir and datadir configured correctly?
  • Is the service using the correct my.ini file?
  • Was the service installed with an outdated configuration path?
  • Can mysqld.exe --console start successfully when run manually?
  • Are there any path typos, quotation problems, or slash direction issues in my.ini?

Summary

The effective recovery path in this case was:

  1. identify the startup error related to the missing uploads directory
  2. create the directory manually
  3. verify the secure-file-priv path in my.ini
  4. test startup with mysqld.exe --console
  5. stop and remove the old mysql80 service if necessary
  6. reinstall the service with the correct --defaults-file
  7. start the service again and test login

The key lesson is that MySQL startup failures on Windows are not always caused by datadir problems or corrupted data files. In some cases, a missing directory referenced by secure-file-priv is enough to block service startup completely.

Need Help with a Similar Problem or Project?

This note is based on a real troubleshooting, configuration, or development workflow. If you need help with databases, Linux servers, web applications, desktop software, iOS and Android apps, automation scripts, deployment, or AI development environments, GetModNest can provide practical technical support, troubleshooting, and development assistance.

Email: info@getmodnest.com