Migrating Minecraft Plugins from Local Storage (SQLite/Flatfile) to MySQL/MariaDB

A technical guide explaining how to migrate Minecraft server plugins from laggy local flatfiles and SQLite databases to multi-threaded MySQL/MariaDB solutions.

20.05.2026 English

Migrating Plugins from Local Storage (SQLite/Flatfile) to MySQL/MariaDB

When you first launch a Minecraft server, the default settings for most plugins seem perfect. They work "out of the box," storing data in local configuration files (.yml, .json) or local databases (.db via the SQLite engine). However, as the project grows—especially when the online player count surpasses 20–30 players—the server starts suffering from periodic micro-stutters (ticks lasting too long), and the hosting console begins spamming input/output delay warnings.

In this article, we will examine why local storage formats inevitably start lagging as your player count rises, how to deploy a centralized database on your hosting, and how to correctly migrate key plugins: LuckPerms, EssentialsX, and CoreProtect.

Why Flatfile (.yml) and SQLite (.db) Lag Under High Load

The issue stems from the fundamental architecture of how the operating system and the Minecraft server interact with the hosting storage drive:

  • The Flatfile Problem (.yml / .json): Every time a plugin needs to grant a permission, save a balance, or alter a wallet value, it is forced to overwrite the entire text file. If 20 players perform transactions simultaneously, the server repeatedly reads and writes heavy configuration files. Because this often happens synchronously on the game's main thread, the server literally freezes, waiting for the disk input/output (I/O) operation to complete.
  • The SQLite Problem (.db): SQLite is an excellent database engine, but it operates as a single file on the disk. Its primary drawback is file-level locking during write operations. If CoreProtect attempts to log a creeper explosion, no other plugin (or even the same plugin in another thread) can write to that database until the first operation finishes. This forms a processing queue, resulting in noticeable micro-stutters for your players.

The Solution — MySQL / MariaDB: These are fully-fledged network database management systems. They run in multi-threaded mode, support row-level locking (instead of locking the entire file), cache queries efficiently in RAM, and process data asynchronously, completely relieving the game server's main CPU thread.

Step 1: Creating a Database in the Hosting Panel

Before configuring your plugins, you must obtain your MySQL access credentials. On a modern game hosting panel, this can be done in just a few clicks:

  1. Navigate to your server control panel and open the Databases section.
  2. Click the Create Database button.
  3. Once created, the panel will display your credentials. We will need five specific parameters:
    • Host (The IP address or domain for connection, such as 127.0.0.1 or sql.mygamehost.net)
    • Port (The default for MySQL is 3306)
    • Database Name (The name of the database)
    • User (The database username)
    • Password (The connection password)

Step 2: Configuring Plugins to Use MySQL

Let's look at setting up the three primary plugins that place the heaviest burden on the storage drive subsystem.

1. LuckPerms (Permissions and Ranks)

LuckPerms is perfectly optimized for database networking. Switching it to MySQL not only eliminates disk-related lag but also allows you to sync ranks across multiple sub-servers (like Survival and Hub) seamlessly.

  1. Open the plugins/LuckPerms/config.yml file.
  2. Locate the storage-method: line and change its value from h2 or sqlite to mysql.
  3. Scroll down to the data: block and input the credentials provided by your host:
storage-method: mysql

data:
  address: localhost:3306 # Enter your Host and Port separated by a colon
  database: lperms_db
  username: admin_user
  password: 'super_secure_password'
  table-prefix: 'lp_'
  1. Save the file and run the /lp sync command in the console. The plugin will automatically generate the required tables in your database.

2. EssentialsX (Economy, Homes, Warps, Player Data)

By default, EssentialsX creates an individual .yml file for every single unique player in its userdata folder. When thousands of players register, this folder becomes a performance nightmare for the Linux file system.

  1. For EssentialsX to communicate with a database, you need an official addon module called EssentialsXStorage. Download it from the developers' website and place it into your plugins/ folder.
  2. Open the main plugins/Essentials/config.yml file and locate the storage section (typically found at the very bottom of the file).
  3. Switch the storage type to MySQL and fill in the connection credentials:
essentials:
  storage:
    type: mysql
    mysql:
      host: localhost
      port: 3306
      database: essentials_db
      username: admin_user
      password: 'super_secure_password'

3. CoreProtect (Block Logging)

CoreProtect is by far the heaviest plugin on average servers since it records millions of block changes, container transactions, and chat events. Moving it to MySQL is vital for a stable 20.0 TPS.

  1. Open the plugins/CoreProtect/config.yml file.
  2. Locate the use-mysql: false parameter and change it to use-mysql: true.
  3. Fill out the connection strings below it:
use-mysql: true
mysql-host: localhost
mysql-port: 3306
mysql-database: coreprotect_db
mysql-username: admin_user
mysql-password: "super_secure_password"
table-prefix: "co_"
  1. Restart the server. Upon its initial startup, CoreProtect will index the database structure, which may take 1–2 minutes.

Troubleshooting Common Issues

Issue 1: The server throws a "Communications link failure" error on startup

Cause: The game server is unable to reach the database server. You either made a typo in the host/password configurations, or the database server on the hosting infrastructure hasn't booted up yet.

Solution: Double-check for any accidental spaces or quotation marks in the host and password lines. If your database is hosted on an external machine, ensure that your provider allows remote connections for that specific database profile.

Issue 2: All ranks, donations, and warps disappeared after turning on MySQL

Cause: This is expected behavior. The plugins successfully connected to a fresh, completely empty database, while all your legacy data remains trapped inside your local .db and .yml files.

Solution for LuckPerms: The plugin includes a built-in migration tool. Before changing your configuration to MySQL, run this command: /lp export local_data. Then, switch the config to MySQL, restart the server, and run: /lp import local_data. The data will automatically transfer from the local file into your database instance.

Solution for other plugins: Transferring live data from SQLite (local .db files) to MySQL often requires specialized external converter scripts. If your server already has an active player base, it is highly recommended to perform the MySQL migration during a planned map wipe (server reset) to start with a clean, optimal history trail.

Related articles

Optimization of Heavy Modded Servers (Forge / NeoForge / Fabric)

A comprehensive technical guide on optimizing heavy modded Minecraft servers. Covers essential mod-performance stack, profiling with Spark, and mitigating industrial automation lag.

Read more

World Pregeneration with Chunky: Fix Elytra and Flight Lag Forever

A complete guide on pregenerating Minecraft server worlds using the Chunky plugin. Learn how to prevent TPS drops caused by fast-flying players exploring chunks on the fly.

Read more

High-Performance Minecraft Servers: Migration and Optimization Guide

A technical guide on migrating Minecraft servers to modern cores (Paper, Purpur, Folia), fine-tuning configurations to eliminate lag, and setting up multi-layered security defenses.

Read more