Skip to main content

Back up MySQL to Filebase

Mirror the Postgres recipe using mysqldump.

One-off backup

mysqldump --single-transaction --quick --routines --triggers \
-u backup_user -p mydb \
| gzip -9 \
| aws --endpoint https://s3.filebase.io s3 cp - \
s3://my-db-backups/mysql/mydb-$(date +%Y%m%d-%H%M%S).sql.gz

--single-transaction keeps the dump consistent without long table locks (InnoDB tables only).

Restore

aws --endpoint https://s3.filebase.io s3 cp \
s3://my-db-backups/mysql/mydb-20260501-120000.sql.gz - \
| gunzip \
| mysql -u admin -p mydb

Daily cron job

/usr/local/bin/mysql-backup.sh
#!/bin/bash
set -euo pipefail

BUCKET="my-db-backups"
DB="mydb"
DATE=$(date +%Y%m%d-%H%M%S)

export AWS_ACCESS_KEY_ID="$FILEBASE_KEY"
export AWS_SECRET_ACCESS_KEY="$FILEBASE_SECRET"

mysqldump --single-transaction --quick --routines --triggers \
--defaults-file=/etc/mysql/backup.cnf "$DB" \
| gzip -9 \
| aws --endpoint https://s3.filebase.io s3 cp - \
"s3://${BUCKET}/mysql/${DB}-${DATE}.sql.gz"

Use --defaults-file=/etc/mysql/backup.cnf (chmod 600) so the password isn't on the command line.

Per-database backups

For multi-tenant systems where you want per-database files:

for db in $(mysql -u backup -e "SHOW DATABASES;" -s --skip-column-names | grep -v -E "^(mysql|information_schema|performance_schema|sys)$"); do
mysqldump --single-transaction "$db" \
| gzip -9 \
| aws --endpoint https://s3.filebase.io s3 cp - \
"s3://my-db-backups/mysql/${db}-$(date +%Y%m%d).sql.gz"
done

Physical / hot backups

For TB-scale MySQL, use xtrabackup or MySQL Enterprise Backup. Both can stream archives directly into S3-compatible storage.

What's next