Khôi phục WordPress bằng WP-CLI: quy trình backup, restore và kiểm tra sau sự cố

Khôi phục WordPress bằng WP-CLI là kỹ năng bắt buộc khi website gặp lỗi sau cập nhật plugin, bị mất dữ liệu một phần, hoặc cần dựng lại môi trường staging nhanh để điều tra sự cố. Trong môi trường production, thao tác restore không chỉ là “import file SQL” mà còn phải có quy trình kiểm tra, giảm downtime, xác minh dữ liệu và chuẩn bị phương án rollback nếu lần khôi phục đầu tiên chưa đạt.

Bài viết này hướng dẫn một quy trình thực chiến để sao lưu và khôi phục WordPress bằng WP-CLI trên máy chủ Linux. Anh có thể áp dụng cho VPS, cloud instance, hoặc lab nội bộ trước khi triển khai trên hệ thống thật.

Khôi phục WordPress bằng WP-CLI là gì?

WP-CLI là công cụ dòng lệnh chính thức cho WordPress, cho phép quản trị core, plugin, theme, user, database và cache mà không cần thao tác qua wp-admin. Khi website lỗi nặng, trang quản trị có thể không vào được; lúc đó WP-CLI thường là cách nhanh và sạch nhất để kiểm tra và phục hồi.

Với khôi phục WordPress bằng WP-CLI, ta thường xử lý ba phần chính:

  • Database: bài viết, option, user, cấu hình plugin, WooCommerce order nếu có.
  • File hệ thống: source WordPress, plugin, theme, thư mục upload.
  • Cấu hình vận hành: quyền file, cache, permalink, domain, cron và kiểm tra sau restore.

Bối cảnh production/lab nên chuẩn bị

Ví dụ trong bài dùng một site WordPress chạy trên Ubuntu, Nginx hoặc Apache, PHP-FPM và MariaDB/MySQL. Đường dẫn website giả định là:

/var/www/sysadminskills.com/public_html

Database giả định:

DB_NAME=wp_sysadminskills
DB_USER=wp_user

Trong thực tế, anh không nên copy nguyên thông tin này. Hãy đọc thông tin thật từ file wp-config.php:

cd /var/www/sysadminskills.com/public_html
grep "DB_NAME\|DB_USER\|DB_HOST" wp-config.php

Output mẫu:

define( 'DB_NAME', 'wp_sysadminskills' );
define( 'DB_USER', 'wp_user' );
define( 'DB_HOST', 'localhost' );

Checklist trước khi khôi phục WordPress

Trước khi restore, hãy chốt rõ mục tiêu. Khôi phục sai thời điểm hoặc sai bản backup có thể làm mất dữ liệu mới hơn.

1. Xác định loại sự cố

  • Website trắng trang sau khi cập nhật plugin/theme.
  • Database bị lỗi hoặc mất bảng.
  • Bị malware chỉnh file PHP.
  • Cần rollback về trạng thái trước khi deploy.
  • Cần dựng staging giống production để test.

2. Đưa site vào maintenance nếu cần

Nếu đang restore production, nên bật maintenance mode để tránh user ghi dữ liệu trong lúc restore:

cd /var/www/sysadminskills.com/public_html
wp maintenance-mode activate

Kiểm tra trạng thái:

wp maintenance-mode status

Output mẫu:

Maintenance mode is active.

3. Tạo bản backup hiện trạng trước khi đụng vào

Dù site đang lỗi, vẫn nên lưu lại hiện trạng để có đường quay lại khi cần điều tra forensic hoặc so sánh dữ liệu:

mkdir -p /root/backup-before-restore/$(date +%F)
cd /var/www/sysadminskills.com/public_html
wp db export /root/backup-before-restore/$(date +%F)/before-restore.sql
tar -czf /root/backup-before-restore/$(date +%F)/wp-files-before-restore.tar.gz .

Giải thích:

  • wp db export xuất database hiện tại qua WP-CLI.
  • tar -czf nén toàn bộ file hiện tại để lưu vết.
  • Thư mục theo ngày giúp dễ truy vết khi có nhiều lần xử lý.

