Ubuntu 18.04 LXC SQL Server 定期的な完全バックアップを自動化する方法
はじめに
無料で利用できる SQL Server Express にはエージェントというジョブを定期的に実行するコンポーネントが無いため、別の方法で行う必要があります。
今回は UNIX系のOSにおいて定期的にジョブを実行する cron を使用してバックアップを作成します。
SQL Server のバックアップを作成する際に Transact SQL を使用するため、事前に
sqlcmd (SQL Server コマンドラインツール) のインストールが必要になります。
Ubuntu に SQL 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 と表記されます。
2. SQLファイルの作成
例としてemployee データベースの完全バックアップを作成します。
今回は backup.sql としてSQLファイルを作成します。
vim /home/ubuntu/test/backup.sql
以下のクエリでデータベースからemployee.bakという名前でバックアップファイルを作成します。
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 はタブを表しています。