Grow up

生活とプログラミング

Ubuntu 18.04 LXC SQL Server 定期的な完全バックアップを自動化する方法

f:id:knkomko:20200802235455j:plain

はじめに

無料で利用できる SQL Server Express にはエージェントというジョブを定期的に実行するコンポーネントが無いため、別の方法で行う必要があります。

今回は UNIX系のOSにおいて定期的にジョブを実行する cron を使用してバックアップを作成します。

SQL Server のバックアップを作成する際に Transact SQL を使用するため、事前に
sqlcmd (SQL Server コマンドラインツール) のインストールが必要になります。

UbuntuSQL Server をインストールする場合はこちら。
knkomko.hatenablog.com

Ubuntu に sqlcmd をインストールする場合はこちら。
knkomko.hatenablog.com

実行環境

Ubuntu 18.04 LXC
SQL Server 2019

1. cron プロセスの開始

cron プロセスを開始します。

sudo service cron start

cron プロセスの状態を確認します。

sudo service cron status

プロセスが開始できていると running と表記されます。
f:id:knkomko:20200731212356p:plain:w550

2. SQLファイルの作成

例としてemployee データベースの完全バックアップを作成します。
今回は backup.sql としてSQLファイルを作成します。

vim /home/ubuntu/test/backup.sql

以下のクエリでデータベースからemployee.bakという名前でバックアップファイルを作成します。

/home/ubuntu/test/backup.sql

BACKUP DATABASE [employee] TO  DISK = N'/home/ubuntu/test/employee.bak' WITH NOFORMAT, NOINIT,  NAME = N'employee-Full Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO                                                        
3. SHファイルの作成

SQLファイルを実行するSHファイルを作成します。
今回は backup.sh として作成します。

vim /home/ubuntu/test/backup.sh 

sqlcmd でSQL Serverに接続をした後に手順2で作成したSQLファイルを実行します。
cronでsqlcmdを実行するには絶対パスで指定する必要がありました。

/home/ubuntu/test/backup.sh

Execute backup query.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Pa$$w0rd -i /home/ubuntu/test/backup.sql

# DB backup file name is "employee_YYYYMMdd_HHmmss.bak".
mv /home/ubuntu/test/employee.bak /home/ubuntu/test/employee_`date "+%Y%m%d_%H%M%S"`.bak

sqlcmd の絶対パスの確認には which コマンドを使用しました。

which sqlcmd

以下の記事が参考になりました。
qiita.com

4. cron 設定ファイルの作成

ひな型となる cron 設定ファイルをコピーして作成します。
今回は crontestというファイル名にしました。
cron 設定ファイルに拡張子はありません。

sudo /etc/crontab /etc/cron.d/crontest

管理者権限で vim を起動して編集を行います。

sudo vim /etc/cron.d/crontest

初期は以下のような内容だと思います。

/etc/cron.d/crontest

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.                                                                                                                                                                                                                                                   

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin                                                                                                                                                                                                         

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

今回は毎週、日曜日の午前0時にSHファイルを実行するようにします。
またSHファイルを実行した際の標準出力、標準エラー出力の内容をbackup.logとして作成しています。

00 00   * * MON   root   /home/ubuntu/test/backup.sh >> /home/ubuntu/test/backup.log 2>&1

定期実行の一文を追記した状態が以下の内容になります。

/etc/cron.d/crontest

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.                                                                                                                                                                                                                                                   

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin                                                                                                                                                                                                         

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


00 00   * * MON   root   /home/ubuntu/test/backup.sh >> /home/ubuntu/test/backup.log 2>&1

時刻や日付の設定は以下の記事が参考になりました。
nigimitama.hatenablog.jp

ここでは m h dom mon dow user command の書式に注意が必要です。
以下の書式に従わないと cron がエラーとなり実行されませんでした。

[m] \s [h] \t [dom] \s [dom] \s [mon] \s [dow] \t [user] \t [command]

制御文字 \s は半角空白、\t はタブを表しています。

5. 確認

設定時刻にSQLファイル実行時のログとデータベースのバックアップファイルが作られています。
f:id:knkomko:20200802232254p:plain:w550

ログファイルに標準出力の内容が記載されていることも確認できました。
f:id:knkomko:20200802232647p:plain:w550