テクセル

PowerShellでMariaDBバックアップ


MariaDB のバックアップを PowerShell から「mysqldump.exe」を使用して行います。MariaDB のバージョン10.3 で確認しています。

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

スクリプトファイルが存在するフォルダ内の「dbSave」フォルダにバックアップファイルを保存します。ファイル名は、保存実行時の日付時間です。 (ファイル名の例 「db20221003122345.sql」)
指定された保存日数を超えたファイルは、削除します。mysqldump.exeのオプションは一例です。


# DbSave.ps1
# mariadb バックアップ

$shost = "localhost"         # ホスト名 or IPアドレス
$suser = "root"              # ユーザ名
$spwd = "root"               # パスワード
$isday = 30                  # 保存日数

$smysqldump = "`"C:\Program Files\MariaDB 10.3\bin\mysqldump.exe`""

# 保存先フォルダ
$ssaveDir = (Split-Path $MyInvocation.MyCommand.Path -Parent) + "\dbSave"

# 保存ファイル名
$ssavefile = $ssaveDir + "\db" + $(Get-Date).ToString("yyyyMMddHHmmss") + ".sql"

if (-not (Test-Path $ssaveDir)){  # 存在しない場合フォルダ作成
   New-Item $ssaveDir -type directory
}

$sarg = "-h" + $shost + " " + "-u" + $suser + " " + "-p" + $spwd + " "
$sarg += "--opt --skip-lock-tables --events "
# $sarg += "--single-transaction "          # innodb
$sarg += "--lock-all-tables "               # MyISAM,Aria
$sarg += "--hex-blob "
$sarg += " --databases db0 db1 "            # 保存するデータベース名
$sarg += " --result-file=" + $ssavefile

#Write-Host $sarg

$psinf = New-Object System.Diagnostics.ProcessStartInfo
$psinf.FileName = $smysqldump
$psinf.Arguments = $sarg

$prc = New-Object System.Diagnostics.Process
$prc.StartInfo = $psinf

[void]$prc.Start()

while($true){
   $rtn1 = $prc.WaitForExit(1000)      # 終了するまで待つ
   if ($rtn1 -eq $true){
      break
   }
}

$rtn = $prc.ExitCode
Write-Host $rtn

# 保存期間を超えるファイルの削除
$sarfile = Get-ChildItem $ssaveDir\db*.sql -File # ファイル一覧
[DateTime]$dtb = (Get-Date).AddDays(-$isday)     # 保存期間

foreach($sfile in $sarfile){
   $sf = [string]$sfile
   $sfn = [System.IO.Path]::GetFileNameWithoutExtension($sf)    # ファイルベース部
   if (-not ([regex]::Match($sfn, "db[0-9]{14}"))){
      continue
   }
   $sa = $sfn.Substring(2, 14)
   [DateTime]$dta = [DateTime]::ParseExact($sa, "yyyyMMddHHmmss", $null)
   if ($dtb.Ticks -gt $dta.Ticks){
      [System.IO.File]::Delete($sfile)
   }
}
   

ファイルへの出力は、リダイレクトを使用せず、mysqldump.exe のオプション --result-file= でファイル名を指定しています。

2) バックアップをタスクスケジューラから実行

ここでは、バッチファイルに PowerShellスクリプトの呼び出し、実行を記述し、バッチファイルをタスクスケジューラから実行します。

PowerShellスクリプトを呼び出すバッチファイル例 (dbSaveRun.bat)


@echo off
powershell -ExecutionPolicy RemoteSigned -File D:\dbSavePs\DbSave.ps1
   

「-ExecutionPolicy RemoteSigned」でスクリプトが実行できるように実行ポリシーを変更します。また「-File」で実行するスクリプトファイルを指定します。

バッチファイル「dbSaveRun.bat」をタスクスケジューラに登録します。
下記の設定例は、毎日6時25分にバックアップを実行する設定例です。

  1. [コントロールパネル]-[管理ツール]-[タスクスケジューラ]でタスクスケジューラを開きます。
  2. メニューバーの[操作]-[タスクの作成]でタスクの作成を開きます。
  3. 「全般」タブを選択します。名前欄にタスクの名前を入力します。 例:dbSave
  4. 「トリガー」タブを選択します。「新規」ボタンマウスクリックで新しいトリガーを開きます。,
    設定欄の「毎日」を選択します。開始時間を6時25分に設定します。
    「OK」ボタンで新しいトリガーダイアログを閉じます。
  5. 「操作」タブを選択します。「新規」ボタンマウスクリックで新しい操作を開きます。
    操作は、「プログラム開始」を選択します。
    プログラム/スクリプトの「参照」ボタンで dbSaveRun.bat をフルパスで指定します。
    「OK」ボタンで新しい操作ダイアログを閉じます。
  6. 「OK」ボタンでタスクの作成を閉じます。

3) バックアップファイルから復旧

HeidiSQLでバックアップファイルからデータベースの復旧を行います。HeidiSQL のデータベース接続設定等は、設定されているものとします。
対象データベースへ接続されている状態で、メニューバー[ファイル]-[SQLファイルを実行]でファイル選択ダイアログを表示します。実行するSQLファイルを選択します。「開く」ボタンでSQLファイルのインポートが実行されます。

PowerShellメモ
©2022 TEXCELL CORPORATION
テクセル株式会社