de:code 2018 では、SQL Server on Linux のデータベースバックアップを bash + sqlcmd で実装する方法をデモで実施しました。
Windows PowerShell から、バックアップを取得するスクリプトも以前組んだことがあったのですが、PowerShell Core で実装したことが無かったので、勉強がてら作成してみました。
(Windows PowerShell (v5.1) でも実行可能です)
Backup-Database.ps1
pwsh./Backup-Database.ps1 -ServerInstance <ServerName> -Username <Login> -P <Login Password> -RunSpaceSize 5
投稿を書いている時点では、PowerShell Core 向けの SQL Server モジュールでは、Invoke-SqlCmd が提供されていないため、ADO.NET で DB にアクセスを実施するようにしています。
複数のデータベースを作成しており、データベースがある程度のサイズになっている場合に、一つずつ、データベースのバックアップを取得すると、大きいサイズのデータベースがバックアップの処理効率化のブロッカーとなりえる可能性がありますので、RunSpacePool を使用して、並列でバックアップを取得するような処理としています。
RunSpacePool については、次の情報を参考にさせていただきました。
- PowerShell による同期処理、非同期処理、並列処理 を考えてみる
- RunspacePoolを使って、PowerShellを非同期実行
- Weekend Scripter: Max Out PowerShell in a Little Bit of Time?Part 2
- Beginning Use of PowerShell Runspaces: Part 1
スクリプトの初期設定では、RunSpacePool のサイズは、2 としていますが、これはオプションで変更することができます。
また、バックアップの取得を実行する SQL のコマンドタイムアウトについては、デフォルトでは、600 秒 (10 分) としていますが、オプションで変更することができるようになっていますので、必要に応じて適宜変更してください。
「-Log」スイッチを設定することで、データベースのバックアップだけでなく、トランザクションログのバックアップを取得することもできます。
トランザクションログのバックアップの有無については、初回バックアップ取得済みか、復旧モデルの情報を元に判断するようにしているので、他の条件を組み込むこともできるかと。
すべての状況に対応したスクリプトではありませんが、シングルインスタンスの基本的なバックアップを取得するために使用することができるかと思いますので、バックアップ実装の参考になれば幸いです。