Skip to content

Instantly share code, notes, and snippets.

@ramingar
Last active September 3, 2025 16:12
Show Gist options
  • Select an option

  • Save ramingar/6aca6234eca37304bb335cef7372aa56 to your computer and use it in GitHub Desktop.

Select an option

Save ramingar/6aca6234eca37304bb335cef7372aa56 to your computer and use it in GitHub Desktop.
Start a Percona Server on a Podman container and make/restore backups with xtrabackup
# create the percona-server container
podman volume create percona-apiprejobs-data
podman volume create percona-apiprejobs-logs
podman run --replace --name percona-apiprejobs   -p 3306:3306 -v percona-apiprejobs-data:/var/lib/mysql  -v percona-apiprejobs-logs:/var/log/mysql     -e MYSQL_ROOT_PASSWORD=zzzzzzzz  -e MYSQL_USER=user -e MYSQL_PASSWORD=xxxxxxx  -d percona/percona-server:8.0 --bind-address=0.0.0.0

You will need a user with some special permissions:

CREATE USER 'backupuser'@'%' IDENTIFIED BY WITH mysql_native_password 'strong_password';
GRANT RELOAD, PROCESS, LOCK TABLES, BACKUP_ADMIN, REPLICATION CLIENT ON *.* TO 'backupuser'@'%';
GRANT SELECT ON performance_schema.replication_group_members TO 'backupuser'@'%';
GRANT SELECT ON performance_schema.keyring_component_status TO 'backupuser'@'%';
GRANT SELECT ON performance_schema.log_status TO 'backupuser'@'%';

FLUSH PRIVILEGES;

After that:

# create a backup
podman run --rm -it   --volumes-from percona-apiprejobs   -v percona-apiprejobs-backup:/backup   percona/percona-xtrabackup:8.0.35-33  bash -c 'xtrabackup --backup --compress --stream=xbstream  --user=backupuser --password=xxxxxxx   --datadir=/var/lib/mysql  --target-dir=/backup   > /backup/$(date +"%Y-%m-%d-%H-%M")-backup-full.xbstream'
cp /home/<user>/.local/share/containers/storage/volumes/percona-apiprejobs-backup/_data/$(date +"%Y-%m-%d-%H-%M")-backup-full.xbstream /home/<user>/percona-backup/$(date +"%Y-%m-%d-%H-%M")-backup-full.xbstream

# prepare the backup
xbstream -x --decompress < $(date +"%Y-%m-%d-%H-%M")-backup-full.xbstream
xtrabackup --prepare --target-dir=/home/<user>/percona-backup/

# restore the backup
sudo xtrabackup -u root -p --move-back --target-dir=/home/<user>/percona-backup/ --datadir=/home/<user>/.local/share/containers/storage/volumes/percona-apiprejobs-data/_data/
sudo chown -R 101000:101000 /home/<user>/.local/share/containers/storage/volumes/percona-apiprejobs-data/_data/*
podman run --replace --restart=always --name percona-apiprejobs   -p 3306:3306 -v percona-apiprejobs-data:/var/lib/mysql  -v percona-apiprejobs-logs:/var/log/mysql  -d percona/percona-server:8.0 --bind-address=0.0.0.0



# -----------------------------------------------

# NOTE:
# if container doesn't stop
podman inspect percona-apiprejobs | grep Pid
kill -9 <PID>
podman container rm percona-apiprejobs -f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment