MySQL / Backup ба restore

Backup ба restore

Өгөгдлийн сангийн backup нь аливаа системийн амин чухал хэсэг. Сервер эвдрэх, буруу DELETE хийх, хакерт өртөх зэрэг аюулаас хамгаалдаг.

mysqldump — backup хийх хэрэгсэл

mysqldump нь MySQL-тэй цуг ирдэг тушаалын мөрийн хэрэгсэл. Өгөгдлийн сангийн бүтэц ба өгөгдлийг SQL файл болгон хадгална.

bash
# Үндсэн хэлбэр
mysqldump -u хэрэглэгч -p database_нэр > backup.sql

# Жишээ
mysqldump -u root -p myshop > myshop_backup.sql
# Нууц үг асуух бөгөөд оруулна

backup.sql файл нь хүснэгт үүсгэх болон бүх мэдээллийг нэмэх SQL мэдэгдлүүдийг агуулна — ямар ч MySQL сервер дээр ажиллуулж болно.

Нийтлэг сонголтууд

bash
# Нэг database backup
mysqldump -u root -p myshop > myshop_2025-01-15.sql

# Бүх database backup
mysqldump -u root -p --all-databases > all_databases.sql

# Олон database
mysqldump -u root -p --databases myshop mystore > two_dbs.sql

# Зөвхөн бүтэц (өгөгдөлгүй)
mysqldump -u root -p --no-data myshop > myshop_structure.sql

# Зөвхөн өгөгдөл (бүтэцгүй)
mysqldump -u root -p --no-create-info myshop > myshop_data.sql

# Нэг хүснэгт
mysqldump -u root -p myshop users > users_backup.sql

--single-transaction: өгөгдлийн уялдаа хамаарал

bash
# InnoDB хүснэгтэд зориулсан найдвартай backup
mysqldump -u root -p --single-transaction myshop > myshop_backup.sql

--single-transaction нь backup хийх явцад хүснэгтийг lock хийхгүйгээр тухайн мөчийн өгөгдлийг нэг transaction дотор авна. Аппликейшн backup хийж байхад ч ажлаа үргэлжлүүлж болно — production орчинд заавал хэрэглэх.

bash
# Бүрэн найдвартай production backup
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  myshop > myshop_full_backup.sql

| Сонголт | Утга | | ---------------------- | ---------------------------------- | | --routines | Stored procedure, function оруулах | | --triggers | Trigger оруулах | | --events | Scheduled event оруулах | | --single-transaction | InnoDB-г lock хийхгүйгээр авах |

Шахаж хадгалах

bash
# gzip-ээр шахах (файл 5-10 дахин жижигрэнэ)
mysqldump -u root -p --single-transaction myshop | gzip > myshop_2025-01-15.sql.gz

# Задлах
gunzip myshop_2025-01-15.sql.gz

Restore — сэргээх

bash
# Байгаа database-д restore хийх
mysql -u root -p myshop < myshop_backup.sql

# Database үүсгээд restore
mysql -u root -p -e "CREATE DATABASE myshop_restored;"
mysql -u root -p myshop_restored < myshop_backup.sql

# Шахсан файлаас шууд restore
gunzip < myshop_2025-01-15.sql.gz | mysql -u root -p myshop

Restore хийхийн өмнө одоогийн өгөгдөл дарагдана — анхаарах хэрэгтэй.

Хуваарьт backup — cron

Linux сервер дээр cron ашиглан автомат backup тохируулах:

bash
# Cron засварлах
crontab -e
bash
# Өдөр бүр 02:00 цагт backup хийх
0 2 * * * mysqldump -u backup_user -pNuucUg myshop --single-transaction | gzip > /backups/myshop_$(date +\%Y-\%m-\%d).sql.gz

# 7 хоногоос хуучин backup устгах
0 3 * * * find /backups -name "myshop_*.sql.gz" -mtime +7 -delete

$(date +%Y-%m-%d) нь тухайн өдрийн огноог нэрэнд нэмдэг: myshop_2025-01-15.sql.gz

Backup шалгах

Backup хийснийг шалгахгүй бол итгэмжлэл болохгүй — сэргэж болохгүй backup нь backup биш:

bash
# Тест database-д restore хийж шалгах
mysql -u root -p -e "CREATE DATABASE myshop_test;"
mysql -u root -p myshop_test < myshop_backup.sql

# Мөрийн тоо таарч байгаа эсэх
mysql -u root -p myshop -e "SELECT COUNT(*) FROM orders;"
mysql -u root -p myshop_test -e "SELECT COUNT(*) FROM orders;"

# Тест database устгах
mysql -u root -p -e "DROP DATABASE myshop_test;"

Backup стратеги

код
Өдөр бүр  → бүрэн backup (full backup)
7 хоног   → өмнөх долоо хоногийн backup хадгална
Сар бүр   → сарын backup тусдаа хадгална
Жил бүр   → жилийн backup архивлана

Байршил:
├── Тухайн сервер
├── Өөр серверт (off-site)
└── Cloud storage (S3, Google Cloud Storage)

Дараагийн хичээлд:

JSON өгөгдөл MySQL-д — JSON column үүсгэх, JSON функцүүд ашиглан өгөгдөл уншиж, өөрчлөх аргыг үзнэ.