コントローラー データベースをバックアップして復旧する
Azure Arc データ サービスをデプロイするとき、Azure データ コントローラーはデプロイされる最も重要なコンポーネントの 1 つです。 データ コントローラーには次のような機能があります。
- リソースのプロビジョニング、プロビジョニング解除、更新を行います
- アップグレード、スケールアウトなど、Azure Arc 対応 SQL Managed Instance のほとんどのアクティビティのオーケストレーションを行います。
- 各 Arc SQL マネージド インスタンスの課金と使用状況の情報をキャプチャします。
上記の機能を実行するため、データ コントローラーは、現在のすべての Arc SQL マネージド インスタンス、課金、使用状況、およびこれらすべての SQL マネージド インスタンスの現在の状態のインベントリを格納する必要があります。 このデータはすべて、controldb-0
ポッドにデプロイされた SQL Server インスタンス内の controller
というデータベースに格納されます。
この記事では、コントローラー データベースをバックアップする方法について説明します。
データ コントローラーのデータベースをバックアップする
組み込み機能の一部として、バックアップが有効になると、データ コントローラーのデータベース controller
は 5 分ごとに自動的にバックアップされます。 バックアップを有効にするには:
ReadWriteMany
アクセスをサポートするストレージ クラスを使ってbackups-controldb
PersistentVolumeClaim
を作成します。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
DataController
カスタム リソースの仕様を編集して、backups
ストレージの定義を含めます。
storage:
backups:
accessMode: ReadWriteMany
className: <storage-class>
size: 15Gi
data:
accessMode: ReadWriteOnce
className: managed-premium
size: 15Gi
logs:
accessMode: ReadWriteOnce
className: managed-premium
size: 10Gi
controller
データベース用の .bak
ファイルは、/var/opt/backups/mssql
にある controldb
ポッドの backups
ボリュームに格納されます。
コントローラー データベースを復旧する
2 種類の復旧の可能性があります。
controller
が壊れており、データベースを復元することだけが必要ですcontroller
のデータとログ ファイルを含むストレージ全体が破損または消失しており、復旧する必要があります
破損したコントローラー データベースのシナリオ
このシナリオでは、すべてのポッドが稼働しており、ユーザーは controldb
SQL Server に接続でき、controller
データベースが破損している可能性があります。 バックアップからデータベースを復元することだけが必要です。
SQL Server が controldb
ポッドでまだ稼働していて、それに接続できる場合は、次の手順のようにして、バックアップからコントローラー データベースを復元します。
controller
データベースをホストしている SQL Server ポッドへの接続を確認します。まず、シークレットの資格情報を取得します。
controller-system-secret
は、SQL インスタンスへの接続に使用できるsystem
ユーザー アカウントの資格情報を保持するシークレットです。 シークレットの内容を取得するには、次のコマンドを実行します。kubectl get secret controller-system-secret --namespace [namespace] -o yaml
次に例を示します。
kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
base64 でエンコードされた資格情報をデコードします。 シークレット
controller-system-secret
の yaml ファイルの内容には、password
とusername
が含まれます。 任意の base64 デコーダー ツールを使って、password
の内容をデコードできます。接続の検証: デコードされた資格情報を使い、
SELECT @@SERVERNAME
などのコマンドを実行して、SQL Server への接続を検証します。kubectl exec controldb-0 -n <namespace> -c mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
kubectl exec controldb-0 -n contosons -c mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
次のように、コントローラーの ReplicaSet を 0 レプリカまでスケールダウンします。
kubectl scale --replicas=0 rs/control -n <namespace>`
次に例を示します。
kubectl scale --replicas=0 rs/control -n arcdataservices
ステップ 1 で説明したように、
system
としてcontroldb
SQL Server に接続します。T-SQL を使って、破損したコントローラー データベースを削除します。
DROP DATABASE controller
破損した
controllerdb
が削除された後、バックアップからデータベースを復元します。 次に例を示します。RESTORE DATABASE test FROM DISK = '/var/opt/backups/mssql/<controller backup file>.bak' WITH MOVE 'controller' to '/var/opt/mssql/data/controller.mdf ,MOVE 'controller' to '/var/opt/mssql/data/controller_log.ldf' ,RECOVERY; GO
コントローラーの ReplicaSet をスケールアップして 1 レプリカに戻します。
kubectl scale --replicas=1 rs/control -n <namespace>
次に例を示します。
kubectl scale --replicas=1 rs/control -n arcdataservices
破損したストレージのシナリオ
このシナリオでは、データ コントローラーのデータ ファイルとログ ファイルをホストしているストレージが破損し、新しいストレージがプロビジョニングされたため、コントローラー データベースを復元する必要があります。
次の手順のようにして、controldb
StatefulSet 用の新しいストレージを使って、バックアップからコントローラー データベースを復元します。
controller
データベースの最新の正常な状態のバックアップがあることを確認します次のように、コントローラーの ReplicaSet を 0 レプリカまでスケールダウンします。
kubectl scale --replicas=0 rs/control -n <namespace>
次に例を示します。
kubectl scale --replicas=0 rs/control -n arcdataservices
次のように、
controldb
StatefulSet を 0 レプリカにスケールダウンします。kubectl scale --replicas=0 sts/controldb -n <namespace>
次に例を示します。
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
次の YAML を使って、
controller-sa-secret
という名前の kubernetes シークレットを作成します。apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
kubectl edit sts controldb -n <namespace>
コマンドを使ってcontroldb
StatefulSet を編集し、controller-sa-secret
ボリュームおよび対応するボリューム マウント (/var/run/secrets/mounts/credentials/mssql-sa-password
) をmssql-server
コンテナーに含めます。次のように、
controldb
ポッド用の新しいデータ (data-controldb
) とログ (logs-controldb
) の永続ボリューム要求を作成します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-controldb namespace: <namespace> spec: accessModes: - ReadWriteOnce resources: requests: storage: 15Gi storageClassName: <storage class> --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: logs-controldb namespace: <namespace> spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: <storage class>
次のように、
controldb
StatefulSet をスケーリングして 1 レプリカに戻します。kubectl scale --replicas=1 sts/controldb -n <namespace>
前に作成した
controller-sa-secret
シークレットのパスワードを使い、sa
としてcontroldb
の SQL サーバーに接続します。次のように、
controller-system-secret
kubernetes シークレットのパスワードを使い、sysadmin ロールを持つsystem
ログインを作成します。CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
次のように、
RESTORE
コマンドを使ってバックアップを復元します。
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
controller-db-rw-secret
シークレットのパスワードを使ってcontroldb-rw-user
ログインを作成し (CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
)、コントローラー DB の既存のcontroldb-rw-user
ユーザーに関連付けます (ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
)。TSQL を使って
sa
ログインを無効にします (ALTER LOGIN [sa] DISABLE
)。controldb
StatefulSet を編集し、controller-sa-secret
ボリュームとそれに対応するボリューム マウントを削除します。controller-sa-secret
シークレットを削除します。kubectl scale
コマンドを使い、コントローラー ReplicaSet をスケールアップして 1 レプリカに戻します。