Thursday, January 29, 2026

podman mysql 8 percona di ubuntu server

 

🚀 Panduan Portabel Percona 8.0 (Podman)

1. Script: startmysql.sh (Tanpa InnoDB Config)

Gunakan $USER agar script otomatis mengenali siapa pun yang menjalankan script ini.

Bash
#!/bin/bash
# Nama File: startmysql.sh

CONTAINER_NAME="psmysql"
# Menggunakan $HOME agar otomatis menyesuaikan nama user server
DB_DATA_DIR="$HOME/mysql"
IMAGE_NAME="docker.io/percona/percona-server:8.0.44"

echo "--- Menjalankan Percona Server ---"

# Inisialisasi folder
mkdir -p "$DB_DATA_DIR"
# Paksa UID 1001 (default Percona) tanpa perlu tahu nama user host
podman unshare chown -R 1001:1001 "$DB_DATA_DIR"

podman rm -f $CONTAINER_NAME >/dev/null 2>&1 || true

podman run -d \
    --name $CONTAINER_NAME \
    --restart unless-stopped \
    -p 3306:3306 \
    -v "$DB_DATA_DIR":/var/lib/mysql:Z \
    -e TZ=Asia/Jakarta \
    -e MYSQL_ROOT_PASSWORD="SecretRootPassword" \
    -e MYSQL_ROOT_HOST="%" \
    $IMAGE_NAME \
    --max_connections=151 \
    --default-authentication-plugin=mysql_native_password \
    --sql-mode="" \
    --innodb_strict_mode=OFF \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_general_ci \
    --default-time-zone="+07:00"

echo "✅ Database berhasil dijalankan di $DB_DATA_DIR"

2. Script: startbackup.sh (Universal)

Menggunakan variabel $HOME dan $USER agar tidak gagal saat pindah server.

Bash
#!/bin/bash
# Nama File: startbackup.sh

CONTAINER_NAME="psmysql"
DATA_DIR="$HOME/mysql"
BACKUP_BASE_DIR="$HOME/backups"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
TARGET_DIR="/backups/backup_$TIMESTAMP"

mkdir -p "$BACKUP_BASE_DIR"
# Memberikan izin ke container tanpa hardcode nama user
podman unshare chown -R 1001:1001 "$BACKUP_BASE_DIR"

echo "--- Memulai Backup Fisik ---"
podman run --rm \
    --network container:$CONTAINER_NAME \
    -v "$DATA_DIR":/var/lib/mysql:ro,Z \
    -v "$BACKUP_BASE_DIR":/backups:z \
    docker.io/percona/percona-xtrabackup:8.0 \
    xtrabackup --backup \
        --host=127.0.0.1 \
        --user=root \
        --password="SecretRootPassword" \
        --target-dir="$TARGET_DIR"

# Kembalikan akses ke user yang sedang login saat ini
sudo chown -R $USER:$USER "$BACKUP_BASE_DIR"
echo "✅ Backup selesai: $BACKUP_BASE_DIR/backup_$TIMESTAMP"

3. Script: startrestore.sh (Solusi Error 13)

Ini adalah versi yang memperbaiki error pada gambar Anda dengan menggunakan sudo chown -R $USER:$USER agar tidak peduli siapa nama user-nya.

Bash
#!/bin/bash
# Nama File: startrestore.sh
set -e

CONTAINER_NAME="psmysql"
DATA_DIR="$HOME/mysql"
BACKUP_BASE_DIR="$HOME/backups"
IMAGE_XTRABACKUP="docker.io/percona/percona-xtrabackup:8.0"

echo "--- Proses Restore Database ---"

# Pilih folder backup
cd "$BACKUP_BASE_DIR"
PS3="Pilih nomor folder backup: "
select SELECTED in *; do
    if [ -n "$SELECTED" ]; then
        FULL_PATH="$BACKUP_BASE_DIR/$SELECTED"
        break
    fi
done

# SOLUSI ERROR 13: Ambil alih kepemilikan folder secara universal
sudo chown -R $USER:$USER "$FULL_PATH"
sudo chmod -R 777 "$FULL_PATH"

echo "1. Prepare Data (Applying Logs)..."
# Gunakan user 0:0 agar xtrabackup bisa mkdir #innodb_redo di dalam container
podman run --rm --user 0:0 -v "$FULL_PATH:/backup:rw,z" $IMAGE_XTRABACKUP \
    xtrabackup --prepare --target-dir=/backup

echo "2. Cleanup & Copy-back..."
podman rm -f $CONTAINER_NAME >/dev/null 2>&1 || true
sudo rm -rf "$DATA_DIR"
mkdir -p "$DATA_DIR"

podman run --rm --user 0:0 \
    -v "$FULL_PATH:/backup:ro,z" \
    -v "$DATA_DIR":/var/lib/mysql:rw,z \
    $IMAGE_XTRABACKUP \
    xtrabackup --copy-back --target-dir=/backup --datadir=/var/lib/mysql

# Final Touch: Set izin ke UID 1001 agar Percona bisa start
podman unshare chown -R 1001:1001 "$DATA_DIR"

echo "✅ Restore selesai. Sekarang jalankan ./startmysql.sh"

No comments:

Post a Comment