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

Your email address will not be published. Required fields are marked *

52 Comments

  1. 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.

  2. 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.

  3. 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

  4. 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

  5. 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

  6. nam duy 70 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 21 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 🙁

  7. 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

  8. 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ỉ

  9. 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 ?

  10. 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.

  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. 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?

  13. zmupnguyen 45 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 45 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

  14. Trung Nguyễn 3 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

  15. 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?

  16. 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 .