Skip to main content
Version: Canary⚠️

Percona XtraBackup

Percona XtraBackup is an open-source, hot-backup utility for MySQL-based servers. Unlike traditional dump tools, it copies actual data files without locking your database, making it ideal for high-availability production environments.

1. Installation​

XtraBackup must be installed directly on the database server. Choose the version that matches your database engine:

  • XtraBackup 8.0: For MySQL 8.0 and Percona Server 8.0.
  • XtraBackup 8.4 (LTS): For MySQL 8.4 LTS and newer editions.

On Ubuntu / Debian Systems​

1. Use the apt package manager to dowload percona-release:​

sudo apt update

2. Download the percona-release the repository package:​

curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb

3. Install the downloaded package and its dependencies using apt:​

sudo apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb

4. Refresh the local cache to update the package information:​

sudo apt update

5. Enable the specific percona-release product.​

sudo percona-release enable pxb-84-lts

6. Install Percona XtraBackup.​

sudo apt install percona-xtrabackup-84

Verify Installation​

Confirm that the binary is correctly registered in your system PATH:

xtrabackup --version

2. Configuration​

Use the MySQL Option File Shortcut​

If you are running the backup, you can also place these credentials inside the default user configuration file (~/.my.cnf). XtraBackup automatically checks this location if no other file is specified.

Step 1: Create ~/.my.cnf​

nano ~/.my.cnf
# ~/.my.cnf
[client]
user=backup_user
password=your_ultra_secure_password

Step 2: Lock permissions​

chmod 600 ~/.my.cnf

Step 3: Establish Backup Directories​

Create a dedicated space to house your raw data snapshots:

sudo mkdir -p /var/snapshots/mysql

3. Creating a Live Hot-Backup​

Because XtraBackup performs non-locking physical backups, you can run these commands directly on a live production server without interrupting user transactions.

Execute cleanly​

Because XtraBackup automatically searches ~/.my.cnf, you can run a completely clean command:

xtrabackup --backup --databases="db1 db2" --target-dir=/var/snapshots/mysql

Execute the Backup Command​

Run the execution command. Provide valid database administrative credentials:

xtrabackup --backup \
--user=root \
--password="YourSecurePassword" \
--target-dir=/var/snapshots/mysql
Execution Check

Scroll to the very bottom of your terminal output when the command finishes. Look for the explicit text confirmation line completed OK!

4. Preparing the Backup (Testing & Validation)​

When a physical backup is captured, it contains data files exactly as they looked on disk while queries were still running. This means some transactions might be half-written or uncommitted.

Before this data can be safely restored, you must prepare it to make the files structurally consistent.

xtrabackup --prepare --target-dir=/var/snapshots/mysql

Why is this step crucial?​

  • It replays completed transactions from the database transaction logs (redo log).
  • It rolls back uncommitted transactions so the files are safe to start up.
  • Testing Benefit: Running this step confirms the structural integrity of your backup files before a real disaster happens.

5. Restoring the Database​

Maintenance Warning

Restoring a physical backup replaces your entire existing database directory. Stop your web server or applications to prevent corrupt traffic during this process.

Step 1: Stop the Active MySQL Daemon​

sudo systemctl stop mysql

Step 2: Clear or Archive the Old Data Directory​

MySQL will refuse to overwrite an active, non-empty data directory. Move your current broken or old data out of the way:

sudo mv /var/lib/mysql /var/lib/mysql.bak
sudo mkdir /var/lib/mysql

Step 3: Copy Back the Prepared Files​

Use the --copy-back flag to instantly migrate the prepared snapshot back into its production home directory layout:

xtrabackup --copy-back --target-dir=/var/snapshots/mysql

Step 4: Fix Directory Ownership Permissions​

XtraBackup restores files using the system user that executed the command (typically root). You must hand ownership back to the mysql daemon before starting up the service:

sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 750 /var/lib/mysql

Step 5: Restart the Service​

Launch your database instance back online:

sudo systemctl start mysql

Verify that your applications can connect smoothly and that your historical tables are completely restored.