コマンドラインでSQL Serverデータベースをバックアップする際のベストプラクティス

2024-04-06

この解説では、SQL Serverデータベースをコマンドラインでバックアップするためのシンプルなスクリプトについて説明します。

対象者

  • SQL Serverデータベースのバックアップを自動化したい方
  • コマンドライン操作に慣れていない方

解説

バックアップコマンド

SQL Serverデータベースをコマンドラインでバックアップするには、BACKUP DATABASEコマンドを使用します。

BACKUP DATABASE database_name
TO disk_location

オプション

  • WITH句: バックアップオプションを指定できます。
  • NOFORMATオプション: バックアップファイルのフォーマットを検証しない。
  • INITオプション: バックアップファイルのヘッダー情報を初期化します。

BACKUP DATABASE MyDatabase
TO C:\Backups\MyDatabase.bak
WITH NOFORMAT, INIT

スクリプティング

上記のBACKUP DATABASEコマンドをスクリプトファイルに記述することで、バックアップ作業を自動化できます。

# PowerShellスクリプト

$databaseName = "MyDatabase"
$backupLocation = "C:\Backups"

Backup-SqlDatabase -DatabaseName $databaseName -BackupLocation $backupLocation

# ログ出力
Write-Host "データベース[$databaseName]のバックアップが完了しました。"

スケジュール設定

作成したスクリプトをタスクスケジューラなどのツールで定期的に実行することで、データベースの定期的なバックアップを実現できます。

注意事項

  • バックアップファイルは安全な場所に保存してください。
  • バックアップ前にデータベースをトランザクションログバックアップしておくことをお勧めします。
  • スクリプトを実行する前に、必ずテストを行ってください。

補足

上記はシンプルなスクリプトの例です。実際の運用環境に合わせて、スクリプトをカスタマイズする必要があります。

コマンドライン操作に慣れていない方は、SQL Server Management Studio (SSMS) などのツールを使用して、GUIでバックアップを実行することもできます。

  • 自分に合った方法を選択してください。

以上




# PowerShellスクリプト

$databaseName = "MyDatabase"
$backupLocation = "C:\Backups"

# バックアップファイル名
$backupFileName = "$databaseName-$(Get-Date -Format yyyyMMdd-HHmmss).bak"

# バックアップ実行
Backup-SqlDatabase -DatabaseName $databaseName -BackupLocation $backupLocation -BackupFileName $backupFileName

# ログ出力
Write-Host "データベース[$databaseName]のバックアップが完了しました。"

バッチファイル

@echo off

rem データベース名
set "databaseName=MyDatabase"

rem バックアップ場所
set "backupLocation=C:\Backups"

rem バックアップファイル名
set "backupFileName=%databaseName%-%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%.bak"

rem バックアップ実行
sqlcmd -S localhost -Q "BACKUP DATABASE %databaseName% TO '%backupLocation%\%backupFileName%'"

rem ログ出力
echo "データベース[%databaseName%]のバックアップが完了しました。"

Pythonスクリプト

import pyodbc

# 接続情報
server = "localhost"
database = "MyDatabase"
username = "sa"
password = "YourPassword"

# バックアップファイル名
backup_file_name = f"{database}-{datetime.datetime.now():%Y%m%d-%H%M%S}.bak"

# バックアップ実行
connection = pyodbc.connect(f"Driver={{SQL Server}};Server={server};Database={database};Trusted_Connection=Yes;", username, password)
cursor = connection.cursor()
cursor.execute(f"BACKUP DATABASE {database} TO '{backup_file_name}'")
connection.close()

# ログ出力
print(f"データベース[{database}]のバックアップが完了しました。")

実際の運用環境に合わせて、コードをカスタマイズする必要があります。




SQL Serverデータベースをコマンドラインでバックアップするその他の方法

sqlcmdコマンドを使用して、BACKUP DATABASEコマンドを実行できます。

sqlcmd -S localhost -Q "BACKUP DATABASE MyDatabase TO C:\Backups\MyDatabase.bak"

T-SQL

BACKUP DATABASE MyDatabase
TO C:\Backups\MyDatabase.bak
WITH NOFORMAT, INIT

PowerShellを使用して、Backup-SqlDatabaseコマンドレットを実行できます。

Backup-SqlDatabase -DatabaseName MyDatabase -BackupLocation C:\Backups

他のツール

  • SQL Server Backup and Restore Wizard
  • Ola Hallengren's SQL Server Backup Script
  • Redgate SQL Backup

コマンドライン操作に慣れていない方は、SSMS などのツールを使用して、GUIでバックアップを実行することをお勧めします。

その他の方法を選択する際の考慮事項

  • 使いやすさ
  • 機能
  • セキュリティ

sql-server command-line scripting


SQL Server:GETDATE()、SYSDATETIME()、CURRENT_TIMESTAMP、datetimeデータ型を使いこなす

SQL Serverには、NOW()関数と完全に一致する関数はありません。しかし、いくつかの代替方法があります。**GETDATE()**関数は、現在の時刻と日付を取得する最も一般的な方法です。NOW()関数と同様に、タイムゾーン情報は含まれません。...


C#、.NET、SQL Server で SqlConnection オブジェクトから保留中のトランザクションへの参照を取得する方法

C#、.NET、SQL Server を使用する場合、SqlConnection オブジェクトから保留中のトランザクションへの参照を取得することは可能です。これは、複数のクエリを 1 つのトランザクションとしてグループ化し、一貫性と原子性を確保する必要がある場合に役立ちます。...


SQL Server 2005 でのデータベースとスキーマ: 基礎から理解する

データベース は、テーブル、ビュー、インデックス、ストアドプロシージャなど、関連するデータの集合体です。 簡単に言えば、データを整理して格納するためのファイルボックスのようなものです。スキーマ は、データベース内のオブジェクトの論理的な構造を定義するものです。 テーブルの構成(列名、データ型、制約など)や、テーブル間の関連性などを定義します。...


SQL ServerにおけるDATETIMEとTIMESTAMPの落とし穴:開発者が知っておくべきポイント

データ型DATETIME:3 バイトの整数で表される年、月、日最大 3 桁の小数秒まで格納可能最大値: 2100-06-06 23:59:59. 999最小値: 1753-01-01 00:00:00. 000DATETIME:3 バイトの整数で表される年、月、日...


SQL Serverで「Partition Function COUNT() OVER possible using DISTINCT」を活用して個別値を効率的にカウントする方法

SQL Server 2008以降では、ウィンドウ関数 COUNT() と DISTINCT を組み合わせて、パーティションごとの個別値の個数 をカウントすることができます。これは、分析対象となるデータセットが膨大な場合に特に役立ちます。この機能を活用することで、以下の操作が可能になります。...