Dockerized hot MySQL backup with Percona Xtrabackup under cron.
Setup is done through a number of environment variables:
| Variable name | Description | Example |
|---|---|---|
| CRON | Cron rules to run | Do backup at 01:00am each day: 0 1 * * * backup _name_ "--compress" >/dev/console 2>&1 |
| TZ | The time zone | Europe/Berlin |
| MYSQL_HOST | MySQL host name | 172.17.0.1 |
| MYSQL_PORT | MySQL port | 3306 |
| MYSQL_USER | MySQL user | root |
| MYSQL_PASS | MySQL user password | [your password here] |
MYSQL_ variables are used to connect to the database. You can omit these settings and mount a custom .cnf file to the
/root/.my.cnf inside the container.
[xtrabackup]
user=user
password=password
host=host
port=port
# any other settings here if you wish
| Command | Description |
|---|---|
| xtrabackup | The Percona Xtrabackup binary |
| backup | xtrabackup proxy. First argument stands for the backup name (eg. rancher), second are xtrabackup additional parameters (eg. --compress) |
Example setup to backup Rancher database periodically.
docker run -it --rm -d --restart=unless-stopped --name backup-rancher \
# path to mysql physical files (read only for security)
-v /var/lib/mysql:/var/lib/mysql:ro \
# storage location
-v /mnt/backup/rancher:/mnt/backup/rancher \
# backup log (not required)
-v /var/backup/backup.log:/var/backup.log \
-e CRON='0 1 * * * backup rancher "--compress --compress-threads=4" >/dev/console 2>&1' \
-e TZ=Europe/Warsaw \
-e MYSQL_HOST='172.17.0.1' -e MYSQL_PORT=3306 -e MYSQL_USER=root -e MYSQL_PASS=password
Make sure the backup location directory name matches your backup name that you set up in the cron rule.
This will ensure symlinks created in the container are also usable on your host machine. In this case
backup name rancher matches the rancher directory inside /mnt/backup as all backups are stored
in the /mnt/backup inside the container.
The --backup --target-dir=/path arguments are added automatically.
If a physical file is mounted to the container's /var/backup.log location tool will prepend the file
after a successful backup with a CSV line:
[unix time];[yyyy-mm-dd hh:mm:ss];[log name];[log size (eg. 32M)];[log path]
We then use this file to generate a Jekyll based HTML report.
[root@host /mnt/backup/rancher]$ ls -l
total 4
drwxr-xr-x. 4 root root 4096 04-02 01:30 2018
lrwxrwxrwx. 1 root root 41 04-13 01:30 latest -> /mnt/backup/rancher/2018/04/12/1523575621
lrwxrwxrwx. 1 root root 41 04-13 01:30 latest-full -> /mnt/backup/rancher/2018/04/12/1523575621
|-2018
|---04
|-----05
|-------1522970821
|-----06
|-------1523057221
|-----07
|-------1523143621
|-----08
|-------1523230021
|-----09
|-------1523316421
|-----10
|-------1523402821
|-----11
|-------1523489221
|-----12
|-------1523575621