---
summary: What a shared MariaDB Galera cluster does not support, and what to do instead.
title: Limitations
path: concepts/limitations
status: published
---

# Limitations

Scuttle `std` is a shared, synchronously replicated cluster. A few MariaDB features do not work under replication or would break isolation between tenants. Check this list before migrating an application.

## InnoDB only

Only InnoDB tables replicate. `CREATE TABLE ... ENGINE=MyISAM`, `Aria` or `MEMORY` is rejected with an error instead of silently creating a table that exists on one node only. Temporary tables are unaffected. Convert existing tables with `ALTER TABLE t ENGINE=InnoDB` before importing a dump.

## Tables should have a primary key

Give every table a primary key. `DELETE` on a table without one does not replicate correctly, and such tables slow replication down for everyone.

## Commit-time deadlocks

Two transactions that change the same rows can both run to completion and one of them then fails **at commit** with a deadlock error (`1213`). This is how optimistic replication resolves a conflict, not a bug. Retry the transaction — see [Retrying transactions](/docs/scuttle/using/retries).

## Locks and large transactions

`LOCK TABLES` and `GET_LOCK()` have no effect across nodes, and XA transactions are not supported. A single transaction may not produce more than 2 GB of changes; load large imports in batches.

## No server-level features

There is no `SUPER`, `FILE`, `PROCESS`, no plugins, no global variables and no user-defined functions written in C. The event scheduler is not available; schedule recurring work from your application or a job runner. `SHOW DATABASES`, `information_schema` and `SHOW PROCESSLIST` show only your own objects and sessions.

## New connections are rate-limited per source address

Each source IP address may open **at most 300 new connections in any 10 seconds** to a cluster
endpoint. This is a guard against password guessing. Connections that are already open aren't
affected, and neither is the number of connections you keep open.

Past the limit, new connections are closed as soon as they're opened. Your client reports
`2013 Lost connection … at 'reading initial communication packet'`. It doesn't report an access
error, because the refusal happens before the server has said anything.

Refused attempts count too, so a client retrying in a tight loop keeps itself blocked. See
[Lost connection while connecting](/docs/scuttle/troubleshooting/lost-connection-at-handshake).

## Connections can be reset

A failover or maintenance resets open connections. Use a connection pool that reconnects, and keep transactions short.

## Restores go to a new name

A point-in-time restore creates a new database next to the original; it never overwrites in place. Views and routines that mention the old database name explicitly are yours to adjust.
