Thông thường, khi mình muốn di chuyển hoặc sao lưu một website sử dụng WordPress thì sẽ sử dụng plugin Duplicator. Tuy nhiên, có một số trường hợp server bị lỗi, website không truy cập trực tiếp được hoặc bạn muốn sao lưu lại cả một loạt site đang hoạt động trên server thì sao?

Mình có theo dõi các comment trong bài giới thiệu HocVPS Script hoặc trong chuyên mục Hỏi đáp thì thấy nhu cầu này có thật và cũng khá cần thiết. Do đó, mình có viết một chương trình bash script ngắn, sẽ tự động sao lưu lại website WordPress bạn muốn (bao gồm cả files và database).

HocVPS Script Plugin – Backup All WordPress Sites

Để sử dụng bạn chỉ cần sử dụng dòng lệnh sau:

wget https://hocvps.com/scripts/plugin/backupallwp.sh && chmod +x backupallwp.sh && ./backupallwp.sh

Bạn cần cài đặt zip trước nếu chưa cài: yum -y install zip

Sau đó chương trình sẽ quét toàn bộ website đang hoạt động cùng với thông tin database MySQL để bạn có thể lựa chọn sao lưu. Cuối cùng toàn bộ dữ liệu sẽ được lưu trong thư mục /home/domain.com/private_html/backupallwp với đường link direct để tải về máy hoặc chuyển sang VPS khác.

Lưu ý: 

  1. Để download trực tiếp file về VPS, hãy sử dụng lệnh wget link
  2. Để giải nén bạn hãy sử dụng lệnh unzip file.zip
  3. Toàn bộ database được lưu lại thành 1 file *.SQL, để import bạn hãy sử dụng lệnh mysql -u username -ppassword databasename < database.sql. Lưu ý thay lại username, password, databasename và tên file database

Chương trình này thiết kế để hoạt động tốt với HocVPS Script và WordPress. Tuy nhiên bạn có thể điều chỉnh lại thoải mái cho phù hợp với control panel đang sử dụng.

Trước mắt mình cứ viết dạng plugin như thế này đã, sau này có tích hợp vào HocVPS Script hay không thì sẽ tính sau 😀

Code bash script

#!/bin/bash
# HocVPS Script Plugin - Backup All WordPress Sites
# -------------------------------------------------------------------------
# Description: Create a backup of your WordPress files and database.
# Copyright (c) 2015 Luan Tran <https://hocvps.com>
# -------------------------------------------------------------------------
# Run: wget https://hocvps.com/scripts/plugin/backupallwp.sh && chmod +x backupallwp.sh && ./backupallwp.sh
# -------------------------------------------------------------------------

clear
printf "=========================================================================\n"
printf "         HocVPS Script Plugin - Backup All WordPress Sites\n"
printf "=========================================================================\n"

#Server information
main_site=`cat /etc/hocvps/scripts.conf | grep mainsite | cut -d \" -f 2`
port=`cat /etc/hocvps/scripts.conf | grep priport | cut -d \" -f 2`
serverip=`cat /etc/hocvps/scripts.conf | grep serverip | cut -d \" -f 2`

#Backup path
backup_path=/home/$main_site/private_html/backupallwp
mkdir -p $backup_path

#Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} #Domain name
		printf "\n***Found domain $domain\n"
		
		if [ -f "/home/$domain/public_html/wp-config.php" ]; then
			WPDBNAME=`cat /home/$domain/public_html/wp-config.php | grep DB_NAME | cut -d \' -f 4`
			WPDBUSER=`cat /home/$domain/public_html/wp-config.php | grep DB_USER | cut -d \' -f 4`
			WPDBPASS=`cat /home/$domain/public_html/wp-config.php | grep DB_PASSWORD | cut -d \' -f 4`
			
			echo "$domain is WordPress with database: $WPDBNAME"
			
			read -r -p "Do you want to backup $domain? [y/N] " response
			case $response in [yY][eE][sS]|[yY])
				echo "- Backup database: $WPDBNAME"
				mysqldump -u $WPDBUSER -p$WPDBPASS $WPDBNAME > /home/$domain/public_html/database-$(date +"%Y-%m-%d").sql
				echo "- Backup files: $domain"
				zip -r $backup_path/$domain-$(date +"%Y-%m-%d").zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
				rm -rf /home/$domain/public_html/database-$(date +"%Y-%m-%d").sql #Remove database file
				echo "- Done, database and files are saved to $backup_path/$domain-$(date +"%Y-%m-%d").zip"
				echo "- Download link: http://$main_site:$port/backupallwp/$domain-$(date +"%Y-%m-%d").zip or http://$serverip:$port/backupallwp/$domain-$(date +"%Y-%m-%d").zip"
				;;
			    *)
			        echo "Okay, don't backup"
			        ;;
			esac
			
		else
			echo "$domain is not WordPress"
		fi
		
	fi
