プラグインを使わずにWordPressをバックアップする方法

プラグインを使用せずWordpressをバックアップする方法です。

バックアップ対象

私がWordPressをバックアップする場合は、以下のデータをバックアップしています。

定期的にバックアップ

  • WordPressディレクトリ
  • WordPress用データベース

バックアップのタイミングとしては、記事を投稿した後にバックアップを行います。

記事を投稿した後に毎回バックアップを手動で行うのはとても大変なので、/etc/crontabあたりに登録して定期的にバックアップを行うという運用が現実的でしょう。

/etc/crontabへの登録方法についても、後ほど解説していきますので参考にしてみてください。

ストレージの容量に余裕が無い場合は、WordPressディレクトリ全体を毎回バックアップするのでは無く、画像データなどが保存されている「wordpressディレクトリ/wp-content/uploads/」だけをバックアップでも良いと思います。

変更がある・あった場合にバックアップ

  • WordPressディレクトリ全体
  • WordPress用データベース
  • Webサーバ設定ファイル
  • SSL/TLS証明書・秘密鍵

WordPressディレクトリ全体とWordPress用データベースは、以下の作業を行う場合にバックアップを実行しておきましょう。

  • WordPressのバージョンアップ
  • プラグインやテーマのバージョンアップ
  • WordPressへのカスタマイズを実施

Webサーバの設定ファイルとSSL/TLS証明書・秘密鍵については、Webサーバの設定変更やSSL/TLS証明書の更新があったタイミングでバックアップを行いましょう。

バックアップ方法

下記環境のWordPressを例にとって、バックアップの仕方を説明していきます。

  • OS: UbuntuServer 22.04
  • WordPressディレクトリ: /usr/share/nginx/wordpress
  • データベース名: wpdb
  • データベースのユーザ名: wpadmin
  • データベースのパスワード: passw0rd
  • Webサーバ: nginx
  • SSL/TLS証明書: Let's Encryptで取得

データベース名、ユーザ名、パスワードを忘れてしまった場合は、WordPressの設定ファイルである「wp-config.php」に記述されているので、確認してみてください。

WordPressディレクトリ全体のバックアップ

WordPressのディレクトリは、「tar」コマンドでアーカイブしてバックアップをするのが簡単です。

$ sudo tar cfvz wordpress_$(date +%Y%m%d-%H%M%S).tar.gz -C /usr/share/nginx ./wordpress

これでコマンドを実行したディレクトリに、WordPressのディレクトリのバックアップが作成されます。

WordPress用データベースのバックアップ

WordPress用のデータベースは「mysqldump」コマンドでバックアップすることができます。

コマンドを実行するとパスワードを聞かれますので、データベース管理ユーザのパスワードを入力してください。

$ mysqldump  -u データベース管理ユーザ -p データベース名 > データベース名_バックアップ日時.sql

パスワードを事前入力したい場合

データベース管理ユーザのパスワードを事前に入力する場合は、-pオプションの後にスペースを入れずに、パスワードを入力します。

$ mysqldump  -u データベース管理ユーザ -pパスワード データベース名 > データベース名_バックアップ日時.sql

パスワードに記号等が入っていて、そのままではエラーになってしまう場合は、シングルクォーテーションでパスワードを囲ってください。

$ mysqldump  -u データベース管理ユーザ -p'パスワード' データベース名 > データベース名_バックアップ日時.sql

データベースのバックアップ例

実際にバックアップを行ってみます。

コマンドを実行すると「Enter password:」と表示されるので、データベース管理ユーザのパスワードを入力してください。

$ mysqldump --single-transaction -u wpadmin -p wpdb > wpdb_$(date +%Y%m%d-%H%M%S).sql
Enter password: 

パスワードを事前に入力する場合はこんな感じになります。

$ mysqldump --single-transaction -u wpadmin -ppassw0rd wpdb > wpdb_$(date +%Y%m%d-%H%M%S).sql

パスワードが「pass!w0rd」のように、記号が入っている場合はシングルクォーテーション「'」で囲ってあげます。

$ mysqldump --single-transaction -u wpadmin -p'pass!w0rd' wpdb > wpdb_$(date +%Y%m%d-%H%M%S).sql

Webサーバ設定ファイル

webサーバの設定ファイルをバックアップする方法としては、対象のファイルをcpコマンドなどでコピーしておけば良いでしょう。

今回の環境はWebサーバがnginxなので、こんな感じでnginxの設定ファイルをバックアップしておきます。(xxx部分は適宜読み替えてください)

