Difference between revisions of "Backup: Restic"
Onnowpurbo (talk | contribs) (Created page with "Running `restic` every 5 seconds to back up a MySQL database on a remote Ubuntu server is technically possible but **not recommended** due to: * Backup overhead (even increme...") |
Onnowpurbo (talk | contribs) |
||
Line 1: | Line 1: | ||
− | Running `restic` every 5 seconds to back up a MySQL database on a remote Ubuntu server is technically possible but | + | Running `restic` every 5 seconds to back up a MySQL database on a remote Ubuntu server is technically possible but '''not recommended''' due to: |
* Backup overhead (even incremental backups every 5 seconds is resource-intensive). | * Backup overhead (even incremental backups every 5 seconds is resource-intensive). | ||
Line 5: | Line 5: | ||
* `cron` does not support per-second precision; you'd need `systemd` timers for that. | * `cron` does not support per-second precision; you'd need `systemd` timers for that. | ||
− | That said, here's a | + | That said, here's a '''safe and practical''' version (e.g., every 1–5 minutes), and also a '''technical example''' for every 5 seconds using `systemd`. |
− | + | ==Recommended Approach: Every 1 Minute Using systemd Timer== | |
− | + | '''Step 1: Create MySQL Dump Script''' | |
− | + | /usr/local/bin/mysql_backup_restic.sh | |
− | |||
− | |||
#!/bin/bash | #!/bin/bash | ||
Line 34: | Line 32: | ||
restic backup "$DUMP_FILE" | restic backup "$DUMP_FILE" | ||
− | + | ||
Make it executable: | Make it executable: | ||
− | |||
− | |||
− | |||
− | + | chmod +x /usr/local/bin/mysql_backup_restic.sh | |
− | |||
− | + | '''Step 2: Create systemd Service''' | |
− | |||
− | |||
− | |||
− | + | /etc/systemd/system/mysql-restic-backup.service | |
− | |||
− | |||
− | |||
− | + | [Unit] | |
+ | Description=Backup MySQL and upload to restic | ||
+ | |||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | ExecStart=/usr/local/bin/mysql_backup_restic.sh | ||
− | + | '''Step 3: Create Timer (Every Minute)''' | |
− | + | /etc/systemd/system/mysql-restic-backup.timer | |
− | |||
− | |||
− | |||
− | [Timer] | + | [Unit] |
− | OnBootSec=1min | + | Description=Run mysql-restic-backup every minute |
− | OnUnitActiveSec=1min | + | |
− | Unit=mysql-restic-backup.service | + | [Timer] |
− | + | OnBootSec=1min | |
− | [Install] | + | OnUnitActiveSec=1min |
− | WantedBy=timers.target | + | Unit=mysql-restic-backup.service |
− | + | ||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
Enable and start: | Enable and start: | ||
− | |||
− | |||
− | |||
− | |||
− | --- | + | sudo systemctl daemon-reexec |
+ | sudo systemctl enable --now mysql-restic-backup.timer | ||
− | + | ==Every 5 Seconds (Experimental)== | |
Use this only for testing. Real backups this frequently are unsafe. | Use this only for testing. Real backups this frequently are unsafe. | ||
Edit timer: | Edit timer: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | This runs the service every 5 seconds. | + | [Timer] |
+ | OnBootSec=5 | ||
+ | OnUnitActiveSec=5 | ||
+ | Unit=mysql-restic-backup.service | ||
+ | |||
+ | This runs the service every 5 seconds. '''Warning''': It may trigger overlaps or heavy disk/network usage. | ||
To avoid overlap, you can use a systemd feature to prevent concurrent executions: | To avoid overlap, you can use a systemd feature to prevent concurrent executions: | ||
Edit the service: | Edit the service: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [Service] | |
+ | Type=oneshot | ||
+ | ExecStart=/usr/local/bin/mysql_backup_restic.sh | ||
+ | ExecStartPre=/bin/sleep 1 | ||
+ | ExecStartPost=/bin/sleep 1 | ||
+ | TimeoutStartSec=4 | ||
Would you like a `rest-server` (remote repo) example included too? | Would you like a `rest-server` (remote repo) example included too? |
Latest revision as of 18:55, 5 May 2025
Running `restic` every 5 seconds to back up a MySQL database on a remote Ubuntu server is technically possible but not recommended due to:
- Backup overhead (even incremental backups every 5 seconds is resource-intensive).
- Potential data inconsistency and corruption due to overlapping jobs.
- `cron` does not support per-second precision; you'd need `systemd` timers for that.
That said, here's a safe and practical version (e.g., every 1–5 minutes), and also a technical example for every 5 seconds using `systemd`.
Recommended Approach: Every 1 Minute Using systemd Timer
Step 1: Create MySQL Dump Script
/usr/local/bin/mysql_backup_restic.sh
#!/bin/bash # Settings MYSQL_USER="root" MYSQL_PASS="yourpassword" BACKUP_DIR="/var/backups/mysql" DUMP_FILE="$BACKUP_DIR/mysql_dump.sql" RESTIC_REPO="/path/to/restic/repo" RESTIC_PASSWORD="yourresticpassword" # Dump MySQL mkdir -p "$BACKUP_DIR" mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASS" --all-databases > "$DUMP_FILE" # Backup with restic export RESTIC_REPO export RESTIC_PASSWORD restic backup "$DUMP_FILE"
Make it executable:
chmod +x /usr/local/bin/mysql_backup_restic.sh
Step 2: Create systemd Service
/etc/systemd/system/mysql-restic-backup.service
[Unit] Description=Backup MySQL and upload to restic [Service] Type=oneshot ExecStart=/usr/local/bin/mysql_backup_restic.sh
Step 3: Create Timer (Every Minute)
/etc/systemd/system/mysql-restic-backup.timer
[Unit] Description=Run mysql-restic-backup every minute [Timer] OnBootSec=1min OnUnitActiveSec=1min Unit=mysql-restic-backup.service [Install] WantedBy=timers.target
Enable and start:
sudo systemctl daemon-reexec sudo systemctl enable --now mysql-restic-backup.timer
Every 5 Seconds (Experimental)
Use this only for testing. Real backups this frequently are unsafe.
Edit timer:
[Timer] OnBootSec=5 OnUnitActiveSec=5 Unit=mysql-restic-backup.service
This runs the service every 5 seconds. Warning: It may trigger overlaps or heavy disk/network usage.
To avoid overlap, you can use a systemd feature to prevent concurrent executions:
Edit the service:
[Service] Type=oneshot ExecStart=/usr/local/bin/mysql_backup_restic.sh ExecStartPre=/bin/sleep 1 ExecStartPost=/bin/sleep 1 TimeoutStartSec=4
Would you like a `rest-server` (remote repo) example included too?