(5-2)大きなSQLテーブルを移行する方法

はじめに



みなさんこんにちは! これは私の最初の記事であり、C#のジュニア開発エンジニアを代表して執筆しています。 したがって、SQLに関する詳細な情報はなく、実際の情報と、私と同じ初心者のために直面​​しなければならなかった明らかではない問題の解決に関する考えだけがあります。



最初に、大きなテーブルを移動する必要が実際に発生する例として、問題の定式化について説明します。



そのため、サービスがユーザーに送信するhtml文字のテーブルを持つWebサービスとSQL(MS-SQL)データベースがあるとします。 手紙は数年間保存され、統計と分析の収集に必要なため削除できません。 ただし、毎年、文字数が増加し、データベースが増加し、SQLサーバー上のスペースが小さくなっています(この場合、別の要因は、時間が比例して増加したため、データベースをテストサイトに復元することでした)する。 幸いなことに、私たちの場合、空き領域がたくさんある無料のサーバーがあります(実際にはそうではなく、もちろんこれは一時的な解決策ですが、これは記事の範囲外です)。 そのため、大きなテーブルを移動するという問題が発生しました(「大きい」と言うと、本当に大きなテーブルを意味します。同様のソリューションを探しているときに見たものはすべて60〜100 GBでした。この場合、テーブルの重量は300 GBを超えていました)。



この問題を解決するいくつかの方法を検討しますが、それらすべてがサーバー間タイプの転送に関連するわけではありません。 同じサーバー内のデータベース間でテーブルを転送する必要がある場合があります。 また、いくつかの方法は純粋に理論的であり、実際にすべてをテストしたわけではありませんが、おそらく機能するはずです。



方法-1。 データ



どのように聞こえるかは関係ありませんが、転送するデータを知っておく必要があります。 ほとんどの場合、データは最適な方法で保存されず、余分な情報も保存されます。 特定のケースでは、すべてのデータを転送せずに実行できる可能性があります。



まず第一に、列を削除することはおそらく役立つかもしれませんが、これはブロック操作であり、Webサービスを常に停止できるとは限りません。 また、Habréには、その実行方法を説明した記事があります。



第二に、正規化を忘れないでください。 おそらく一部のデータは辞書に転送できます(文字の場合、文字の本文ではなく、そこに挿入されるデータを含むテンプレートを保存することができました)。これらの要素のidのみを大きなテーブルに保存できるため、多くのスペースを解放できます。



方法0。SELECTINTO



冗談=)それで、あなたはあなた自身にベースを置くことができるだけです。 ただし、テーブルのサイズが小さい(つまり、ここで何をしているのか)場合は、この命令を使用してデータベースの転送を試みることができます。 また、テストベースがある場合は、「額に」この方法で合計転送時間を推定する実験を行うことができます。



方法1.バックアップ



最も「標準的な」方法で、これが私の問題の解決策になりました。 テーブルを含むデータベースのバックアップを作成し、別のサーバーに復元して不要なものをすべて削除します。 さらに、Webサービスを停止できる場合は、転送されたテーブルにレコードを設定して再デプロイし、古い* *を削除できます(このGoogleでは、SQLをリンクする方法について、結合を使用してクエリを記述する必要が生じる可能性が最も高い場合があります)サーバー)。 これが不可能な場合、最後の文字のIDを修正し(同期のため)、転送されたすべての文字を削除する必要があります(古いテーブルに書き込みを続けます)。



*会話のために別のトピックを削除すると、転送するよりもはるかに高速に見えるかもしれませんが、そうではないため、一般的な場合は部分的に削除することをお勧めします。



方法2:MS-SQL Management Studio



このスタジオがある場合は、組み込みツールを使用してデータをエクスポートおよびインポートできます。 個人的には、スタックオーバーフローで、このことは60ギグのテーブルにかかっていて、何のチャンスもなかったと読みました。



方法3.パーティション



額メソッドの改善。 アイデアは、繰り返しの間にタイマーを使用して通常の方法でデータを転送することです。 すべての行を部分に分割し(たとえば、各100k)、その部分を転送し(すぐに削除できますが、どれだけ安全かはわかりません)、その後、最後まで眠りに落ちます。 最後にデータを同期する必要がないように、最後から転送することをお勧めします。 メソッドは明らかに非常に遅いですが、この方法では、Webサービスを停止せずにすべてを転送します。 SQLスクリプトではなく、ORMの助けを借りて実装する方が便利でしょう。



まとめ



大量のデータを転送するプロセスには常に一定の時間がかかります。このために準備する必要があります。 問題を即座に解決する魔法の方法はありません。 いずれの場合も、ボリュームと制限に基づいて構築する必要があります。 どの方法もうまくいかない場合は、それらの組み合わせを使用できるかどうかを検討してください。



最後に、2つの重要なポイントを追加します。



SQLで行を転送/削除するプロセスは、エラーが発生した場合にすべてをロールバックできるようにトランザクションログに記録されます(これはトランザクションのフレームワーク内でのみ実行されると以前は想定していました)。 さらに、ログのサイズはデータ量よりも少し多く取得されます。 必要なスペースがあることを確認するか、ロギングを無効にしますが、これは安全ではありません。



転送する前に、データファイルとログファイルが適切なサイズであることを確認する必要があります。 拡張操作はかなりの時間を費やし、それに応じて構成するため、移行を最適化できます。

読んでくれたみんなに感謝します! どんな批判、コメント、説明にも喜んでいます。 ビッグデータを操作するための方法とテクニックを次のように共有します 多くの場合、これは非常に重要で必要な情報であり、それほど簡単に見つけることはできません。



All Articles