$ sudo cp -p /etc/nginx/conf.d/xxxx.conf /バックアップ先ディレクトリ/xxxx.conf_$(date +%Y%m%d-%H%M%S)

SSL/TLS証明書・秘密鍵

Let's EncryptでSSL/TLS証明書を取得している場合は、/etc/letsencryptディレクトリをまるごとバックアップします。

$ sudo tar cfvz /バックアップ先ディレクトリ/letsencrypt_$(date +%Y%m%d-%H%M%S).tar.gz -C /etc ./letsencrypt

Let's EncryptでSSL/TLS証明書を取得している場合は、バックアップしてある証明書をリストアするよりも、新たに証明書を取得し直したほうが早いかもしれません。

Let's Encrypt以外でSSL/TLS証明書を取得している場合

nginxの設定ファイルで設定しているSSL/TLS証明書と秘密鍵をバックアップしておきましょう。

この辺の設定で指定されているファイルがバックアップ対象となります。

  • ssl_certificate (SSL/TLS証明書)
  • ssl_certificate_key (秘密鍵)

もし、他にも設定しているものがあればそれも合わせてバックアップしておきましょう。

バックアップデータの保管場所について

バックアップしたデータはバックアップを取得したサーバ内だけでは無く、別のサーバやUSBメモリ等といった物理的に別の場所にも保管しておくことをおすすめします。

これは、サーバの環境が壊れてしまったり、誤って削除してしまった場合にも、別の場所にバックアップデータが保管されていれば、そのデータからリストアすることが出来るためです。

crontabで定期的にバックアップを取得

毎回手作業でバックアップを行うのはとても面倒ですし、うっかりと忘れてしまうこともあると思います。

ですが、crontabに登録することで自動でバックアップを取得することができます。

今回はバックアップ用のスクリプトを作成して、それを/etc/crontabに登録して定期実行させる方法について説明していきます。

バックアップ用スクリプトを作成

crontabに直接コマンドを記述しても良いのですが、バックアップ対象の追加や設定変更が簡単に出来るように、バックアップ用のスクリプトを作成して、それをcrontabに登録して定期的に実行するようにします。

バックアップデータ格納ディレクトリ作成

ユーザのホームディレクトリに、バックアップデータを格納するためのディレクトリをWP_Backupという名前で作成します。

$ cd
$ mkdir WP_Backup

バックアップ用スクリプト作成

バックアップを実行するためのスクリプトを作成していきます。

$ cd WP_Backup
$ vi wordpress_bk.sh
スクリプトの内容

設定内容はご自分の環境に合わせて、適宜読み替えてください。

データのバックアップは、上のバックアップ方法で説明した「tar」と「mysqldump」コマンドを記述しています。

古いバックアップデータを自動的に削除するために、「find」を用いて作成日時が指定した日数よりも古いバックアップデータを検索し削除するコマンドを記述しています。

  • 「-mtime +日数」作成日時より何日古いデータを検索するか指定
  • 「-exec rm {} \;」 見つかったデータを削除

今回のスクリプト例では「-mtime +3」としているので、バックアップデータを取得してから3日経過したものが削除対象となります。

「-mtime +3」部分の数字を変更することでバックアップデータを何日保存しておくかを設定することができます。

バックアップデータを検索して削除する部分は、行頭に「#」が付いているのでコメント扱いになっていますが、削除機能の動作確認が完了するまではそのままコメントとしておいてください。

バックアップデータの削除機能の動作確認が問題なく完了した後に、行頭「#」を削除して機能を有効化させてください。

手動で古いバックアップデータを削除する運用の場合は、このままコメント状態にしておきます。

#!/bin/bash

### WordPress Directory backup
tar cfvz /home/tamohiko/WP_Backup/wordpress_$(date +%Y%m%d-%H%M%S).tar.gz -C /usr/share/nginx ./wordpress

### WordPress DB backup
mysqldump --single-transaction -u wpadmin -ppassw0rd wpdb > /home/tamohiko/WP_Backup/wpdb_$(date +%Y%m%d-%H%M%S).sql

### Old Backup Data Delete Setting
#find /home/tamohiko/WP_Backup -name "wordpress_*.tar.gz" -type f -mtime +3 -exec rm {} \;
#find /home/tamohiko/WP_Backup -name "wpdb_*.sql" -type f -mtime +3 -exec rm {} \;
パーミッションの設定

作成したスクリプトのパーミッションを設定します。

$ chmod 744 wordpress_bk.sh

スクリプト動作確認

作成したスクリプトの動作確認を行います。

バックアップデータ取得確認

