MariaDB 11.0 renamed its clients, so
mariadb-dump and mariadb are accepted in place of mysqldump and mysql.
The lookup takes the first executable in an absolute PATH folder, then checks standard tool folders such as /usr/local/bin and /opt/homebrew/bin. It also checks /usr/local/mysql/bin and Postgres.app’s latest version. Empty and relative PATH entries are skipped. That path decides which client version does the work.
On PostgreSQL that match is checked against the server first, for both directions. pg_dump and pg_restore refuse a server newer than themselves, 15 and later refuse servers older than 9.2, and TablePro names the database with -d, which arrived in 9.3. When the first match cannot reach the server, the newest one that can is taken from the Homebrew postgresql@… and libpq installs, every Postgres.app version, and /Library/PostgreSQL. When none can, the run stops before it starts and names the version to install: PostgreSQL 9.1 needs pg_dump 9.3 to 14, so brew install postgresql@14. A binary that does not answer --version is used anyway.
DuckDB is the exception: its dump is a statement the engine already in front of TablePro runs, over the connection that is already open.
File > Backup Dump… is dimmed on an engine that is not in the table, and on a libSQL connection pointed at a Turso URL rather than a local file, which sqlite3 cannot reach. For those, use a SQL export from Import & Export.
Restore is disabled on a read-only Safe Mode connection. Backup is not, because it writes nothing to the database.


