راهنمای پشتیبانگیری
واقعیتش این روزها که صدای انفجارهای پیدرپی از گوشه گوشه کشور شنیده میشه، حال خوشی ندارم و کمتر از هر زمان دیگهای دست و دلم به نوشتن پست جدید میره. ولی با توجه به شرایط بدی که پیش اومده و لزوم تهییه نسخههای پشتیبان از دیتای موجود روی سرورها و حتی نگهداریشون به صورت لوکال تصمیم گرفتم این پست رو بذارم تا حداقل یک کمک کوچک باشه تو این شرایط.
مواردی که توی این پست بررسی میشه اینها هست، اگه مورد دیگهای هم مورد نیازتون هست بهم بگین تا اضافه کنم
- PostgreSQL
- MySQL
- MongoDB
- Elasticsearch
- انتقال فایلها با استفاده از rsync
صرفا نمونههایی برای هر کدوم آوردم و سعی کردم توضیح اضافه ندم. قطعا خودتون بهتر میدونین که مثلا اطلاعات مهم مثل username و password رو نباید هارد کد کنید.
پشتیبانگیری از PostgreSQL با pg_dump
#!/bin/bash
# PostgreSQL backup script
DB_HOST="localhost"
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/postgres"
mkdir -p "$BACKUP_DIR"
export PGPASSWORD="$DB_PASS"
# Single database backup
pg_dump -h "$DB_HOST" -U "$DB_USER" -F c -b -v -f "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d).dump" "$DB_NAME"
# All databases backup (alternative)
pg_dumpall -h "$DB_HOST" -U "$DB_USER" | gzip > "$BACKUP_DIR/all_databases_$(date +%Y%m%d).sql.gz"
unset PGPASSWORD
echo "PostgreSQL backup completed successfully."
پشتیبانگیری از MySQL با mysqldump
#!/bin/bash
# MySQL backup script
DB_HOST="localhost"
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/mysql"
mkdir -p "$BACKUP_DIR"
# Single database backup
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d).sql.gz"
# All databases backup (alternative)
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" --all-databases --single-transaction --routines --triggers | gzip > "$BACKUP_DIR/all_databases_$(date +%Y%m%d).sql.gz"
echo "MySQL backup completed successfully."
پشتیبانگیری از MongoDB
#!/bin/bash
# MongoDB backup script
DB_HOST="localhost"
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/mongodb"
mkdir -p "$BACKUP_DIR"
# Canonical (JSON) backup
mongodump --host "$DB_HOST" --username "$DB_USER" --password "$DB_PASS" --db "$DB_NAME" --out "$BACKUP_DIR/mongodb_$(date +%Y%m%d)" --jsonFormat canonical
echo "MongoDB backup completed successfully."
پشتیبانگیری از Elasticsearch
#!/bin/bash
# Config
ES_HOST="localhost"
ES_USER="your_username"
ES_PASS="your_password"
BACKUP_DIR="/backup/elasticsearch"
SCROLL_TIMEOUT="1m"
BATCH_SIZE=1000
# Get list of all indices
INDICES=$(curl -s -u "$ES_USER:$ES_PASS" "$ES_HOST:9200/_cat/indices?h=index")
mkdir -p "$BACKUP_DIR"
for INDEX in $INDICES; do
echo "Backing up $INDEX..."
INDEX_BACKUP_FILE="$BACKUP_DIR/${INDEX}_data.json"
> "$INDEX_BACKUP_FILE" # empty or create
# Start scroll
RESPONSE=$(curl -s -u "$ES_USER:$ES_PASS" -X POST "$ES_HOST:9200/$INDEX/_search?scroll=$SCROLL_TIMEOUT&size=$BATCH_SIZE" \
-H 'Content-Type: application/json' \
-d '{"query": {"match_all": {}}}')
echo "$RESPONSE" > "$BACKUP_DIR/${INDEX}_scroll_init.json"
SCROLL_ID=$(echo "$RESPONSE" | jq -r '._scroll_id')
HITS=$(echo "$RESPONSE" | jq '.hits.hits')
echo "$HITS" | jq -c '.[]' >> "$INDEX_BACKUP_FILE"
# Continue scrolling until no more hits
while true; do
RESPONSE=$(curl -s -u "$ES_USER:$ES_PASS" -X GET "$ES_HOST:9200/_search/scroll" \
-H 'Content-Type: application/json' \
-d "{\"scroll\": \"$SCROLL_TIMEOUT\", \"scroll_id\": \"$SCROLL_ID\"}")
HITS=$(echo "$RESPONSE" | jq '.hits.hits')
COUNT=$(echo "$HITS" | jq 'length')
if [[ "$COUNT" -eq 0 ]]; then
break
fi
echo "$HITS" | jq -c '.[]' >> "$INDEX_BACKUP_FILE"
SCROLL_ID=$(echo "$RESPONSE" | jq -r '._scroll_id')
done
echo "Finished backing up $INDEX"
done
echo "hElasticsearch backup completed successfully."
برای parse کردن json از ابزار jq استفاده شده که. در صورتی که از ubuntu استفاده میکنید میتونین از طریق زیر نصبش کنید:
sudo apt install jq
انتقال فایلها از طریق rsync
until rsync -avzP --partial source_dir/ user@ip:destination_dir/; do
echo "Retrying in 60 seconds..."
sleep 60
done