Skip to main content

xz - High Ratio Compression

xz provides very high compression ratios (LZMA2), but it is typically slower than gzip and zstd. Use it when bandwidth or storage cost matters more than backup and restore time.

Quick Summary
  • Install: xz-utils (Debian/Ubuntu) or xz (RHEL family).
  • Compress: xz file.sql -> file.sql.xz
  • Decompress: xz -d file.sql.xz or unxz file.sql.xz
  • Test: xz -t file.sql.xz
  • Directory backups: use tar -cJf out.tar.xz dir/

When to use xz

Use xz when:

  • You want maximum compression for cold storage.
  • You are compressing large, mostly-static files (SQL dumps, logs, snapshots).

Avoid xz for high-frequency operational backups where restore speed is critical; prefer zstd or gzip.

Prerequisites

  • Ubuntu 22 / 24 LTS VPS with xz-utils installed.

  • Familiarity with Linux file paths and permissions.

  • WordPress file access such as:

    /home/dev_wpstrategist/public_html/, /home/wpbackup/, /var/log/.


Core syntax

xz-core-syntax.sh
# ──────────────────────────────
# 1. Compress a single file
xz [OPTION] [INPUT_FILE]

# Example:
xz /home/dev_wpstrategist/error.log
# → Output: /home/dev_wpstrategist/error.log.xz

# ──────────────────────────────
# 2. Decompress a .xz file
unxz [INPUT_FILE.xz]
# or
xz -d [INPUT_FILE.xz]

# Example:
xz -d /home/dev_wpstrategist/error.log.xz

# ──────────────────────────────
# 3. Compress with specific level (0–9)
xz -# [INPUT_FILE]

# Example (maximum):
xz -9 /home/wpbackup/db.sql
# → Output: /home/wpbackup/db.sql.xz

# ──────────────────────────────
# 4. Keep original file after compression
xz -k [INPUT_FILE]

# ──────────────────────────────
# 5. Compress to specific directory
xz -c [INPUT_FILE] > [OUTPUT_PATH]/[OUTPUT_NAME].xz

# Example:
xz -c /home/dev_wpstrategist/db.sql > /home/wpbackup/db_$(date +%F).sql.xz

# ──────────────────────────────
# 6. Combine with tar to create .tar.xz archive
tar -cJvf [OUTPUT_FILE.tar.xz] [SOURCE_DIRECTORY]

# Example:
tar -cJvf /home/wpbackup/wpfiles_$(date +%F).tar.xz /home/dev_wpstrategist/public_html

# ──────────────────────────────
# 7. Extract .tar.xz archive
tar -xJvf [INPUT_FILE.tar.xz] -C [TARGET_DIRECTORY]

# Example:
tar -xJvf /home/wpbackup/wpfiles_2025-10-25.tar.xz -C /home/dev_wpstrategist/public_html/

# ──────────────────────────────
# 8. Export & compress MySQL DB
mysqldump -u [USER] -p'[PASS]' [DB_NAME] | xz -9 -c > /home/wpbackup/db_$(date +%F).sql.xz

# ──────────────────────────────
# 9. Import DB from .xz
xz -dc [INPUT_FILE.sql.xz] | mysql -u [USER] -p'[PASS]' [DB_NAME]

# ──────────────────────────────
# 10. Test integrity of .xz file
xz -t [INPUT_FILE.xz]


Key options

OptionDescriptionExampleUse CaseCPU Impact
-#Compression level (0–9)xz -9 db.sqlHigher = smaller, slower🟡–🔴
-dDecompressxz -d file.xzRestore archive🟢
-kKeep originalxz -k db.sqlKeep uncompressed copy🟢
-tTest integrityxz -t file.xzVerify before restore🟢
-vVerbose modexz -v file.sqlShow progress/stats🟢
-cWrite to stdoutxz -c file > out.xzRedirect to other directory🟢
-T#Multithreaded compressionxz -T4 db.sqlFaster on multi-core VPS🟡
tar -cJfCreate tar.xz archivetar -cJf backup.tar.xz dir/Full WP backup🔴

Examples

Compress Single File

xz-compress-wp-config.sh
xz wp-config.php

Output:

example-xz-compress-wp-config.txt
wp-config.php (1/1)
Compressed size: 3.4 KiB → 1.7 KiB (50.0%)

Use Case: Small config file backup.

CPU Impact: Low.


Max Compression Level

xz-max-compress-wpdb.sh
xz -9 wpdb.sql

Output:

example-xz-max-compress.txt
wpdb.sql (1/1)
Compressed size: 150 MB → 10.9 MB (92.7%)

Use Case: Deep compression for archival DB backup.

CPU Impact: High (slow, heavy CPU).


