Datubāzes rezerves kopijas: mysqldump, pg_dump, cron
Palaist serverī ar vienu komandu (vispirms pārbaudiet skripta saturu zemāk):
curl -sSL https://cp.lv/scripts/bekapy-bazy-dannyh.sh | sudo bash…vai ar wget:
wget -qO- https://cp.lv/scripts/bekapy-bazy-dannyh.sh | sudo bashSkripta saturs bekapy-bazy-dannyh.sh:
#!/usr/bin/env bash
# Izveido MySQL rezerves kopiju skriptu, pirmo dump failu un cron uzdevumu
set -e
SCRIPT=/opt/scripts/mysql-backup.sh
BACKUP_DIR=/var/backups/mysql
# 1. Katalogi skriptam un dump failiem
sudo mkdir -p /opt/scripts "$BACKUP_DIR"
# 2. Izveidot pašu rezerves kopiju skriptu ('EOF' — mainīgie izvērsīsies palaišanas brīdī)
sudo tee "$SCRIPT" > /dev/null << 'EOF'
#!/bin/bash
set -euo pipefail
DB_NAME="app_db"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction --quick --user="$DB_USER" \
"$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
EOF
sudo chmod +x "$SCRIPT"
# 3. Izveidot pirmo rezerves kopiju uzreiz
sudo "$SCRIPT"
# 4. Cron uzdevums: katru dienu plkst. 3:30 naktī
echo "30 3 * * * root $SCRIPT >> /var/log/db-backup.log 2>&1" | sudo tee /etc/cron.d/db-backup > /dev/null
echo "Gatavs: skripts $SCRIPT izveidots, pirmais dump fails mapē $BACKUP_DIR, cron iestatīts."
Datubāzes rezerves kopija ir tas, kas glābj projektu diska atteices, kļūdainas DROP TABLE komandas vai neveiksmīgas migrācijas gadījumā. Neviens hostings neatceļ jūsu paša atbildību par rezerves kopijām: glabājiet kopijas un pārbaudiet to atjaunošanu. Zemāk — darbojošies skripti MySQL/MariaDB un PostgreSQL ar automātisku palaišanu pēc cron.
Uzticamas rezerves kopijas principi
- Regularitāte — pēc grafika, bez manuālas iejaukšanās.
- Rotācija — glabāt N pēdējās kopijas, vecās dzēst.
- Ārēja glabātuve — kopēt dump failus uz citu serveri vai objektu glabātuvi, nevis tikai uz to pašu disku.
- Atjaunošanas pārbaude — periodiski izvērst dump failu testa datubāzē.
MySQL un MariaDB rezerves kopija
Utilīta mysqldump izveido loģisku dump failu — SQL failu ar visiem datiem. Izveidojiet failu /opt/scripts/mysql-backup.sh redaktorā (nano, vim vai mcedit):
sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/mysql-backup.sh
Skripta saturs:
#!/bin/bash
set -euo pipefail
DB_NAME="app_db"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction --quick --user="$DB_USER" \
"$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
# dzēst kopijas, kas vecākas par KEEP_DAYS dienām
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
Vai arī izveidojiet skriptu uzreiz ar vienu komandu — nokopējiet un ielīmējiet konsolē (pēdiņas 'EOF' ir svarīgas: $ mainīgajiem jāpaliek skriptā, nevis jāizvēršas tagad):
sudo tee /opt/scripts/mysql-backup.sh > /dev/null << 'EOF'
#!/bin/bash
set -euo pipefail
DB_NAME="app_db"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction --quick --user="$DB_USER" \
"$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
EOF
sudo chmod +x /opt/scripts/mysql-backup.sh
Karogs --single-transaction noņem saskaņotu momentuzņēmumu bez tabulu bloķēšanas (InnoDB gadījumā). Lai neglabātu paroli skriptā, izveidojiet failu ~/.my.cnf ar tiesībām 600. Atveriet to redaktorā:
nano ~/.my.cnf
Faila saturs:
[client]
user=backup_user
password=StrongPassword123!
Vai arī izveidojiet failu ar vienu komandu — nokopējiet un ielīmējiet konsolē:
tee ~/.my.cnf > /dev/null << 'EOF'
[client]
user=backup_user
password=StrongPassword123!
EOF
chmod 600 ~/.my.cnf
Padariet skriptu izpildāmu:
chmod +x /opt/scripts/mysql-backup.sh
PostgreSQL rezerves kopija
Līdzīgs skripts ar pg_dump (custom formāts ir ērtāks daļējai atjaunošanai). Izveidojiet failu /opt/scripts/postgres-backup.sh redaktorā:
sudo nano /opt/scripts/postgres-backup.sh
Skripta saturs:
#!/bin/bash
set -euo pipefail
DB_NAME="app_db"
BACKUP_DIR="/var/backups/postgres"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
pg_dump -Fc "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
find "$BACKUP_DIR" -name "*.dump" -mtime +$KEEP_DAYS -delete
Vai arī izveidojiet skriptu uzreiz ar vienu komandu (pēdiņas 'EOF' saglabā $ mainīgos skripta iekšienē):
sudo tee /opt/scripts/postgres-backup.sh > /dev/null << 'EOF'
#!/bin/bash
set -euo pipefail
DB_NAME="app_db"
BACKUP_DIR="/var/backups/postgres"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
pg_dump -Fc "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
find "$BACKUP_DIR" -name "*.dump" -mtime +$KEEP_DAYS -delete
EOF
sudo chmod +x /opt/scripts/postgres-backup.sh
PostgreSQL paroli glabā failā ~/.pgpass (tiesības 600). Atveriet to redaktorā:
nano ~/.pgpass
Faila saturs (formāts host:port:db:user:password):
localhost:5432:app_db:backup_user:StrongPassword123!
Vai arī izveidojiet failu ar vienu komandu:
tee ~/.pgpass > /dev/null << 'EOF'
localhost:5432:app_db:backup_user:StrongPassword123!
EOF
chmod 600 ~/.pgpass
Grafiks cron sistēmā
Atveriet tā lietotāja crontab, ar kuru strādā skripti:
crontab -e
Pievienojiet uzdevumus — ikdienas rezerves kopija plkst. 3:30 naktī:
30 3 * * * /opt/scripts/mysql-backup.sh >> /var/log/db-backup.log 2>&1
30 3 * * * /opt/scripts/postgres-backup.sh >> /var/log/db-backup.log 2>&1
Pārbaudiet, vai uzdevums ir saglabāts: crontab -l.
Kopēšana uz citu serveri
Skripta beigās pievienojiet dump faila nosūtīšanu uz attālo hostu pa SSH:
rsync -az "$BACKUP_DIR"/ [email protected]:/remote/db-backups/
Atjaunošana no dump faila
MySQL:
gunzip < app_db_2026-04-17_03-30.sql.gz | mysql -u root -p app_db
PostgreSQL (custom formāts):
pg_restore -d app_db --clean app_db_2026-04-17_03-30.dump
Biežākie jautājumi
Cik bieži veidot rezerves kopijas? Tas atkarīgs no tā, cik daudz datu esat gatavs zaudēt. Aktīvai vietnei — katru dienu, kritiskiem datiem — vairākas reizes dienā vai ar nepārtrauktu WAL arhivēšanu (PostgreSQL).
Vai mysqldump bloķē datubāzi darba laikā?
Ar karogu --single-transaction InnoDB tabulām bloķēšanas nav — tiek noņemts saskaņots momentuzņēmums. MyISAM gadījumā bloķēšana ir iespējama.
Kur glabāt dump failus? Ne tikai tajā pašā diskā. Kopējiet tos uz atsevišķu serveri vai objektu glabātuvi: diska atteice nedrīkst aiznest gan datubāzi, gan tās rezerves kopijas.
Kā pārliecināties, ka rezerves kopija ir derīga? Periodiski atjaunojiet dump failu atsevišķā testa datubāzē un pārbaudiet datus. Nepārbaudītu rezerves kopiju nevar uzskatīt par rezerves kopiju.
Rezerves kopijas ir jūsu atbildības zona, un mēs iesakām tās veidot vienmēr. Datubāzi ar automātiskām kopijām var izvietot uz tarifiem VPS serveru noma vai specializētajā VPS datu bāzēm.