Mariabackup リストア失敗?一般的なエラーとトラブルシューティング
MariaDB における増分バックアップとリストアは、データベースのバックアップ戦略において非常に重要な手法の一つです。特に、データ量の多い大規模なデータベース環境において、完全バックアップの頻度を減らし、バックアップ時間とストレージ容量を節約するために有効です。Mariabackup は、MariaDB の物理バックアップツールとして、この増分バックアップとリストア機能を強力にサポートしています。
増分バックアップ (Incremental Backup)
増分バックアップとは、前回のバックアップ(完全バックアップまたは前回の増分バックアップ)以降に変更されたデータのみをバックアップする方法です。これにより、以下の利点があります。
- ネットワーク負荷の軽減
バックアップデータの転送量が減るため、ネットワークへの負荷を軽減できます。 - ストレージ容量の節約
バックアップサイズが小さくなるため、必要なストレージ容量を削減できます。 - バックアップ時間の短縮
変更されたデータのみをバックアップするため、完全バックアップに比べて大幅に時間を短縮できます。
Mariabackup で増分バックアップを実行する基本的な手順は以下の通りです。
-
ベースとなる完全バックアップの取得
まず、増分バックアップの起点となる完全バックアップを取得します。mariabackup --backup --target-dir=/path/to/full_backup
-
増分バックアップの実行
完全バックアップ以降の変更をバックアップします。--incremental-basedir
オプションで、前回のバックアップディレクトリを指定します。mariabackup --backup --target-dir=/path/to/incremental_backup_1 --incremental-basedir=/path/to/full_backup
さらに増分バックアップを実行する場合は、前回の増分バックアップディレクトリを
--incremental-basedir
に指定します。mariabackup --backup --target-dir=/path/to/incremental_backup_2 --incremental-basedir=/path/to/incremental_backup_1
このように、必要な回数だけ増分バックアップを連鎖的に実行できます。
リストア (Restore)
増分バックアップからデータベースをリストアするには、まずベースとなる完全バックアップを適用し、その後に取得したすべての増分バックアップを順番に適用する必要があります。Mariabackup は、このプロセスを効率的に行うための機能を提供しています。
リストアの基本的な手順は以下の通りです。
-
バックアップの準備
まず、リストア先のデータディレクトリを空にするか、存在しない場合は作成します。 -
完全バックアップの適用 (準備)
完全バックアップをリストアの準備段階に入れます。--prepare
オプションを使用します。mariabackup --prepare --target-dir=/path/to/full_backup
-
増分バックアップの適用 (マージ)
取得したすべての増分バックアップを、取得した順に--apply-log
オプションを使って完全バックアップに適用(マージ)していきます。mariabackup --prepare --target-dir=/path/to/full_backup --incremental-basedir=/path/to/incremental_backup_1 mariabackup --prepare --target-dir=/path/to/full_backup --incremental-basedir=/path/to/incremental_backup_2 # 必要に応じて、さらに増分バックアップを適用
重要なのは、古い順 に増分バックアップを適用することです。
--incremental-basedir
には、適用する増分バックアップのディレクトリを指定します。Mariabackup は、指定された増分バックアップのログをベースとなる完全バックアップにマージします。 -
リストアの実行 (コピーバック)
すべての増分バックアップの適用が完了したら、--copy-back
オプションを使用して、準備されたバックアップデータを MariaDB のデータディレクトリにコピーします。mariabackup --copy-back --target-dir=/path/to/full_backup
または、
--move-back
オプションを使用して、バックアップデータを移動することもできます。 -
所有者と権限の調整
コピーまたは移動されたデータの所有者と権限が MariaDB サーバーの実行ユーザーに適していることを確認し、必要に応じて調整します。 -
MariaDB サーバーの起動
調整後、MariaDB サーバーを起動します。
- リストアの手順は、バックアップを取得した順序を正確に把握していることが重要です。
- 増分バックアップの頻度や世代管理は、データベースの変更頻度や可用性の要件に応じて適切に計画する必要があります。
- リストア時には、すべての関連するバックアップ(完全バックアップとすべての増分バックアップ)が必要です。一部が欠けていると、完全なリストアはできません。
- 増分バックアップは、ベースとなる完全バックアップが存在することが前提となります。
Mariabackup を使用した増分バックアップとリストアは強力な機能ですが、設定や実行時にいくつかの一般的なエラーが発生する可能性があります。以下に、よくあるエラーとそのトラブルシューティング方法を説明します。
増分バックアップ時のエラー
-
- エラーメッセージの例
InnoDB: Error: Unable to find redo log files in the basedir.
- 原因
--incremental-basedir
オプションに指定したディレクトリが間違っているか、削除されている、または完全バックアップや前回の増分バックアップが正常に完了していない可能性があります。 - トラブルシューティング
- 指定したディレクトリのパスが正しいか確認してください。
- ベースとなる完全バックアップまたは前回の増分バックアップが正常に完了し、指定したディレクトリに存在することを確認してください。
- ディレクトリのパーミッションが Mariabackup を実行するユーザーに適切に設定されているか確認してください。
- エラーメッセージの例
-
増分バックアップの実行ユーザーに適切な権限がない
- エラーメッセージの例
mariabackup: Error: Got an error: 1045: Access denied for user '...'@'localhost' (using password: YES)
- 原因
Mariabackup を実行するユーザーが、必要なデータベースへのアクセス権限やファイルシステムへの書き込み権限を持っていない可能性があります。 - トラブルシューティング
- Mariabackup を実行するユーザーに必要な権限(
BACKUP_ADMIN
,RELOAD
,LOCK TABLES
,SELECT
など)が付与されているか確認してください。 - バックアップ先のディレクトリへの書き込み権限があるか確認してください。
- Mariabackup を実行するユーザーに必要な権限(
- エラーメッセージの例
-
ディスク容量の不足
- エラーメッセージの例
mariabackup: Error: Could not create file ... (No space left on device)
- 原因
バックアップ先のディスク容量が不足しているため、バックアップファイルを書き込めません。 - トラブルシューティング
- バックアップ先のディスクの空き容量を確認し、必要に応じて容量を確保してください。
- 不要なファイルを削除したり、より大きなストレージにバックアップ先を変更したりすることを検討してください。
- エラーメッセージの例
-
InnoDB ログファイルの問題
- エラーメッセージの例
InnoDB: Error: Log file ... is too small.
- 原因
InnoDB のログファイルの設定が、バックアップ処理に必要なサイズに対して小さすぎる可能性があります。 - トラブルシューティング
innodb_log_file_size
とinnodb_log_files_in_group
の設定を確認し、必要に応じて値を大きくすることを検討してください。ただし、これらの設定変更には MariaDB サーバーの再起動が必要です。
- エラーメッセージの例
-
--prepare の失敗
- エラーメッセージの例
mariabackup: Error: Could not apply log file ...
- 原因
増分バックアップの適用時に、ログファイルの破損、不整合、または順序の間違いなどが考えられます。 - トラブルシューティング
- 適用しようとしている増分バックアップが、ベースとなる完全バックアップ以降に取得されたものであり、順番が正しいか確認してください。
- バックアップファイル自体の整合性を確認するために、可能であれば再度バックアップを取得することを検討してください。
- MariaDB のバージョン間で互換性の問題がないか確認してください。
- エラーメッセージの例
-
--copy-back または --move-back の失敗
- エラーメッセージの例
mariabackup: Error: Could not copy file ... (Permission denied)
- 原因
Mariabackup を実行するユーザーに、リストア先のデータディレクトリへの書き込み権限がない可能性があります。 - トラブルシューティング
- リストア先のデータディレクトリのパーミッションが、Mariabackup を実行するユーザーに適切に設定されているか確認してください。
- SELinux や AppArmor などのセキュリティ機能が有効になっている場合、それらがファイル操作を妨げていないか確認してください。
- エラーメッセージの例
-
データディレクトリの所有者と権限の問題
- エラーメッセージの例
MariaDB サーバーが起動しない、またはデータにアクセスできない。 - 原因
リストア後に、データディレクトリとそのファイル、ディレクトリの所有者と権限が MariaDB サーバーの実行ユーザーと一致していない可能性があります。 - トラブルシューティング
- リストア先のデータディレクトリとその配下のファイルの所有者を、MariaDB サーバーを実行するユーザー(通常は
mysql
)に変更してください。 - 必要な権限が適切に設定されているか確認してください(例:
chown -R mysql:mysql /var/lib/mysql
、権限は環境によって異なります)。
- リストア先のデータディレクトリとその配下のファイルの所有者を、MariaDB サーバーを実行するユーザー(通常は
- エラーメッセージの例
-
増分バックアップの欠落
- エラーメッセージの例
リストアは成功するが、データが最新の状態ではない。 - 原因
リストア時に、必要な増分バックアップの一部が欠落している可能性があります。 - トラブルシューティング
- リストアに使用したすべてのバックアップ(完全バックアップとすべての増分バックアップ)が揃っているか確認してください。
- バックアップの世代管理ポリシーを見直し、必要なバックアップが誤って削除されないようにしてください。
- エラーメッセージの例
-
MariaDB のバージョン不一致
- エラーメッセージの例
予期しないエラーが発生する可能性がある。 - 原因
バックアップを取得した MariaDB のバージョンと、リストア先の MariaDB のバージョンが大きく異なる場合、互換性の問題が発生する可能性があります。 - トラブルシューティング
- 可能な限り、バックアップ時とリストア時で同じまたは近い MariaDB のバージョンを使用することを推奨します。
- バージョンが異なる場合は、MariaDB のリリースノートなどを確認し、既知の互換性の問題がないか調べてください。
- エラーメッセージの例
- バックアップ戦略の見直し
エラーが頻繁に発生する場合は、バックアップ戦略自体を見直し、より堅牢な方法を検討する必要があるかもしれません。 - テスト環境での検証
本番環境でリストアを行う前に、必ずテスト環境でリストアプロセスを検証し、問題がないことを確認してください。 - コマンドオプションの確認
Mariabackup のコマンドオプションを正しく理解し、使用しているか確認してください。スペルミスやオプションの組み合わせの間違いもエラーの原因となります。 - ログの確認
Mariabackup の実行ログや MariaDB サーバーのエラーログ(通常は hostname.err など)を詳細に確認することで、エラーの原因を特定できる場合があります。
ここでは、Bash スクリプトを用いて Mariabackup の増分バックアップとリストアのプロセスを自動化する例を紹介します。
以下の例では、基本的な増分バックアップの取得と、リストアの準備段階までを自動化する簡単な Bash スクリプトを示します。
完全バックアップスクリプト (full_backup.sh)
#!/bin/bash
# バックアップ先のディレクトリ
BACKUP_DIR="/var/backup/mariadb"
FULL_BACKUP_DIR="${BACKUP_DIR}/full"
DATE=$(date +%Y%m%d_%H%M%S)
# 完全バックアップの実行
echo "Starting full backup at ${DATE}"
mariabackup --backup --target-dir="${FULL_BACKUP_DIR}/${DATE}"
if [ $? -eq 0 ]; then
echo "Full backup completed successfully at ${FULL_BACKUP_DIR}/${DATE}"
# 最新の完全バックアップへのシンボリックリンクを作成 (必要に応じて)
ln -sf "${FULL_BACKUP_DIR}/${DATE}" "${FULL_BACKUP_DIR}/latest"
else
echo "Full backup failed."
exit 1
fi
exit 0
説明
ln -sf ...
: 最新の完全バックアップへのシンボリックリンクを作成します(リストア時に便利)。$? -eq 0
: 直前のコマンドの終了ステータスが 0(成功)かどうかをチェックします。mariabackup --backup --target-dir="${FULL_BACKUP_DIR}/${DATE}"
: Mariabackup を実行して完全バックアップを取得し、タイムスタンプ付きのディレクトリに保存します。DATE
: バックアップのタイムスタンプを生成します。FULL_BACKUP_DIR
: 完全バックアップを保存するディレクトリを定義します。BACKUP_DIR
: バックアップのルートディレクトリを定義します。
増分バックアップスクリプト (incremental_backup.sh)
#!/bin/bash
# バックアップ先のディレクトリ
BACKUP_DIR="/var/backup/mariadb"
INCREMENTAL_BACKUP_DIR="${BACKUP_DIR}/incremental"
FULL_BACKUP_DIR="${BACKUP_DIR}/full/latest" # 最新の完全バックアップのシンボリックリンクを使用
DATE=$(date +%Y%m%d_%H%M%S)
# 事前チェック: 最新の完全バックアップが存在するか
if [ ! -d "${FULL_BACKUP_DIR}" ]; then
echo "Error: Full backup directory not found at ${FULL_BACKUP_DIR}"
exit 1
fi
# 最新の増分バックアップディレクトリ(存在する場合)
LATEST_INCREMENTAL=$(ls -d "${INCREMENTAL_BACKUP_DIR}/"*/ | sort -r | head -n 1)
# 増分バックアップの実行
echo "Starting incremental backup at ${DATE}"
if [ -n "${LATEST_INCREMENTAL}" ]; then
mariabackup --backup --target-dir="${INCREMENTAL_BACKUP_DIR}/${DATE}" --incremental-basedir="${LATEST_INCREMENTAL%/}"
echo "Based on previous incremental backup: ${LATEST_INCREMENTAL%/}"
else
mariabackup --backup --target-dir="${INCREMENTAL_BACKUP_DIR}/${DATE}" --incremental-basedir="${FULL_BACKUP_DIR}"
echo "Based on full backup: ${FULL_BACKUP_DIR}"
fi
if [ $? -eq 0 ]; then
echo "Incremental backup completed successfully at ${INCREMENTAL_BACKUP_DIR}/${DATE}"
else
echo "Incremental backup failed."
exit 1
fi
exit 0
説明
- 以降の増分バックアップは、
--incremental-basedir
に前回の増分バックアップディレクトリを指定します。 - 最初の増分バックアップは、
--incremental-basedir
に完全バックアップディレクトリを指定します。 LATEST_INCREMENTAL
: 既存の最新の増分バックアップディレクトリを検索します。FULL_BACKUP_DIR
: 最新の完全バックアップへのシンボリックリンクを指します。INCREMENTAL_BACKUP_DIR
: 増分バックアップを保存するディレクトリを定義します。
リストア準備スクリプト (restore_prepare.sh)
#!/bin/bash
# バックアップ先のディレクトリ
BACKUP_DIR="/var/backup/mariadb"
FULL_BACKUP_DIR="${BACKUP_DIR}/full/latest"
INCREMENTAL_BACKUP_DIR="${BACKUP_DIR}/incremental"
# リストア準備のベースとなる完全バックアップディレクトリが存在するか確認
if [ ! -d "${FULL_BACKUP_DIR}" ]; then
echo "Error: Full backup directory not found at ${FULL_BACKUP_DIR}"
exit 1
fi
echo "Preparing full backup: ${FULL_BACKUP_DIR}"
mariabackup --prepare --target-dir="${FULL_BACKUP_DIR}"
if [ $? -ne 0 ]; then
echo "Error preparing full backup."
exit 1
fi
# 増分バックアップが存在する場合は適用
INCREMENTAL_DIRS=$(ls -d "${INCREMENTAL_BACKUP_DIR}/"*/ | sort)
if [ -n "${INCREMENTAL_DIRS}" ]; then
echo "Applying incremental backups..."
BASE_DIR="${FULL_BACKUP_DIR}"
for INCR_DIR in ${INCREMENTAL_DIRS}; do
echo "Applying: ${INCR_DIR%/}"
mariabackup --prepare --target-dir="${BASE_DIR}" --incremental-basedir="${INCR_DIR%/}"
if [ $? -ne 0 ]; then
echo "Error applying incremental backup: ${INCR_DIR%/}"
exit 1
fi
BASE_DIR="${FULL_BACKUP_DIR}" # --incremental-basedir はベースディレクトリを更新しないため、毎回フルバックアップディレクトリを指定
done
echo "All incremental backups applied successfully."
else
echo "No incremental backups found."
fi
echo "Restore preparation complete."
exit 0
説明
--incremental-basedir
は、適用する増分バックアップのディレクトリを指定します。--target-dir
は、変更を適用するベースディレクトリ(ここでは完全バックアップディレクトリ)を指定します。- 次に、増分バックアップディレクトリ内のすべてのディレクトリを古い順にソートし、それぞれをベースとなる完全バックアップに適用します。
- このスクリプトは、まず最新の完全バックアップを準備します。
#!/bin/bash
# バックアップ先のディレクトリ
BACKUP_DIR="/var/backup/mariadb"
FULL_BACKUP_DIR="${BACKUP_DIR}/full/latest"
DATA_DIR="/var/lib/mysql" # MariaDB のデータディレクトリ (環境に合わせて変更)
# 事前チェック: 準備されたバックアップが存在するか
if [ ! -d "${FULL_BACKUP_DIR}" ]; then
echo "Error: Prepared backup directory not found at ${FULL_BACKUP_DIR}"
exit 1
fi
echo "Stopping MariaDB server..."
systemctl stop mariadb # または service mysql stop など、環境に合わせて変更
if [ $? -ne 0 ]; then
echo "Error stopping MariaDB server."
exit 1
fi
echo "Copying back backup data to ${DATA_DIR}"
mariabackup --copy-back --target-dir="${FULL_BACKUP_DIR}"
if [ $? -ne 0 ]; then
echo "Error copying back backup data."
# エラー処理として、元の権限などをリストアすることを検討
exit 1
fi
# ファイルの所有者とグループを MariaDB ユーザーに変更
chown -R mysql:mysql "${DATA_DIR}"
echo "Starting MariaDB server..."
systemctl start mariadb # または service mysql start など、環境に合わせて変更
if [ $? -ne 0 ]; then
echo "Error starting MariaDB server."
# 必要に応じて、エラーからの復旧処理を追加
exit 1
fi
echo "Restore completed successfully."
exit 0
- コピー後のデータディレクトリの所有者とグループを MariaDB サーバーの実行ユーザーに変更します。
- リストア前に MariaDB サーバーを停止し、コピー後に再起動します。
- このスクリプトは、準備されたバックアップデータ(完全バックアップと適用された増分バックアップ)を MariaDB のデータディレクトリにコピーします。
- 増分バックアップの世代管理(古いバックアップの削除)なども、別途スクリプトで実装することを推奨します。
- これらのスクリプトを実行するユーザーには、必要なファイルシステムと MariaDB への権限が必要です。
- リストアを実行する際は、データの損失を防ぐために慎重に行ってください。
- パスや MariaDB のサービス名は、実際の環境に合わせて変更してください。
- これらのスクリプトは基本的な例であり、実際にはエラー処理、ログ記録、設定ファイルの読み込みなど、より多くの機能を追加する必要がある場合があります。
Python を利用した自動化
Python は、豊富なライブラリと扱いやすさから、システム管理や自動化スクリプトの作成によく利用されます。subprocess
モジュールを使うことで、Python スクリプトから Mariabackup のコマンドを実行し、その結果を処理することができます。
例
import subprocess
import datetime
import os
BACKUP_DIR = "/var/backup/mariadb"
FULL_BACKUP_DIR = os.path.join(BACKUP_DIR, "full")
INCREMENTAL_BACKUP_DIR = os.path.join(BACKUP_DIR, "incremental")
def run_mariabackup(command):
"""Mariabackup コマンドを実行し、結果を返します。"""
process = subprocess.run(command, capture_output=True, text=True, check=False)
if process.returncode == 0:
print(process.stdout)
return True
else:
print(f"Error: {process.stderr}")
return False
def create_full_backup():
"""完全バックアップを実行します。"""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
target_dir = os.path.join(FULL_BACKUP_DIR, timestamp)
os.makedirs(target_dir, exist_ok=True)
command = ["mariabackup", "--backup", "--target-dir", target_dir]
return run_mariabackup(command)
def create_incremental_backup():
"""増分バックアップを実行します。"""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
target_dir = os.path.join(INCREMENTAL_BACKUP_DIR, timestamp)
os.makedirs(target_dir, exist_ok=True)
latest_incremental = sorted([d for d in os.listdir(INCREMENTAL_BACKUP_DIR) if os.path.isdir(os.path.join(INCREMENTAL_BACKUP_DIR, d))], reverse=True)
if latest_incremental:
basedir = os.path.join(INCREMENTAL_BACKUP_DIR, latest_incremental[0])
else:
latest_full = sorted([d for d in os.listdir(FULL_BACKUP_DIR) if os.path.isdir(os.path.join(FULL_BACKUP_DIR, d))], reverse=True)
if latest_full:
basedir = os.path.join(FULL_BACKUP_DIR, latest_full[0])
else:
print("Error: No full or incremental backup found.")
return False
command = ["mariabackup", "--backup", "--target-dir", target_dir, "--incremental-basedir", basedir]
return run_mariabackup(command)
if __name__ == "__main__":
# 例: 完全バックアップを実行
if create_full_backup():
print("Full backup initiated.")
# 例: 増分バックアップを実行
if create_incremental_backup():
print("Incremental backup initiated.")
Python を使うことで、より複雑なロジックやエラー処理、ログ管理などを実装しやすくなります。また、他のシステムとの連携も容易になります。
Python と同様に、Perl や Ruby などの他のスクリプト言語も、system
関数やバッククォート (``
) を利用して外部コマンドを実行し、Mariabackup の自動化スクリプトを作成することができます。これらの言語も、豊富なライブラリを持っており、ファイル操作や日時処理などを容易に行えます。
構成管理ツール (Ansible, Chef, Puppet など)
Ansible、Chef、Puppet などの構成管理ツールを利用すると、バックアップ処理をインフラストラクチャの一部として管理できます。これらのツールは、冪等性(同じ操作を何度実行しても結果が同じであること)を持つため、安定したバックアップ環境を構築するのに役立ちます。
例 (Ansible)
- name: Create full MariaDB backup
hosts: your_db_server
become: true
tasks:
- name: Ensure backup directory exists
file:
path: /var/backup/mariadb/full/{{ ansible_date_time.iso8601 }}
state: directory
- name: Run mariabackup for full backup
command:
cmd: mariabackup --backup --target-dir=/var/backup/mariadb/full/{{ ansible_date_time.iso8601 }}
register: backup_result
- name: Print backup result
debug:
var: backup_result
- name: Create incremental MariaDB backup
hosts: your_db_server
become: true
tasks:
- name: Get latest full backup directory
shell: ls -dt /var/backup/mariadb/full/*/ | head -n 1
register: latest_full_backup
ignore_errors: true
- name: Get latest incremental backup directory
shell: ls -dt /var/backup/mariadb/incremental/*/ | head -n 1
register: latest_incremental_backup
ignore_errors: true
- name: Ensure incremental backup directory exists
file:
path: /var/backup/mariadb/incremental/{{ ansible_date_time.iso8601 }}
state: directory
- name: Run mariabackup for incremental backup (based on previous incremental or full)
command:
cmd: >
mariabackup --backup --target-dir=/var/backup/mariadb/incremental/{{ ansible_date_time.iso8601 }}
{% if latest_incremental_backup.stdout %}
--incremental-basedir={{ latest_incremental_backup.stdout | trim }}
{% elif latest_full_backup.stdout %}
--incremental-basedir={{ latest_full_backup.stdout | trim }}
{% endif %}
register: incremental_result
- name: Print incremental backup result
debug:
var: incremental_result
Ansible などのツールを使うことで、複数のサーバーに対するバックアップ設定を一元的に管理したり、バックアップのスケジュール管理と連携させたりすることが容易になります。
スケジューリングツールとの連携 (cron, systemd timers など)
Bash スクリプトや Python スクリプトなど、どのような方法で Mariabackup を実行する場合でも、cron や systemd timers などのスケジューリングツールと連携させることで、定期的なバックアップを自動化できます。
例 (cron)
0 2 * * * /path/to/your/full_backup.sh # 毎日午前2時に完全バックアップを実行
0 5 * * * /path/to/your/incremental_backup.sh # 毎日午前5時に増分バックアップを実行
Zmanda Recovery Manager (ZRM) for MySQL などのバックアップ管理専用ツールは、Mariabackup を内部的に利用しつつ、より高度なバックアップポリシー管理、スケジュール管理、監視機能などを提供します。これらのツールは、設定ファイルや GUI を通じてバックアッププロセスを管理できるため、プログラミングの知識が少なくても利用できる場合があります。また、API を提供しているツールもあり、プログラムからの制御も可能です。
Mariabackup を用いた増分バックアップとリストアに関連するプログラミングの代替方法は、主に自動化スクリプトの作成に利用するプログラミング言語の選択肢と、より高度な管理を行うためのツールの利用に分けられます。
- バックアップ管理専用ツール
ZRM for MySQL など (高度な管理機能、API を持つ場合あり)。 - スケジューリングツール
cron、systemd timers (定期的な実行の自動化)。 - 構成管理ツール
Ansible、Chef、Puppet (インフラ全体の一部としてのバックアップ管理、冪等性)。 - スクリプト言語
Bash (基本的な自動化)、Python (高機能な自動化、エラー処理、連携)、Perl、Ruby など。