Tạo backup chuẩn bằng WP-CLI trước khi có sự cố

Một quy trình restore tốt bắt đầu từ backup tốt. Nếu chỉ backup database mà bỏ thư mục wp-content/uploads, website có thể còn bài viết nhưng mất ảnh. Nếu chỉ backup file mà bỏ database, bài viết và cấu hình biến mất.

Backup database

cd /var/www/sysadminskills.com/public_html
mkdir -p /backup/wordpress/$(date +%F)
wp db export /backup/wordpress/$(date +%F)/database.sql

Output mẫu:

Success: Exported to '/backup/wordpress/2026-05-07/database.sql'.

Backup thư mục upload, plugin và theme

tar -czf /backup/wordpress/$(date +%F)/wp-content.tar.gz wp-content

Nếu site lớn, anh có thể dùng rsync để backup incremental sang máy khác:

rsync -aH --delete /var/www/sysadminskills.com/public_html/wp-content/ backup-server:/data/wp-content/

Tài liệu chính thức wp db export là nguồn nên tham khảo khi cần thêm tham số như --add-drop-table hoặc --tables.

Quy trình khôi phục WordPress bằng WP-CLI

Phần này là quy trình restore cơ bản nhưng đủ an toàn cho phần lớn website nội dung, blog kỹ thuật hoặc landing page doanh nghiệp.

Bước 1: Kiểm tra bản backup

Không restore file backup khi chưa kiểm tra dung lượng và khả năng đọc.

ls -lh /backup/wordpress/2026-05-07/
gzip -t /backup/wordpress/2026-05-07/wp-content.tar.gz
head -n 20 /backup/wordpress/2026-05-07/database.sql

Output mẫu:

-rw-r--r-- 1 root root  85M database.sql
-rw-r--r-- 1 root root 1.8G wp-content.tar.gz

Nếu gzip -t không trả lỗi, file nén có thể đọc được. Nếu database.sql chỉ vài KB trong khi site có nhiều bài, cần nghi ngờ backup lỗi.

Bước 2: Restore database

Di chuyển vào thư mục WordPress rồi import database:

cd /var/www/sysadminskills.com/public_html
wp db import /backup/wordpress/2026-05-07/database.sql

Output mẫu:

Success: Imported from '/backup/wordpress/2026-05-07/database.sql'.

Nếu restore sang staging hoặc domain mới, cần đổi URL:

wp search-replace 'https://sysadminskills.com' 'https://staging.sysadminskills.com' --skip-columns=guid --precise --all-tables

Giải thích:

  • --skip-columns=guid tránh đổi GUID bài viết không cần thiết.
  • --precise xử lý dữ liệu serialized an toàn hơn.
  • --all-tables hữu ích khi plugin tạo bảng riêng.

Bước 3: Restore wp-content

Thông thường không nên ghi đè toàn bộ document root nếu không cần. Hãy restore phần wp-content trước:

cd /var/www/sysadminskills.com/public_html
mv wp-content wp-content.broken.$(date +%F-%H%M)
tar -xzf /backup/wordpress/2026-05-07/wp-content.tar.gz

Nếu backup được tạo từ đúng thư mục WordPress, sau khi giải nén anh sẽ có lại wp-content gồm uploads, themes và plugins.

Bước 4: Sửa quyền file

Sai quyền file là lỗi rất hay gặp sau restore, nhất là khi chạy lệnh bằng root.

chown -R www-data:www-data /var/www/sysadminskills.com/public_html
find /var/www/sysadminskills.com/public_html -type d -exec chmod 755 {} \;
find /var/www/sysadminskills.com/public_html -type f -exec chmod 644 {} \;

Với CentOS/AlmaLinux dùng Apache, user có thể là apache thay vì www-data. Kiểm tra bằng:

ps aux | egrep 'nginx|apache|php-fpm' | head

Kiểm tra sau khi restore

Restore xong chưa có nghĩa là website đã ổn. Cần kiểm tra cả backend, frontend và dữ liệu quan trọng.

Kiểm tra core, plugin và theme

cd /var/www/sysadminskills.com/public_html
wp core version
wp plugin list
wp theme list

