背景
かつて、バグを再現するために実稼働データベースのバックアップが必要になったことがありました。
驚いたことに、次の制限に遭遇しました。
- データベースのバックアップは次のバージョンで作成されました SQL Serverの2016 私のものとは互換性がありませんでした SQL Serverの2014.
- 職場のパソコンで使用していたOSは、 Windows 7だから更新できなかった SQLサーバー バージョン2016まで
- サポートされている製品は、密結合された従来のアーキテクチャを持つ大規模システムの一部であり、他の製品やベースとも通信するため、別のステーションに展開するには非常に長い時間がかかる可能性がありました。
上記を踏まえ、私は非標準的なソリューションを採用する時期が来たという結論に達しました。
バックアップからのデータの復元
仮想マシンを使用することを選択しました
仮想マシン上の SQL Server へのアクセスの構成
次に、外部から SQL Server にアクセスできるようにするには、いくつかの手順を実行する必要がありました。
- ファイアウォールの場合、ポート要求をスキップするルールを追加します。 1433.
- サーバーへのアクセスは Windows 認証を経由せず、ログインとパスワードを使用した SQL を経由することが望ましいです (アクセスの設定が簡単です)。 ただし、この場合は、SQL Server プロパティで SQL 認証を有効にすることを忘れないでください。
- SQL Server のユーザー設定タブ ユーザーマッピング 復元されたデータベースのユーザー ロールを指定します db_securityadmin.
データ転送
実際、データ転送自体は XNUMX つの段階で構成されます。
- データ スキーマの転送 (テーブル、ビュー、ストアド プロシージャなど)
- データそのものの転送
データスキーマの転送
次の操作を実行します。
- 選択します タスク -> スクリプトの生成 ポータブルベースに。
- 転送する必要があるオブジェクトを選択するか、デフォルト値のままにします (この場合、すべてのデータベース オブジェクトに対してスクリプトが作成されます)。
- スクリプトを保存するための設定を指定します。 スクリプトを単一の Unicode ファイルに保存するのが最も便利です。 これにより、失敗した場合でも、すべての手順を再度繰り返す必要がなくなります。
スクリプトを保存したら、元の SQL Server (古いバージョン) で実行して、必要なベースを作成できます。
警告: スクリプトの実行後、バックアップからのデータベースの設定とスクリプトによって作成されたデータベースの対応を確認する必要があります。 私の場合、スクリプトに COLLATE の設定がなかったため、追加されたスクリプトを使用してデータを転送し、タンバリンを踊りながらデータベースを再作成するときに失敗しました。
データ転送
データを転送する前に、データベース上のすべての制限のチェックを無効にする必要があります。
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
データ転送はデータインポートウィザードを使用して実行されます タスク -> データのインポート SQL Server 上では、スクリプトによって作成されたデータベースが配置されます。
- ソース (仮想マシン上の SQL Server 2016) への接続設定を指定します。 データソースを使用しました SQL Server ネイティブ クライアント そして前述の SQL 認証。
- 接続先 (ホスト マシン上の SQL Server 2014) の接続設定を指定します。
- 次にマッピングを設定します。 すべて選択する必要があります 読み取り専用ではない オブジェクト (たとえば、ビューを選択する必要はありません)。 追加オプションとして、 「ID 列への挿入を許可する」そのようなものが使用されている場合。
警告: if、複数のテーブルを選択してそのプロパティを設定しようとしたとき 「ID 列への挿入を許可する」 選択したテーブルの少なくとも XNUMX つに対してプロパティがすでに設定されている場合、選択したすべてのテーブルに対してプロパティがすでに設定されていることがダイアログに表示されます。 この事実は混乱を招き、移行エラーにつながる可能性があります。 - 転送を開始します。
- 制約チェックの復元:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
エラーが発生した場合は、設定を確認し、エラーで作成されたデータベースを削除し、スクリプトから再作成し、修正してデータ転送を繰り返します。
まとめ
このタスクは非常にまれであり、上記の制限があるためにのみ発生します。 最も一般的な解決策は、SQL Server をアップグレードするか、アプリケーション アーキテクチャで許可されている場合はリモート サーバーに接続することです。 しかし、レガシーコードや低品質な開発の悪手から逃れられる人は誰もいません。 この説明が必要ないことを願っていますが、それでも必要な場合は、多くの時間と神経を節約するのに役立ちます。 ご清聴ありがとうございました!
使用している資料の一覧
DTS インポート/エクスポート ウィザードを使用してデータをインポートするときに FK 制約を処理するにはどうすればよいですか? 列「列 2」は、複数のコード ページ (65001 および 1252) が指定されているため、処理できません。 ホストの Macbook から VirtualBox 上で実行されている SQLServer に接続するにはどうすればよいですか。 SQL SERVER - ID 挿入の有効化 - インポート エキスパート ウィザード Microsoft SQL Server エラー 18456 のトラブルシューティング、ユーザーのログインに失敗しました
出所: habr.com