Migrating production infrastructure? Get up to ₹10,000 in migration credits. Apply now
voroaDocs
Compute

Voroa MySQL: a managed MySQL 8 database

Create a managed MySQL 8.4 database on Voroa: plans from 1 GB of RAM, TLS-only external access, database users, phpMyAdmin imports and WordPress setup.

Voroa MySQL: your service on Voroa connects over the private network, WordPress and outside clients connect with TLS required, to a MySQL 8.4 database with 1 to 8 GB of RAM, trusted sources, extra users, backups and point-in-time recovery

What this covers

Voroa MySQL is a managed MySQL 8.4 database. It suits the apps that expect MySQL rather than Postgres: WordPress, Laravel and most PHP frameworks, and anything built on the mysql2 or pymysql drivers. Voroa runs the server, applies the settings below and keeps it inside its memory and disk limits; you connect to it with a normal MySQL connection URL.

This page covers plans, connecting from your services and from outside, database users, moving an existing database in (including a WordPress site), and what is not offered yet.

Plans

Every MySQL database is its own server with its own memory, CPU and disk. Plans start at 1 GB of RAM and go up to 8 GB, with more CPU and connections on the larger ones. Current prices are on the pricing page.

There is no free MySQL plan. MySQL needs about 1 GB of RAM to run reliably: in our own tests it did not start at 256 MB, and at 512 MB it stopped under 20 connections. If you need a free database to build against, Voroa Postgres has a free plan.

If you need more than the largest plan, contact us for a custom plan.

Create a database

  1. In the dashboard, choose New and then Database.
  2. Pick MySQL, give it a name, and choose an instance type (plan). The version is MySQL 8.4.
  3. Complete the payment. The database is created on a database server once the payment is confirmed; its connection details appear on the Connect tab when it is ready.

The database you name is created for you, and the connection URL points at it.

The New MySQL database page: project and environment, database name, the optional MySQL database name, the root user and the instance types

Connect to the database

Open the database and go to Connect. There is one connection URL, and it works from everywhere: from a service you run on Voroa, from your laptop, from a CI job, or from a server somewhere else. Put it in your app’s environment as DATABASE_URL. If you created the database from a service’s Databases from your repo suggestion, Voroa adds that variable for you.

The Connect tab of a MySQL database: one connection URL ending in ssl-mode=REQUIRED, with a Copy URL template button

Every connection must use TLS: the server refuses one that does not encrypt, and the URL already carries ssl-mode=REQUIRED. From a terminal:

mysql --protocol=tcp "mysql://USER:PASSWORD@HOST:PORT/DATABASE?ssl-mode=REQUIRED"

The Connect tab has ready-made snippets for Node.js (mysql2), Prisma, Python (pymysql) and Go. Each one keeps certificate checks on.

To limit where connections can come from, add Trusted sources on the same tab: one IPv4 address or range per line, up to 20, for example 203.0.113.10/32. Leave it empty to allow every address (each connection still needs TLS and the password). IPv6 ranges are not supported for MySQL yet.

Trusted sources on the Connect tab: the external host and port, and a box for one IPv4 address or CIDR range per line

Database users

The connection URL uses the database’s main user. You can add more users, for example a separate user for an app and another for a reporting tool, each with its own password, through the Voroa API or the Voroa MCP server (create_database_user, list_database_users). A new user’s password is shown once when the user is created; after that it can be replaced but not read back.

Move an existing database to Voroa

Create the Voroa database first and import into it while it is still empty. There are two ways in.

Import from a connection URL. On the database’s Import tab, paste the connection URL of the database you are moving. Voroa checks that it can reach it, then copies the schemas, tables and data across. The source must accept connections from the internet. Many shared hosts block that; if yours does, use the second way.

The Import tab: paste the existing MySQL database's connection string, then Check and Continue

How a database import works: paste the connection URL, Voroa checks size, version and access, copies the data on its side, the import completes, then you switch your app's DATABASE_URL

Export a file and load it. Export the database as an SQL file, for example from phpMyAdmin (Export, Quick, format SQL), then load it with the MySQL client:

mysql --protocol=tcp -h HOST -P PORT -u USER -p --ssl-mode=REQUIRED DATABASE < export.sql

Files exported from MariaDB

Many shared hosts run MariaDB rather than MySQL. Two things in a MariaDB export can stop the load part way through:

  • MariaDB-only collations such as utf8mb4_uca1400_ai_ci. MySQL does not have them. Replace them with utf8mb4_unicode_ci (or utf8mb3_general_ci for utf8mb3_ tables) before loading.
  • Binary column defaults written as DEFAULT x AS .... Some phpMyAdmin versions export a binary(16) default in a form that neither MariaDB nor MySQL accepts back. The correct form is DEFAULT 0x0000.... Security plugins that log IP addresses often have such columns.

On Linux or macOS, this fixes both while loading:

sed -E 's/DEFAULT x AS `([0-9A-Fa-f]+)`/DEFAULT 0x\1/; s/(utf8mb[34])_uca1400_[a-z_]+/\1_unicode_ci/g' export.sql \
  | mysql --protocol=tcp -h HOST -P PORT -u USER -p --ssl-mode=REQUIRED DATABASE

Leave room on the disk

A large import needs disk for the data and, while it runs, for MySQL’s change log as well. As a measured example, a 1.8 GB WordPress export became 2.8 GB of tables and indexes plus 1.7 GB of change log. Check the plan’s included disk before importing a large site, and add storage first if it will not fit.

WordPress

After the data is in, point WordPress at Voroa in wp-config.php:

php
define('DB_NAME', 'DATABASE');
define('DB_USER', 'USER');
define('DB_PASSWORD', 'PASSWORD');
define('DB_HOST', 'HOST:PORT');
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

The last line turns on TLS. Without it WordPress connects unencrypted, Voroa refuses the connection, and WordPress shows “Error establishing a database connection”.

Backups and recovery

Backups and point-in-time recovery are switched on from the database’s Backups tab and work the same way as for Postgres. See Recovery & backups.

Not offered yet

  • Connection pooling. MySQL databases do not have a connection pooler yet. Size your app’s connection pool to the plan’s connection limit.
  • Replacing the data in a database that already has tables during an import. Import into an empty database.
  • IPv6 trusted sources.
Last updated October 29, 2026