さて、今回もサーバのお話。
筆者のこのブログのサーバは自宅内のサーバ環境ですが、WEBサーバとデータベースサーバは別のサーバに分けております。

つまりセキュリティ対策として直接外部からはアクセスできない内部ネットワークに環境に設置しています。

今回は、そのデータベースサーバのバックアップを予備のデータベースサーバに取得する環境を構築したのでその際の記録を残します。

自宅サーバの場合、どうしてもサーバのメンテナンス(※各種脆弱性対応や、カーネル更新時の再起動、データベースバージョンアップなどで一時的に停止等)をせざるを得ないときにでもサーバを閲覧不可の状態にさせずに済みます。

でも、言うほどアクセス数のあるサイトではないですけどもね笑

サーバ構成

それでは現状のサーバ構成ですが、以下になります。

WEBサーバ:OS/Ubuntu Server 19.10 (※WEB:OpenLiteSpeed 1.7.0RC)
DBサーバ本:OS/Linux Mint 19.2 (※DB:mariaDB10.1.44)
DBサーバ予:OS/Linux Mint 19.3 (※DB:mariaDB10.1.44)

$ mysql -V
mysql  Ver 15.1 Distrib 10.1.44-MariaDB,
for debian-linux-gnu (i686) using readline 5.2

DBサーバ本番

本番サーバから定期的に以下のシェルでDBのダンプのバックアップを取得し、scpでダンプを予備機に転送しようと思います。
sudoも使うのでその際はexpectを使ってパスワード入力対応します。

まず、DBのダンプデータを取得するコマンドは以下。

mysqldump --all-databases -uroot -pXXXXXXXX > /tmp/mariadb_backup.sql

SCPで予備機に転送するコマンドは以下となります。

/usr/bin/scp /tmp/mariadb_backup.sql akkun@xxx.xxx.xxx.xxx:/tmp/

結果、こうなります。

#!/bin/bash
PW="xxxxxxxx"
mysqldump --all-databases -uroot -pXXXXXXXX > /tmp/mariadb_backup.sql
expect -c "
set timeout 5
spawn /usr/bin/scp /tmp/mariadb_backup.sql akkun@xxx.xxx.xxx.xxx:/tmp/
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"
#
sleep 1m
rm /tmp/mariadb_backup.sql

DBサーバ予備

本番サーバから転送されたダンプファイルを受け取って、データベース更新後にリネームするスクリプトを組んでいきます。

$ sudo mysql -uroot -pXXXXXXXX < /tmp/$DBFILE

結果、こうなります。

#!/bin/bash
#
DATE=`date +"%Y%m%d%H%M"`
#echo $DATE
#
PW="xxxxxxxxx"
DBFILE="mariadb_backup.sql"
LOGFILE="dbimport.log"
sleep 1m
#
mysql -uroot -pXXXXXXXX < /tmp/$DBFILE
#
sleep 30s
mv /tmp/$DBFILE /tmp/$DATE.$DBFILE
sleep 5s
echo $DATE ' OK!!' >> /tmp/$LOGFILE

WordPressのデータベースバックアップについては、
WordPressのプラグインなどでも対応可能ですので、また別の機会にプラグイン関係を紹介します。

WordPressのデータベースサーバを予備に切替えるには

wordpressの設定ファイルの一部を修正することで切替が可能になります。
設定ファイルは、wp-config.phpとなり、以下を修正します。

/** MySQL のホスト名 */
#define( 'DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock' );

define( 'DB_HOST', 'xxx.xxx.xxx.xxx:/var/run/mysqld/mysqld.sock' );

また予備側となるDBサーバの設定ファイルも外部からの接続を許可するよう修正が必要です。設定ファイルは以下。

$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

bind-addressをコメントアウトするか、アクセスするサーバのIPアドレスを記載。

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1