作成したスクリプトを実行して、バックアップデータが取得出来ることを確認します。

今回は/etc/crontabに登録してrootユーザで定期的にバックアップを行う予定なので、sudoを使ってスクリプトを実行します。

$ sudo ./wordpress_bk.sh

スクリプト実行後にバックアップデータが取得されていることを確認してください。

バックアップデータ削除確認
findの設定を間違えてしまうと関係のないデータも検索にマッチして一緒に削除されてしまいますので、十分に注意して動作確認を行ってください。

バックアップしたデータを自動的に削除する機能の確認を行うために、「-mtime +日数」部分で指定した日数分以上のバックアップデータを取得してから動作確認を行う必要があります。

バックアップデータの取得は、スクリプトを手動で実行しても良いですし/etc/crontabに設定して定期実行させても構いません。

削除されるバックアップデータの確認

「-exec rm {} \;」部分を除いてfindコマンドとして実行し、削除しようと想定しているバックアップデータだけが表示されることを確認してください。

作成したスクリプトの動作に問題が無いかを確認するために、実行するコマンドはスクリプトから「-exec rm {} \;」部分を除いてコピーして実行してください。

$ sudo find /home/tamohiko/WP_Backup -name "wordpress_*.tar.gz" -type f -mtime +3
$ sudo find /home/tamohiko/WP_Backup -name "wpdb_*.sql" -type f -mtime +3
バックアップデータの削除確認

削除しようとしているバックアップデータだけが問題無く表示されていることが確認できたら、「-exec rm {} \;」部分をつけてコマンドを実行して古いバックアップデータだけが削除されることを確認してください。

作成したスクリプトの動作に問題が無いかを確認するために、実行するコマンドはスクリプトからコピーして実行してください。

$ sudo find /home/tamohiko/WP_Backup -name "wordpress_*.tar.gz" -type f -mtime +3 -exec rm {} \;
$ sudo find /home/tamohiko/WP_Backup -name "wpdb_*.sql" -type f -mtime +3 -exec rm {} \;
バックアップデータ削除機能の有効化

問題なくバックアップデータの削除が確認できたら、バックアップ用スクリプトを編集し行頭の「#」を削除して、バックアップデータの機能を有効化してください。

/etc/crontabに設定

/etc/crontabへスクリプトを定期的に実行する設定を追加します。

$ sudo cp -p /etc/crontab /etc/crontab_$(date +%Y%m%d-%H%M%S)
$ sudo vi /etc/crontab

毎朝4:30分にバックアップスクリプトを実行させる場合は、下記のように設定します。

30 4 * * * root /home/tamohiko/WP_Backup/wordpress_bk.sh

/etc/crontabの設定方法については、下記のページで解説しています。

https://www.server-memo.net/tips/etc-crontab.html

スケジュールの設定方法はこちらで解説しています。

https://www.server-memo.net/tips/crontab.html#toc11

バックアップデータのリストア

バックアップデータからのリストア方法を説明します。

間違ってリストアしてしまうと取り返しがつきませんので、リストア作業は必ずバックアップを取得してから行いましょう!

WordPressデータのリストア方法

バックアップデータを解凍して所有者をnginxに変更します。

※ %Y%m%d-%H%M%Sは年月日-時分秒を表しています。

$ sudo tar xzfv wordpress_%Y%m%d-%H%M%S.tar.gz 
$ sudo chown -R nginx:nginx wordpress

あとは解凍したデータから必要なものを選んで、既存のデータと置き換えてリストアしてください。

WordPressのデータをまるごとリストアするのであれば、解凍したディレクトリを既存のディレクトリと置き換えてください。

$ sudo mv wordpress /usr/share/nginx/wordpress

データベースのリストア方法

データベースのリストアにはmysqlコマンドを使用します。

$ mysql -u データベース管理ユーザ -p データベース < バックアップデータ

今回取得したバックアップからリストアする場合は下記のようになります。

$ mysql -u wpadmin -p wpdb < wpdb_%Y%m%d-%H%M%S.sql

新環境でデータベースが作成されていない場合は、最初にデータベースを作成してからリストアを行う必要があります。

リストアテストを行っておきましょう

取得したデータで本当にWordPressがリストアできるか、別のサーバにWordPressをインストールしてバックアップデータからリストアできるかの確認を行うことを強くおすすめします。

別サーバにWordPressインストールしてテスト環境を用意するのは面倒だと思いますが、WordPressに問題が発生してリストアを緊急に行うことになった場合も、一度リストア作業を経験しておけば焦らずに作業を行うことができますよ。

コメント

タイトルとURLをコピーしました