挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
今回はSQLServerのbcpコマンドでバックアップを取得する際にエラー976が発生し、その対処を行ったため対処法を記載します。
エラー内容
SQLServerのエラー976は以下のものになります。
ターゲット データベース '%.*ls' は可用性グループに参加しているため、現在クエリでアクセスできません。
データ移動が中断されているか、可用性レプリカの読み取りアクセスが有効になっていません。
このデータベースや可用性グループの他のデータベースへの読み取り専用アクセスを許可するには、
グループの 1 つ以上のセカンダリ可用性レプリカへの読み取りアクセスを有効にします。
詳細については、SQL Server オンライン ブックの ALTER AVAILABILITY GROUP ステートメントを
参照してください。
bcpコマンド使用時にこのエラーが発生するのは、可用性グループ(DBダウン時にフェールセーフまたはフェールオーバーのために常時同期される予備のDB群)でセカンダリ(≒予備)に設定されているDBはデフォルトではデータの読み取りができないためクエリやコマンドによるデータの取得はできないのに、bcpでデータを取得しようとしたためエラーに落ちるという流れです。
対応
私の場合はそれまで使用していたbcpコマンドを使用したところ、突然このエラーが発生しバックアップの取得ができなくなったという事象になります。原因は前回実行時にDBでトラブルが発生しプライマリDBとセカンダリDBを入れ替えたことで、コマンド実行時にセカンダリへアクセスしてしまいエラーが発生という流れになります。
このエラーは接続先のDBがセカンダリであることが原因ですので、解消のためには接続先を変える必要があります。データのエクスポートを行うbcpコマンドは以下のようになっていると思います。
bcp [データベース名].[スキーマ名].[テーブル名] out [出力ファイルパス] /S [サーバー名] /c ...(その他認証関連など別オプション)
ここで問題になっているのは/Sで指定される接続先サーバーです。こちらの接続先がセカンダリになっているはずなので、プライマリに変えることで問題を解消することができます。また、デフォルト接続先のインスタンスに接続する際には/Sオプションを省略することが可能です。その場合は既定接続先をプライマリにするか明示的に/Sオプションを追加してプライマリに接続してください。