done

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

69 Comments

  1. TRI 28 comment

    Chào anh em,
    Mình sử dụng câu lệnh trên để sao lưu web thì báo như sau:

    ***Found domain domain.vn
    domain.vn is WordPress with database:
    Do you want to backup domain.vn? [y/N] y
    – Backup database:
    Usage: mysqldump [OPTIONS] database [tables]
    OR mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]
    OR mysqldump [OPTIONS] –all-databases [OPTIONS]
    For more options, use mysqldump –help
    – Backup files: domain.vn
    – Done, database and files are saved to /home//private_html/backupallwp/domain.vn-2020-04-30.zip
    – Download link: http://:/backupallwp/domain.vn-2020-04-30.zip or http://:/backupallwp/domain.vn-2020-04-30.zip
    [root@domain home]#

    Sau backupallwp giải nén thấy file .sql mà chỉ có 0 kb. và không sử dụng dc?
    Nhờ anh em xem không biết sao bị như vậy. Lúc trước có trang web khác thì không bị.
    Xin cảm ơn

  2. Long 7 comment

    Mình đang muốn chuyển vps. Vps cũ đang cài hocvps và có 1 website. Nhờ ad hướng dẫn restore file backup lên vps mới nhé. Mình đã backup thành công theo hướng dẫn ở bài viết này

  3. Thái An 3 comment

    Em xin phép lạc đề chút, website e dùng VPS OVH cài HocVPS Script. Đang dùng ngon lành 1 thời gian rất dài không hề có bất kỳ 1 vấn đề gì cả. Tự nhiên giờ nó thông báo : Kết nối của bạn không phải là kết nối riêng tư. Vào phần nâng cao cũng không có cho phép truy cập bảo mật kém. Mà website e cài SSL theo hướng dẫn của HocVPS trước nay vẫn dùng rất tốt. Em truy cập thử theo dạng IP:port cũng không thể truy cập vào quản trị HocVPS. Từ ZOC Terminal vẫn vào đc ạ.

    – Cho e hỏi lỗi này là bị sao ạ, có phải do VPS không ạ? E reboot lại vẫn k được.
    – Đã ai bị trường hợp này, và cách giải quyết thế nào mọi người hướng dẫn e với ạ. E hơi gà nên hỏi gì k phải mong các anh chị bỏ qua giúp ạ.

      1. Thái An 3 comment

        @Việt Phương. Chuẩn rồi ạ. Khi cài e không để ý cái gia hạn sau 90 ngày này. 1 dòng lệnh /opt/letsencrypt/certbot-auto renew –pre-hook “service nginx stop” –post-hook “service nginx start” là xong rồi ạ. Thanks Mod. <3

  4. Tuấn 1 comment

    Cảm ơn bác, em mới dùng cái hocvps script cài cho cái VPS bên vultr vừa mua, chạy ngon. Giờ thêm cái Backup này nữa

  5. Cường Đặng 2 comment

    Xin Chào ! Admin ơi
    Giúp mình với Mình đã cài hocvps và WP hoàn thiện hết rồi , mình dựa theo IP của VPS đễ làm website trên WP , bây giờ mình trỏ tên miền về VPS của Vultr thì không được ạ ! cứ gỏ tên miền đấy nó lại nhảy ra cái IP của VPS bây giờ phải làm như thế nào mới đc vậy , Mong Admin trả lời giúp nhé ! Xin Cảm ơn.

    1. Việt Phương Moderator

      Bạn vào wp-admin sửa Site URL và Home URL đi. Lúc cài WP trên web bạn truy cập bằng IP chứ không phải domain đúng không

        1. Việt Phương Moderator

          Bình thường nhé bạn. Bạn thử bằng trình duyệt khác là okie

  6. Lượng 3 comment

    VPS có 3 site, nhưng chỉ backup domain chính là sao Luân ?
    Có cách nào backup toàn bộ không ?

      1. Lượng 3 comment

        Xin lỗi, mình chưa check foder khác. Có rồi. Nhưng trên cái VPS khác mình làm tương tự, khi chạy lệnh backup thì được thông báo này: { /root/backup.sh: line 34: zip: command not found }
        VPS này chạy hocvps1.1 .

  7. thành 1 comment

    Anh ơi cho em hỏi với trong home trên host của em cái file cache.tar.gz là file gì vậy ạ, xóa đi có ảnh hưởng gì không ạ em cài wordpress ạ. Em cảm ơn nhiều

    1. Việt Phương Moderator

      File ý nằm ngoài thư mục web mà ở ngay thư mục home à? Mình cũng không rõ lắm. Có thể do ứng dụng cache nào đó của bạn tạo ra?

  8. Trung Nguyễn 8 comment

    e dùng lệnh WGET để dowload bản backup từ vps cũ sang vps mới tạo . thì nó báo

    HTTP request sent, awaiting response… 401 Unauthorized
    Authorization failed.

    e dung vultr . xin add chỉ cách khác phục với

  9. zmupnguyen 56 comment

    Hi ad,

    Sau khi bk tất cả db gom lại thành một file. Vậy sau khi giải nén ra nó co tách ra từng file riêng ko, hay vẫn là một file vậy ad. Vì ko nhiều khi chỉ có một web cần restore mà nguyên cục thì hơi phiền chút.

    Tks ad

      1. zmupnguyen 56 comment

        Do mình đọc thấy cái này nè ad, nên mình tưởng là bưng nguyên server thành một file

        Toàn bộ database được lưu lại thành 1 file *.SQL, để import bạn hãy sử dụng lệnh mysql -u username -ppassword databasename < database.sql. Lưu ý thay lại username, password, databasename và tên file database

  10. Tenno 3 comment

    Mình chạy lệnh backup có báo dòng này:

    mysqldump: Got error: 1146: “Table ‘123giaohang.smackcsv_line_log’ doesn’t exist” when using LOCK TABLES

    Không biết có ảnh hưởng gì đến bản backup không Luân nhỉ?

      1. Tenno 3 comment

        ***Found domain xxx.com
        xxx.com is WordPress with database: DDD
        Do you want to backup xxx.com? [y/N] y
        – Backup database: DDD
        mysqldump: Got error: 1146: “Table ‘DDD.smackcsv_line_log’ doesn’t exist” when using LOCK TABLES
        – Backup files: xxx.com
        – Done, database and files are saved to
        – Download link:

        Nội dung đầy đủ nè Luân, vẫn có file backup đầy đủ, nhưng không biết lỗi 1146 có ảnh hưởng gì khi restore không?

        1. Luân Trần Admin

          Cái này mình lại không check được lỗi rồi, bạn thử trực tiếp bằng cách import xem sao vậy?

  11. NguyenHao 6 comment

    Luân hướng dẫn thêm phần này với
    Cài đặt thì dùng lệnh như Luân hướng dẫn rồi
    Nhưng từ lần sau vào VPS mình muốn backup lại bản mới , thì dụng lệnh nào Luân Trần
    thansk

  12. Kevin 6 comment

    Nếu mình xài hosting wordpress (shared hosting) ko có shell, và mình cũng có 1 VPS riêng dùng chỉ để quản lý file.
    Mình muốn backup WP sang VPS kia thì có làm đc ko Luân?

    1. Luân Trần Admin

      Trường hợp này không được nhé bạn, hãy dùng những plugin backup lên cloud ví dụ UpdraftPlus ấy.

  13. Brian 5 comment

    Cho mình hỏi chút là hocvps script đã tích hợp plugin này chưa?
    Mình hỏi vậy vì trong menu có tự động sao lưu, không biết đó có phải là plugin này ko ?

  14. vuong manh 13 comment

    Loading lookup modules from /usr/lib64/exim/4.72-7.el6/lookups
    Loaded 0 lookup modules
    LOG: MAIN
    <= root@uxz.biz U=root P=local S=281
    [root@uxz ~]# Loading lookup modules from /usr/lib64/exim/4.72-7.el6/lookups
    Loaded 0 lookup modules
    delivering 1Zj80O-0003Bo-2z
    Connecting to aspmx.l.google.com [2a00:1450:4010:c08::1a]:25 … connected
    SMTP<> EHLO uxz.biz
    SMTP<> STARTTLS
    SMTP<> EHLO uxz.biz
    SMTP<> MAIL FROM: SIZE=1313
    SMTP>> RCPT TO:
    SMTP>> DATA
    SMTP<< 250 2.1.0 OK d11si17331242lfe.173 – gsmtp
    SMTP<< 250 2.1.5 OK d11si17331242lfe.173 – gsmtp
    SMTP<> writing message and terminating “.”
    SMTP<> QUIT
    LOG: MAIN
    => admin@hocvps.com R=dnslookup T=remote_smtp H=aspmx.l.google.com [2a00:1450: 4010:c08::1a] X=UNKNOWN:ECDHE-RSA-AES128-GCM-SHA256:128
    LOG: MAIN
    Completed

    em chạy lệnh nó báo vậy bác ạ

    1. Luân Trần Admin

      Mình nhận được mail đó, nhưng trong Spam. Vậy nguyên nhân ở đây do bạn cấu hình chưa chuẩn rồi. Giờ bạn cài plugin WP Mail SMTP mà sử dụng.

      1. vuong manh 13 comment

        bác ơi. em test thử plug in contact form 7 thì ko thấy nhận đc email ạ. ko hiểu lỗi gì ở đây bác nhỉ

  15. vuong manh 13 comment

    chào bác. em có sử dụng script hocvps. Em muốn chạy plugin contact form 7 trên wordpress có cách nào ko bác nhỉ.
    em test thử thì ko thấy nó gửi email về ạ.

    1. Luân Trần Admin

      Đầu tiên bạn cần check xem VPS có block sendmail không với lệnh bên dưới:
      echo "Subject: test" | /usr/lib/sendmail -v admin@hocvps.com

  16. nam duy 110 comment

    Mình vô link duoc cung cap de tai ve nhưng không có file nào đc tạo Luân ơi.
    domain.com:priport/backupallwp/tenmienkjhac.com-2015-08-13.zip
    Lúc chạy script thì nó báo như sau:
    vidu.com is WordPress with database: ghepcard
    Do you want to backup ghepcard.com? [y/N] y
    – Backup database: vd
    – Backup files: vidu.com
    ./backupallwp.sh: line 42: zip: command not found
    – Done, database and files are saved to

      1. Đặng Tiến Thịnh 22 comment

        Anh luân cho em hỏi em có site phim mã nguồn wordpress hôm nay đổi vps thế là sau khi cài đặt lại thì các link bài viết đều lỗi 404 hết , em thấy thachpham bảo phải cập nhật lại permalink em cũng cập nhật lại luôn nhưng vẫn thế . chỉ để chế độ Default link dạng http://tensite/?p=123 là hoạt động bình thường , các tùy chọn bên dưới tất cả đều bị lỗi 404 hết, em đã phân quyền và xóa cache của server rồi mà không ăn thua . em dùng webserver nginx . anh xem có cách nào hay có rule nào cho vào file .conf của tên miền để cải thiện không 🙁

  17. maitrinh 6 comment

    Cám ơn bạn plugins rất hay.. Mình viết thêm code php rùi tạo contab cho nó tự sao lưu lên google drive rất tốt. Không còn lo mất dữ liệu nữa

  18. nguyen trung 15 comment

    em vừa làm như bác bảo thì nó báo nhiều lỗi như vầy: WARNING: Database error Table ‘./thuocchuabenh_vn/wp_wfLogins’ is marked as crashed and last (automatic?) repair failed for query SHOW CREATE TABLE `wp_wfLogins`. và ERROR: Step aborted: too many attempts!,,, ERROR: Job has ended with errors in 229 seconds. You must resolve the errors for correct execution.
    sửa sao đây bác

  19. nguyen trung 15 comment

    có phải sẽ chọn như vầy không bác:Check All > repair table, rồi lại chọn check all > optimize

  20. nguyen trung 15 comment

    Chào bạn Luân. Mình đang dùng vps linux cho wordpress. bình thường mình vẫn backup bằng Plugin Backwpup nhưng sau khi nhà cung cấp reboot thì bị lỗi backup / thông báo : WARNING: Database error Table ‘./thuocchuabenh_vn/wp_wfLogins’ is marked as crashed and last (automatic?) repair failed for query SHOW CREATE TABLE `wp_wfLogins`. không biết nên sửa thế nào. giúp mình với.

  21. Steve Diện 21 comment

    Mình toàn dùng bash tự viết để zip file + mysqldump kết hợp với dropbox uploader sripts + cron job
    Luân cho mình hỏi cái bash/shell có thể sử dụng toán tử cho nó được không, kiểu cộng trừ ngày tháng, mình muốn nó tự xoá các file cũ đi chỉ giữ lại 3 ngày gần nhất

    1. Luân Trần Admin

      Tự viết được thế này ngon quá rồi 😀
      Với bash sử dụng toán tử ok hết nhé, bạn lên google tìm câu lệnh của nó là ra ngay.