Basic Backup & Restore
This example walks through a complete backup and restore cycle using local filesystem storage. By the end, you will have backed up messages from RabbitMQ, inspected the backup, and restored messages to the same or a different broker.
Prerequisites
- RabbitMQ running locally with the Management Plugin enabled
rabbitmq-backupinstalled (see Bare Metal deployment)
Step 1: Set Up a Test Queue with Messages
Create a queue and publish some test messages:
# Declare a queue
rabbitmqadmin declare queue name=demo-queue durable=true
# Declare an exchange and binding
rabbitmqadmin declare exchange name=demo-exchange type=direct
rabbitmqadmin declare binding source=demo-exchange destination=demo-queue routing_key=demo
# Publish test messages
for i in $(seq 1 50); do
rabbitmqadmin publish exchange=demo-exchange routing_key=demo \
payload="Message number $i at $(date -u +%Y-%m-%dT%H:%M:%SZ)"
done
# Verify messages are in the queue
rabbitmqadmin list queues name messages
Expected output:
+------------+----------+
| name | messages |
+------------+----------+
| demo-queue | 50 |
+------------+----------+
Step 2: Create the Backup Configuration
backup.yaml
mode: backup
backup_id: "demo-backup-001"
source:
amqp_url: "amqp://guest:guest@localhost:5672/%2f"
management_url: "http://localhost:15672"
management_username: guest
management_password: guest
queues:
include:
- "demo-*"
storage:
backend: filesystem
path: /tmp/rabbitmq-backups
backup:
compression: zstd
compression_level: 3
prefetch_count: 100
requeue_strategy: cancel
max_concurrent_queues: 4
include_definitions: true
stop_at_current_depth: true
Step 3: Run the Backup
rabbitmq-backup backup --config backup.yaml
Expected output:
INFO Starting backup demo-backup-001
INFO Connected to RabbitMQ at localhost:5672
INFO Discovered 1 queue matching selection criteria
INFO Backing up queue demo-queue (50 messages)
INFO Segment segment-0001.zst written (50 records)
INFO Definitions exported (1 vhost, 1 queue, 1 exchange)
INFO Backup demo-backup-001 completed: 50 messages in 1 segment
Step 4: Verify Messages Are Still in the Queue
The backup is non-destructive. Messages remain in the queue:
rabbitmqadmin list queues name messages
+------------+----------+
| name | messages |
+------------+----------+
| demo-queue | 50 |
+------------+----------+
Step 5: Inspect the Backup
List Backups
rabbitmq-backup list --path /tmp/rabbitmq-backups
Backups in /tmp/rabbitmq-backups:
demo-backup-001 2025-01-15T10:30:00Z 50 messages 1 queue
Describe the Backup
rabbitmq-backup describe --path /tmp/rabbitmq-backups --backup-id demo-backup-001
Validate Integrity
rabbitmq-backup validate --path /tmp/rabbitmq-backups --backup-id demo-backup-001 --deep
View the Storage Layout
find /tmp/rabbitmq-backups/demo-backup-001 -type f
/tmp/rabbitmq-backups/demo-backup-001/manifest.json
/tmp/rabbitmq-backups/demo-backup-001/definitions/definitions.json.zst
/tmp/rabbitmq-backups/demo-backup-001/queues/_default/demo-queue/segment-0001.zst
Step 6: Restore from Backup
Create the Restore Configuration
restore.yaml
mode: restore
backup_id: "demo-backup-001"
target:
amqp_url: "amqp://guest:guest@localhost:5672/%2f"
management_url: "http://localhost:15672"
management_username: guest
management_password: guest
storage:
backend: filesystem
path: /tmp/rabbitmq-backups
restore:
restore_definitions: true
publish_mode: exchange
publisher_confirms: true
max_concurrent_queues: 4
produce_batch_size: 100
checkpoint_state: /tmp/rabbitmq-backups/demo-restore-checkpoint.db
dry_run: false
Prepare: Clear the Queue (to Demonstrate Restore)
Purge the queue to simulate data loss:
rabbitmqadmin purge queue name=demo-queue
# Confirm queue is empty
rabbitmqadmin list queues name messages
+------------+----------+
| name | messages |
+------------+----------+
| demo-queue | 0 |
+------------+----------+
Run the Restore
rabbitmq-backup restore --config restore.yaml
Expected output:
INFO Starting restore from demo-backup-001
INFO Connected to RabbitMQ at localhost:5672
INFO Current target definitions rollback snapshot written to demo-backup-001/definitions/rollback-before-import-...
INFO Definitions restored (1 vhost, 1 queue, 1 exchange)
INFO Restoring 50 messages to demo-queue
INFO Published 50 messages to demo-queue (50 confirmed)
INFO Restore complete: 50 messages restored
Verify the Restore
rabbitmqadmin list queues name messages
+------------+----------+
| name | messages |
+------------+----------+
| demo-queue | 50 |
+------------+----------+
Consume a message to verify content:
rabbitmqadmin get queue=demo-queue count=1
Step 7: Restore to a Different Queue
You can restore messages to a different queue using queue_mapping:
restore-remap.yaml
mode: restore
backup_id: "demo-backup-001"
target:
amqp_url: "amqp://guest:guest@localhost:5672/%2f"
management_url: "http://localhost:15672"
management_username: guest
management_password: guest
storage:
backend: filesystem
path: /tmp/rabbitmq-backups
restore:
restore_definitions: false
publish_mode: direct-to-queue
publisher_confirms: true
queue_mapping:
demo-queue: demo-queue-copy
create_missing_queues: true
rabbitmq-backup restore --config restore-remap.yaml
Check both queues:
rabbitmqadmin list queues name messages
+-----------------+----------+
| name | messages |
+-----------------+----------+
| demo-queue | 50 |
| demo-queue-copy | 50 |
+-----------------+----------+
Cleanup
# Delete the test queue
rabbitmqadmin delete queue name=demo-queue
rabbitmqadmin delete queue name=demo-queue-copy
rabbitmqadmin delete exchange name=demo-exchange
# Remove backup data
rm -rf /tmp/rabbitmq-backups
Next Steps
- Backup to S3 -- use cloud storage instead of filesystem
- Point-in-Time Restore -- restore a subset of messages
- Multi-Vhost Backup -- back up across vhosts