The Backup Dump sheet with its scope tree, format and destination
Backup dump
1
Open the sheet
Choose File > Backup Dump… on a connected session, or right-click one or more databases in the connection tree and choose Back Up…. The tree’s selection arrives ticked.
2
Tick what goes in
The database being browsed starts ticked and whole. Tick more databases to write more files. Open a database’s disclosure triangle to reach its tables, all of them ticked, and untick the ones to leave out. Partitioned tables and MariaDB sequences are listed there beside the plain tables.
3
Pick the format and the folder
Only DuckDB offers a choice of format. Every file lands in the folder named under Save to, called
<database>-<yyyy-MM-dd-HHmmss> with the engine’s extension.4
Watch the byte counter
Cancel confirms, stops the run, and removes the partial file. Databases already written are kept. The result sheet lists every database with its file and size, and Show in Finder selects them.The bar shows a percentage on PostgreSQL and MySQL, which answer a database size query cheaply. The rest show an indeterminate bar with a running byte count.
What goes in
Ticking a whole database dumps everything in it: tables, views, routines, triggers and sequences, whatever the engine’s tool carries. Unticking even one table narrows the dump to the ticked ones, and every engine narrows differently.
The sheet repeats the relevant row under the tree as soon as a selection is narrowed. Leave every table ticked to get the whole database, which is what the sheet starts on.
Backing up several databases
Tick more than one database and the run writes one file per database into the chosen folder. Two databases whose names differ only by a character a file name cannot hold, such asa/b and a:b, get a numbered suffix rather than one overwriting the other.
Each database runs on its own. A failure stops that one and the run carries on, and the result sheet says which database failed and why alongside the ones that worked.
Restore dump
1
Pick the dump file
Choose File > Restore Dump… and select a file the matching backup tool wrote. The panel names the formats this connection’s engine accepts.
2
Pick the target database
Engines with more than one database ask which. SQLite and DuckDB reach exactly one, so they skip straight to the confirmation.
pg_restore runs with --no-owner --no-acl, so the connection user ends up owning the restored objects. mongorestore is scoped with --nsInclude to the database picked.3
Confirm
Read what the restore does to the objects already in the database, then click Restore. Each engine does something different: Objects already in the database.
4
Wait it out
Restore shows no percentage. Cancel confirms and stops the run, and the target database is left as it stands: drop it and restore into a fresh one, or clean up the partial objects yourself.
source and system for MySQL and MariaDB or .read and .shell for SQLite, are not run, and LOAD DATA LOCAL INFILE is refused.
Objects already in the database
Restore a SQLite dump into an empty database file. Every table TablePro creates has a quoted name, so one the file already holds gets the dump’s rows beside its own.
What a dump carries
mysqldump runs with --single-transaction --routines --triggers --events, so a MySQL dump is consistent with itself and carries stored routines, triggers and scheduled events. pg_dump -Fc carries the whole database. sqlite3 .dump writes the schema and every row as SQL.
DuckDB writes one of two things. A .duckdb file carries tables, views, indexes, foreign keys and sequences, and only DuckDB reads it, which is also true of pg_dump’s archive and MongoDB’s. A Parquet folder holds schema.sql, load.sql and one Parquet file per table, which pandas, Spark and BigQuery read directly. Pick the file to restore into TablePro later, the folder to hand the data to something else.
The folder restores too, except on TablePro 0.83.1 and 0.84.0-beta.2, where File > Restore Dump… takes only the .duckdb file. The folder is imported first into a separate DuckDB instance that can read nothing outside it, then copied into the database. A schema.sql or load.sql that reaches for another file, a database or an extension fails there, and the database is left as it was.
SSH tunnels and SSL
Both flows reuse the connection’s active SSH tunnel, with no second port forward. The whole of the connection’s SSL configuration reaches the tool, the CA certificate and the client certificate and key included: PostgreSQL takes them inPGSSLMODE, PGSSLROOTCERT, PGSSLCERT and PGSSLKEY, and MySQL and MariaDB in their client’s own flags. SQLite and DuckDB open a file, so neither applies.
MySQL’s clients and MariaDB’s no longer take the same flags. MySQL’s take --ssl-mode, with VERIFY_CA and VERIFY_IDENTITY included. MariaDB’s take --ssl, --skip-ssl and --ssl-verify-server-cert, and reject --ssl-mode. Which family a tool belongs to comes from its --version rather than its name: Homebrew’s mariadb formula installs MariaDB’s dump tool as mysqldump. A tool that answers no version is used for Disabled and Preferred, and refused for Required, Verify CA and Verify Identity.
MariaDB’s clients have no flag for encrypting without verifying, so Required reaches them as --ssl --ssl-verify-server-cert. That refuses a server offering no TLS. With no CA certificate set it checks the encryption rather than the server’s identity.
MariaDB’s clients send the password as typed whenever a server asks for it that way (mysql_clear_password, PAM through dialog, or a test plugin Homebrew ships), with or without TLS. On Disabled, TablePro runs them with a plugin folder that holds only the sign-in plugins that never do, so such a login fails instead. A build with those plugins compiled in ignores the folder, so TablePro asks the tool first, against a local stand-in server, and refuses one that answers. Preferred reads the server’s greeting first, which sends no credentials: a server offering TLS gets --ssl --skip-ssl-verify-server-cert, and one offering none gets --skip-ssl and the same folder. When the greeting cannot be read, the backup or restore stops rather than guess. --ssl against a server without TLS falls back to plaintext and sends the typed password to caching_sha2_password, so it is never used there. A local socket, the Cloud SQL Auth Proxy and an SSH tunnel to the server’s socket keep every plugin.
Unloading on the server
Oracle, Snowflake and BigQuery have no client-side dump. Unload to somewhere the server can write by running the engine’s own statement in a query tab. It runs with your privileges, so the server’s own error comes back when the destination is not writable.DP_DIR is a DIRECTORY object, not a path. The block starts a Data Pump job and returns before the file is written: watch DBA_DATAPUMP_JOBS for its progress. BigQuery needs the * in the URI, because it shards its output.
Passwords
Your password never reaches the tool’s argument list, which every process on the machine can read throughps. PostgreSQL gets PGPASSWORD and MySQL gets MYSQL_PWD, both in the environment. MongoDB’s tools read neither, so TablePro writes a 0600 config file and deletes it when the process exits. DuckDB is asked for nothing: it is already connected.
The tools run directly, with connection values passed as arguments. They inherit a limited environment plus the connection’s password and SSL settings. Shell startup files are not loaded. PostgreSQL password-file lookup follows Use ~/.pgpass.
Failures
A non-zero exit shows the last 64 KB of the tool’s stderr in a scrollable monospaced view, and DuckDB’s own error text in the same place. Most come down to one of these.
One non-zero exit is not a failure. A
pg_restore newer than the server sets parameters the server does not have, such as transaction_timeout on anything before PostgreSQL 17, and exits 1 after restoring everything. When those are its only errors, the restore reports complete and names the settings the server skipped. Any other error in the same run still fails it. So does a server whose lc_messages is not English, because its errors cannot be read.