Output mẫu:

+----------------------+----------+-----------+---------+
| name                 | status   | update    | version |
+----------------------+----------+-----------+---------+
| wordpress-seo        | active   | none      | 27.5    |
| litespeed-cache      | active   | none      | 7.x     |
+----------------------+----------+-----------+---------+

Kiểm tra URL và permalink

wp option get home
wp option get siteurl
wp rewrite flush

wp rewrite flush giúp tái tạo permalink rules, đặc biệt sau khi restore sang môi trường khác hoặc đổi cấu hình web server.

Xóa cache

Nếu dùng LiteSpeed Cache hoặc plugin cache khác, nên purge cache sau restore:

wp cache flush

Một số plugin có lệnh riêng. Với LiteSpeed Cache, có thể cần purge từ giao diện plugin hoặc endpoint của plugin nếu đã cấu hình.

Lỗi thường gặp khi khôi phục WordPress bằng WP-CLI

Lỗi “Error establishing a database connection”

Nguyên nhân thường là sai thông tin database trong wp-config.php, MySQL chưa chạy, hoặc user database thiếu quyền.

systemctl status mysql
wp config get DB_NAME
wp config get DB_USER
wp db check

Nếu wp db check báo lỗi quyền, cần kiểm tra grant trong MySQL:

mysql -e "SHOW GRANTS FOR 'wp_user'@'localhost';"

Lỗi trắng trang sau restore

Hãy tắt plugin để xác định nguyên nhân:

wp plugin deactivate --all
wp plugin activate wordpress-seo litespeed-cache

Nếu site sống lại sau khi deactivate toàn bộ plugin, kích hoạt lại từng plugin và theo dõi log:

tail -f /var/log/nginx/error.log
tail -f /var/log/php*-fpm.log

Ảnh bị mất hoặc trả 404

Kiểm tra thư mục uploads:

ls -lah wp-content/uploads
find wp-content/uploads -maxdepth 2 -type f | head

Nếu dữ liệu ảnh chưa được restore, bài viết vẫn còn trong database nhưng media file không tồn tại trên disk.

Checklist nghiệm thu sau restore

  • Trang chủ mở được HTTP 200.
  • wp-admin đăng nhập được.
  • Bài viết mới nhất, category và media hiển thị đúng.
  • Không còn lỗi nghiêm trọng trong web server/PHP log.
  • Plugin quan trọng active đúng phiên bản.
  • Permalink hoạt động, không lỗi 404 hàng loạt.
  • Cache đã được xóa sau restore.
  • Maintenance mode đã tắt.
  • Có ghi chú thời điểm restore, bản backup đã dùng và người thực hiện.

Lab thực hành: dựng staging từ backup production

Để luyện tập an toàn, anh có thể dựng một staging site từ backup production:

  1. Tạo virtual host staging.example.com.
  2. Copy source WordPress sang thư mục staging.
  3. Tạo database staging riêng.
  4. Import database bằng wp db import.
  5. Chạy wp search-replace đổi domain production sang staging.
  6. Chặn index staging bằng password hoặc cấu hình noindex.
  7. Kiểm tra bài viết, media, plugin và log lỗi.

Lệnh tham khảo:

cd /var/www/staging.example.com/public_html
wp db import /backup/wordpress/2026-05-07/database.sql
wp search-replace 'https://example.com' 'https://staging.example.com' --skip-columns=guid --precise --all-tables
wp option update blog_public 0
wp rewrite flush

Kết luận

Khôi phục WordPress bằng WP-CLI giúp SysAdmin xử lý sự cố nhanh, có kiểm soát và dễ lặp lại hơn so với thao tác thủ công trong phpMyAdmin hoặc wp-admin. Điểm quan trọng nhất là luôn backup hiện trạng trước khi restore, kiểm tra bản backup, restore database và file theo thứ tự rõ ràng, sau đó nghiệm thu bằng checklist.

Nếu vận hành WordPress nghiêm túc, anh nên định kỳ diễn tập restore trên staging. Backup chỉ thật sự có giá trị khi đã từng khôi phục thành công.

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *