Tableau Server のバックアップ・リストアを実施する

2023.08.04

Tableau Server のバックアップ取得からリストアまでの手順についてまとめておきたく記事としました。Tableau Sever のバックアップ取得については、関連ブログもあるのであわせてご参照ください。

Tableau Server 2019.1.1 バックアップ&ログクリーンナップを自動化する | DevelopersIO

前提条件

バックアップ取得にあたり、以下の設定の Tableau Server を構築済みであるとします。

  • Tableau Server on Windows
    • バージョン:2023.1
    • シングルノード構成
    • アイデンティティストア
      • ローカル
    • 製品インストールディレクトリ:D:\Tableau\Tableau Server
    • 自己証明書で SSL 化済み
    • Tableau Server リポジトリへのアクセス有効化済み
      • readonly ユーザーを作成しパスワードを設定している
    • Tableau Server リポジトリへの通信を SSL 化済み
      • D:\Tableau\Tableau Server\data\tabsvc\config\pgsql_0.20231.23.0613.1501\security
        • server.crt
        • server.key
  • インスタンス
    • m5.4xlarge
    • OS
      • Windows Server 2019
    • ボリュームタイプ:gp2
      • C drive:50 GB
      • D drive:100 GB

取得したバックアップを S3 に配置するために、EC2 に以下の IAM ロールを付与しています。この際、S3 への PUT には AWS Tools for Powershell を使用します。

IAM ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        }
    ]
}

信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

目次

本記事の内容は以下の通りです。

  • バックアップ取得の概要
  • バックアップ
    • 事前準備
    • Tableau Server で管理されるデータのバックアップ
    • 構成およびトポロジデータのエクスポート
  • Tableau Server で管理されるデータのリストア
    • 事前準備
    • リストアの実施
  • バックアップファイルの S3 へのアップロード
  • 構成およびトポロジデータのインポート

後述しますが、リストア時は Tableau Server リポジトリの内容がバックアップ ファイルの内容で上書きされます。

本記事ではリストアまで実施するので、バックアップ取得後に Tableau Server に加えた変更が上書きされる(なくなる)ことで正しくバックアップの取得~リストアまで実施できたと判断します。

バックアップ取得の概要

バックアップの取得にあたり、いくつか注意すべき点もあるので、その概要をみておきます。
ここでは、以下の項目について記載します。

  • バックアップのデータ型
  • バックアップの作成に必要なディスク容量
  • その他のポイント

バックアップのデータ型

Tableau Server で取得可能なバックアップは 2種類あります。

バックアップ-データ型 | Tableau Server on Windows ヘルプ

  • Tableau Server で管理されるデータ
    • Tableau Server 内部の PostgreSQL データベース・リポジトリ、ワークブックとユーザーのメタデータ、データ抽出ファイル、サイト構成データ
    • tsm maintenance backup コマンドで取得する(tsbak 拡張子でバックアップファイルが生成される)
    • バックアップファイルは、バックアップが作成されたバージョンと同じか新しいバージョンの Tableau Server バージョンにのみ復元可能
  • 構成およびトポロジデータ
    • サーバーを完全に復旧するために必要なサーバー構成情報のほとんど
    • SMTP、アラート、一部の認証アセット など
    • tsm settings exportコマンドで取得する(json形式のファイル)
    • ※トポロジ データ
      • 単一サーバーおよび複数ノードでの展開時における Tableau Server プロセスを構成する方法を定義したもの

以下の内容は上記に含まれず、手動でバックアップを取得しておく必要があります。

  • Tableau Server の実行サービスアカウントの情報
    • 既定(NT AUTHORITY\NetworkService)から変更していなければ特に考慮は不要
  • Tableau Server ウェブ ページ用のカスタム ヘッダーまたはサインイン ロゴ
  • 下記以外の認証関連アセット
    • Tableau Server リポジトリのSSL化に使用する 公開証明書と秘密キー (有効化している場合)
    • 外部 SSL の証明書と秘密キー
    • tsm security custom-cert add によってインストールされたカスタム証明書 (追加された場合) がバックアップされる
    • ※これらはバックアップされますが、コピーを別で保管しておくことが推奨されています
  • バックアップされない認証関連アセットとして以下のような情報があります

バックアップの作成に必要なディスク容量

※ここでは、シングルノード構成における見積も方法を記載しています。
各ノードがリポジトリやファイルストアをホストするかどうかで、必要なディスク容量の見積もり方法は異なります。詳細は以下をご参照ください。

バックアップと復元 | Tableau Server on Windows ヘルプ

  • シングルノードでの構成における容量見積もりの方法
    • リポジトリ データ x 3 + 250 MB + ファイル ストア データ x 1.5
      • リポジトリ データのサイズは、[data directory]/pgsql/data/base ディレクトリのサイズを確認
      • ファイル ストア データ (抽出、フローなど) のサイズは、[data directory]/dataengine ディレクトリのサイズを確認

その他のポイント

  • バックアップの取得タイミング
    • バックアップの取得は、リソースを大量に消費するプロセスのため、可能な限りオフピーク時に実行します
  • ストレージのタイプ
    • ストレージのタイプとしては、SSD の利用が推奨されています
  • バックアップファイルの圧縮
    • Tableau Server で管理されるデータのバックアップファイルは、既定で圧縮して生成されます
    • -skip-compression オプションを指定することで、圧縮を使用せずにバックアップを実行できます。バックアップ取得完了までの時間を短縮することを重視する場合、このオプションを使用します
  • 既定以外のドライブに Tableau Server をインストールした場合
  • スケジュールの停止
    • サブスクリプションやスケジュールを設定している場合、バックアップを作成する直前に無効にし、バックアップの完了後に再度有効にすることが推奨されています

バックアップ

事前準備

コンテンツの追加
バックアップを取得するにあたり、Tableau Server 側で以下の作業を実施しておきます。

  • ユーザーの作成

下図の通りユーザーを作成しました。

  • ビュー、抽出の作成

下図の通り、新しいプロジェクト(test)を作成し、ワークブック・抽出をパブリッシュしておきました。

バックアップからデータを復元する(tsm maintenance restore を使用する)と、データ抽出ファイル や Tableau Server リポジトリの内容がバックアップ ファイルの内容に上書きされるので、上記の内容が復元されることを確認します。

バックアップからの復元 | Tableau Server on Windows ヘルプ

サイズの見積もり

ここでは、シングルノード構成に基づき必要なサイズを見積もります。
上述の設定でサイズを見積もると以下のようになっていました。バックアップ取得先がこの見積もりより容量が大きいことを確認しておきます。

  • リポジトリデータ
    • 89.1 MB(D:\Tableau\Tableau Server\data\tabsvc\pgsql\data\base
  • ファイル ストア データ
    • 182 MB(D:\Tableau\Tableau Server\data\tabsvc\dataengine
  • 必要なサイズの見積もり結果
    • 790.3 MB(リポジトリ データ x 3 + 250 MB + ファイル ストア データ x 1.5)

Tableau Server で管理されるデータのバックアップ

  • バックアップ取得先の確認

バックアップ ファイルは、TSM のbasefilepath.backuprestore 変数に定義されたディレクトリに保存されます。以下のコマンドで確認可能です。

>tsm configuration get -k basefilepath.backuprestore
D:/Tableau/Tableau Server/data/tabsvc/files/backups

既定ではC:\ProgramData\Tableau\Tableau Server\data\tabsvc\files\backups\filename.tsbak として保存されます。ここでは変更せずに進みます。
保存先を変更する場合は、tsm configuration set を使用し、変更を適用します。

tsm configuration | TSM - コマンド ライン インターフェイス

  • バックアップの取得

バックアップの取得にはtsm maintenance backup を使用します。
主要なオプションは、以下の通りです。

オプション 種別 概要
f, --file backup_file 必須 バックアップファイルの名称です。
d, --append-date オプション バックアップ ファイル名の末尾に現在の日付が追加されます。
例:back-up-file-name-yyyy-MM-dd.tsbak
-skip-compression オプション バックアップファイルを圧縮せずに出力します。
バックアップの取得に要する時間を短縮できます。
複数ノード構成の場合、ファイル ストア インスタンスを
最初のノードで構成することが推奨されています。
po, --pg-only オプション リポジトリのみのバックアップを取得します。

tsm maintenance | TSM - コマンド ライン インターフェイス

ここでは、f, d オプションを指定することとします。
サブスクリプションやスケジュールが設定されている場合、バックアップ取得前に停止し、以下のコマンドでバックアップを取得します。

tsm stop
tsm maintenance backup -f tableau-server-data -d

実行例

>tsm maintenance backup -f tableau-server-data -d
前回成功した GenerateBackupJob の実行は 2 分かかりました。

ジョブ ID '8'、タイムアウトは 1440 分です。
7% - アクティブ リポジトリ インスタンス、ファイル ストア、クラスタ コントローラを開始しています。
14% - アクティブ リポジトリ、ファイル ストア、クラスタ コントローラが開始するのを待機しています。。
21% - バックアップ サービスをインストールしています。。
28% - 必要なディスク空き容量を見積もっています。
35% - すべてのノードからディスク空き容量の情報を収集します。
42% - ディスク空き容量情報を分析しています。
50% - すべてのノードで利用可能なディスク空き容量を確認しています。
57% - 設定をバックアップしています。
64% - オブジェクト ストレージ データをバックアップしています。
71% - データベースをバックアップしています。。
78% - tsbak アーカイブを組み立てています。                のファイルを処理中。
85% - 必要に応じてアクティブ リポジトリを停止します。
92% - 必要に応じて、アクティブ リポジトリの停止を待機しています。。
100% - バックアップ サービスをアンインストールしています。。
コントローラー ノードで 'D:\Tableau\Tableau Server\data\tabsvc\files\backups\tableau-server-data-2023-08-03.tsbak' にバ ックアップが書き込まれました。

実行例の最終行にあるように、basefilepath.backuprestore 変数に定義されたディレクトリにバックアップファイルが保存されます。

構成およびトポロジデータのエクスポート

こちらはtsm settings export を使用します。

-f オプションで、出力先のパスとファイル名を指定します。

tsm settings | TSM - コマンド ライン インターフェイス

以下のように出力先をオプションで指定し、実行します。

tsm settings export -f D:\setting_backups\tableau-server-setting.json

実行後、指定のフォルダに以下のような jsonファイルが作成されます。

tableau-server-setting.json
    {
      "configKeys" : {
        "config.version" : 25,
        "tabadmincontroller.port" : "8850",
        "k8s.under.tsm" : "false",
        "features.TabadminService" : true,
        "tableau_projects.language" : "ja",
        "shareproductusagedata.enabled" : true,
        "wgserver.domain.ldap.bind" : "simple",
        "wgserver.domain.port" : 0,
        "wgserver.domain.nickname" : "WORKGROUP",
        "wgserver.domain.allow_insecure_connection" : false,
        "wgserver.domain.directoryservice.type" : "activedirectory",
        "wgserver.domain.ldap.starttls.enabled" : true,
        "wgserver.domain.ssl_port" : 0,
        "gateway.trusted_hosts" : "",
        "gateway.trusted" : "",
        "install.firewall.gatewayhole" : true,
        "service.windows.local_service_user" : "NT AUTHORITY\\LocalService",
        "service.windows.network_service_user" : "NT AUTHORITY\\NetworkService",
        "service.windows.privileged_user" : ".\\LocalSystem",
        "install.component.samples" : true,
        "wgserver.authentication.legacy_identity_mode.enabled" : false,
        "pgsql.readonly.enabled" : true,
        "pgsql.ssl.cert.bytes" : "XXX",
        "pgsql.ssl.key.bytes" : "XXX",
        "pgsql.pgbouncer.client.ssl.key.bytes" : "XXX",
        "pgsql.pgbouncer.client.ssl.cert.bytes" : "XXXX",
        "pgsql.ssl.enabled" : true,
        "pgsql.ssl.required" : false,
        "ssl.key.file_bytes" : "XXX",
        "ssl.cert.file_bytes" : "XXX",
        "ssl.enabled" : true,
        "ssl.proxy_login" : false,
        "ssl.ciphersuite" : "HIGH:MEDIUM:!EXP:!aNULL:!MD5:!RC4:!3DES:!CAMELLIA:!IDEA:!SEED",
        "ssl.protocols" : "all +TLSv1.2 -SSLv2 -SSLv3 -TLSv1.3",
        "ssl.client_certificate_login.fallback_to_password" : false,
        "ssl.client_certificate_login.required" : false,
        "ssl.client_certificate_login.min_allowed.rsa_key_size" : 2048,
        "ssl.key.file_name" : "server.key",
        "ssl.redirect" : true,
        "ssl.force_https_for_public_embed" : false,
        "ssl.port" : 443,
        "ssl.client_certificate_login.mapping_strategy" : "upn",
        "ssl.client_certificate_login.min_allowed.elliptic_curve_size" : 256,
        "ssl.cert.file_name" : "server.crt"
      },
      "topologyVersion" : {
        "nodes" : {
          "node1" : {
            "services" : {
              "tdsnativeservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "siteimportexport" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "backuprestore" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "apigateway" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "minerva" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "backgrounder" : {
                "instances" : [ {
                  "instanceId" : "0"
                }, {
                  "instanceId" : "1"
                } ]
              },
              "clustercontroller" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "allegro" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "activationservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "metrics" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "vizportal" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "activemqserver" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "dataserver" : {
                "instances" : [ {
                  "instanceId" : "0"
                }, {
                  "instanceId" : "1"
                } ]
              },
              "gateway" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "clientfileservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "licenseservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "nrs" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "analyticsextensions" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "querypolicy" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "indexandsearchserver" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "tdsservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "nlp" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "statsservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "extractservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "flowprocessor" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "flowminerva" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "floweditor" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "datastories" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "vizqlserver" : {
                "instances" : [ {
                  "instanceId" : "1"
                }, {
                  "instanceId" : "0"
                } ]
              },
              "authnservice" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "hyper" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "cacheserver" : {
                "instances" : [ {
                  "instanceId" : "0"
                }, {
                  "instanceId" : "1"
                } ]
              },
              "querygateway" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "dataprofiling" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "interactive" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "appzookeeper" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "publishedconnections" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "searchserver" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "contentexploration" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "tabadminagent" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "noninteractive" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "tabsvc" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "tabadmincontroller" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "databasemaintenance" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "pgsql" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "webhooks" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "collections" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              },
              "filestore" : {
                "instances" : [ {
                  "instanceId" : "0"
                } ]
              }
            }
          }
        }
      }
    }

Tableau Server で管理されるデータのリストア

事前準備

ここでは、同一のインスタンスにて以下の作業を行った後、上記の手順で取得したバックアップからリストアします。

  • ユーザーの追加
  • ビュー、抽出の追加

繰り返しになりますが、バックアップからデータを復元すると、バックアップ ファイルの内容に上書きされるので、バックアップ取得後に追加した内容が、リストアによって上書き(なくなる)されることを確認します。

ユーザーの追加

図のように、temp- から始まるユーザーを追加しました。

ビュー、抽出の追加

こちらも同様に、temp- から始まるプロジェクト・ビュー・抽出を追加しました。

リストアの実施

リストアはtsm maintenance restoreコマンドで実施します。

このコマンドも、TSM の basefilepath.backuprestore 変数で定義したディレクトリにバックアップファイルがあることを前提としています。
既定のディレクトリはC:\ProgramData\Tableau\Tableau Server\data\tabsvc\files\backups\ となっており、変更する際の手順も含めて、バックアップ取得時と同様です。

tsm ファイル パス | TSM - コマンド ライン インターフェイス

今回は、バックアップ取得先にファイルがあるので、特に変更しません。
リストアは以下のコマンドで実施しました。

tsm stop
tsm maintenance restore --file <buckup-file-name>.tsbak
tsm start
実行例
>tsm maintenance restore --file <buckup-file-name>.tsbak
'tableau-server-data-2023-08-03.tsbak' の復元中...
サーバー側のファイル名 'tableau-server-data-2023-08-03.tsbak' を使用しています
ジョブ ID '2'、タイムアウトは 2880 分です。
2% - バックアップの互換性を確認しています。
5% - マニフェストを生成しています。
8% - すべてのサービスを無効化しています。
10% - サービスの停止を待機しています。
13% - 復元サービスをインストール中。。
16% - 各ノードで必要なファイルを確認しています。。
18% - すべてのノードで利用可能なディスク空き容量を確認しています。
21% - バックアップ復元サービスが、バックアップ ファイルにアクセスできることを確認中です。
24% - 必要なファイルをリモート ノードに転送しています。
27% - すべてのサービスを無効化しています。
29% - サービスの停止を待機しています。
32% - ノードの構成バージョンを更新しています。      ョンを更新しています。]
35% - サービスの再構成を待機しています。          を待機しています。]
37% - すべてのサービスを有効化しています。
40% - サービスの開始を待機しています。          を待機しています。]
43% - キー ストアの復元中。
45% - サービス用データの復元中。。
48% - データベースの復元中。。
51% - 資産キーの復元中。。
54% - すべてのサービスを無効化しています。