Keep Original

xz-keep-original.sh
xz -k wpdb.sql

Output:

example-xz-keep-original.txt
wpdb.sql
wpdb.sql.xz

Use Case: Retain raw and compressed copies.

CPU Impact: .


Full WordPress Backup as .tar.xz

create-wordpress-tar-xz.sh
tar -cJvf /home/wpbackup/wp_2025-10-25.tar.xz /home/dev_wpstrategist/public_html

Output (snippet):

example-tar-xz-output-snippet.txt
public_html/wp-admin/
public_html/wp-content/
Compression ratio: 85.3% (480 MB → 70 MB)

Use Case: Compress entire WP directory.

CPU Impact: .


Extract Backup

extract-wordpress-tar-xz.sh
tar -xJvf /home/wpbackup/wp_2025-10-25.tar.xz -C /home/dev_wpstrategist/public_html

Output:

All files restored successfully.

Use Case: Restore full site archive.

CPU Impact: .


Verify Backup Integrity

xz-test-integrity.sh
xz -t /home/wpbackup/db_2025-10-25.sql.xz && echo "Valid file"

Output:

Valid file

Use Case: Confirm backup not corrupted.

CPU Impact: .


Stream Compression for Remote VPS

stream-tar-xz-over-ssh.sh
tar -cJf - /home/dev_wpstrategist/public_html | ssh root@remote "cat > /backup/wp_$(date +%F).tar.xz"

Use Case: Send compressed backup directly via SSH.

CPU Impact: – (depends size and cores).


WordPress VPS use cases

Use CaseDescriptionExampleBenefit
DB BackupsCompress SQL dumps`mysqldump …xz -9 -c > …`
Site BackupsTar + XZ archivestar -cJvf backup.tar.xz /var/www/htmlMinimal size
LogsCompress old logsxz --keep /var/log/nginx/*.logFree disk
Remote SyncRsync .xz archivesrsync -avz backup.tar.xz remote:/Save bandwidth
Cron JobsNightly automation0 2 * * * tar -cJf backup_$(date +%F).tar.xz …Auto compress daily

Best practices

  • Use xz -9 for final long-term archives, but xz -6 for daily backups.
  • Always run xz -t before restore.
  • Use T to leverage multi-core compression (xz -T4 = 4 threads).
  • Combine with tar -cJf to pack directories and files together.
  • Use consistent date naming in automation (e.g., backup_$(date +%F).tar.xz).
  • Avoid max level during high VPS load (CPU heavy).

Quick lab

  1. Dump and Compress Database

    quick-lab-dump-and-compress-db.sh
    mysqldump -u root -p wpdb > wpdb.sql
    xz -9 wpdb.sql

  2. Test Archive

    quick-lab-test-xz-file.sh
    xz -t wpdb.sql.xz && echo "Backup OK"

  3. Restore

    quick-lab-restore-db-from-xz.sh
    xz -dc wpdb.sql.xz | mysql -u root -p wpdb

  4. Automate Daily Backup

    quick-lab-automate-daily-tar-xz.sh
    tar -cJvf /home/wpbackup/wp_$(date +%F).tar.xz /home/dev_wpstrategist/public_html


Cheat sheet

xz-cheat-sheet.sh
xz file # Compress → file.xz
xz -d file.xz # Decompress
xz -k file # Keep original
xz -9 file # Max compression
xz -t file.xz # Test integrity
xz -v file # Verbose output
xz -T4 file # Use 4 threads
tar -cJvf a.tar.xz dir/ # Create .tar.xz
tar -xJvf a.tar.xz -C /target # Extract


Mini quiz

  1. Which algorithm powers xz compression?
  2. What does tar -cJf do?
  3. How can you verify if an .xz file is valid?
  4. Which flag enables multithreaded compression?
  5. What level should be used for routine backups vs archival storage?

Restore checklist

Use this checklist before restoring a .tar.xz or .sql.xz backup into a live system.

  • Test integrity (xz -t ...).
  • Extract to staging (/tmp/restore-test/).
  • Confirm expected files exist before copying into place.
restore-drill-tar-xz.sh
sudo rm -rf /tmp/restore-test
sudo mkdir -p /tmp/restore-test
tar -xJvf /home/wpbackup/wp_2025-10-25.tar.xz -C /tmp/restore-test

Advanced tuning (optional)

If you want to pass options to the underlying xz process when creating .tar.xz, you can use XZ_OPT.

xz-opt-example.sh
XZ_OPT='-T0 -6' tar -C /var/www/html -cJf /home/wpbackup/wp-files.tar.xz .

warning

High compression levels can slow restores. Use xz primarily for cold storage and keep an operational format (for example tar.zst) for fast recovery.