56% - サービスの停止を待機しています。
59% - ノードの構成バージョンを更新しています。
62% - サービスの再構成を待機しています。
64% - すべてのサービスを有効化しています。
67% - サービスの開始を待機しています。
70% - オブジェクト ストレージにデータを復元中。
72% - サービス用データをコミット中。。
75% - 復元データをデータベースにコミット中。。
78% - 資産キーのコミット中。
81% - オブジェクト ストレージにデータをコミット中。。
83% - 一時バックアップ ファイルを削除しています。
86% - すべてのノードで復元データをクリーンアップ中。
89% - 復元サービスをアンインストール中。。
91% - インデックス作成に必要なサービスを有効にしています。。
94% - Vizportal Maintenance に接続しています。
97% - 検索インデックスを再構築しています。。

100% - インデックス作成に使用されているサービスを無効にしています。

'tableau-server-data-2023-08-03.tsbak' のバックアップは正常に復元されました。

実行後に、コンテンツを確認すると、下図のようにバックアップ取得前の状態に戻っていました。

  • ユーザー
  • ビュー、抽出

バックアップファイルの S3 へのアップロード

一般的にバックアップファイルは別のマシンに保存するので、ここでは EC2 から AWS Tools for Powershell を使用して S3 にアップロードします。
アップロード先の S3 は作成済みとします。それぞれ以下にアップロードすることとしています。

  • Tableau Server で管理されるデータ
    • bucket-name/maintenance-backup
  • 構成およびトポロジデータ
    • bucket-name/setting

以下では、Tableau Server で管理されるデータを S3 にアップロードしています。

## リージョン設定
Set-DefaultAWSRegion ap-northeast-1

## ファイル名
$filePath = "D:\Tableau\Tableau Server\data\tabsvc\files\backups\<buckup-file-name>.tsbak"

## S3バケット名
$S3BucketName ="<bucket-name>"

## S3バケット内のパス(フォルダ名/ファイル名)
$key = "maintenance-backup/<buckup-file-name>.tsbak"         

## チェック
echo $S3BucketName
echo $filePath
echo $key

## S3バケットへファイルをアップロード
Write-S3Object -BucketName $S3BucketName -File $filePath -Key $key

上記のコマンドは、以下の記事を参考にしています。

PowerShellスクリプトサンプル(Tableau ServerのバックアップファイルをS3にアップロード) | DevelopersIO

構成およびトポロジデータのインポート

こちらは新規のインスタンスを構築、Tableau Server のインストール後、ファイルをインポートすることで、その構成が復元されることで確認します。
同様の設定で EC2 インスタンスを構築し、Tableau Server をインストールしておきます。

エクスポートした構成ファイルを配置後、以下のコマンドを実行します。
D:\setting\に配置したtableau-server-setting.jsonというファイル名を指定しています。

tsm settings import --import-config-file D:\setting\tableau-server-setting.json --force-keys

実行例

>tsm settings import --import-config-file D:\setting\tableau-server-setting.json --force-keys
D:\setting\tableau-server-setting.json から読み込んだ構成ファイル。構成ファイルには、runas のユーザー名とパスワードは含 まれていません。インポートした後に、これらの値を明示的に設定する必要があります。

「構成ファイルには、runas~」というメッセージが出力されましたが、ナレッジベースを見ると実行サービスアカウントを変更していない場合特に対応不要なので、このまま確認を進めます。

Message "The configuration file does not include the runas username and password. After importing, these values must be set explicitly" upon running tsm settings import/export command on Tableau Server 2023.1 | Tableau Software

コマンド実行後、TSM で構成を確認すると、外部SSL やリポジトリSSLの設定が、移行前のインスタンスで設定した内容に置き換わっていました。
※反映には再起動が必要です。

バックアップファイルも上述の手順でリストアすれば、インスタンスの移行を伴う Tableau Server のバージョンアップ等にも対応できます。

さいごに

実際にTableau Server のバックアップ・リストアを試してみました。
検証なのでスムーズにいきましたが、実際は様々なエラーが発生することもあるかと思うので、そのあたりも記事にしていければと思いました。
こちらの内容が何かの参考になれば幸いです。今回は以上です。