MySQLの実際の45の研究ノートは言う:最速の方法は、テーブルをコピーする方法?(例えば41)

まず、このセクションでは、概要を説明します

前回の記事で、私は最後に、あなたは質問が2つの表にデータをコピーする方法である左。あなたは、ソーステーブルの走査線の数を制御し、範囲をロックすることは非常に小さいことができれば、我々は単に、インサートを使用して... select文を実現することができます。

もちろん、ソーステーブルに追加することを避けるためにロックを読んで、より安全な解決策は、第一の外部テキストファイルにデータを書き込み、再びターゲット表に書き込むことです。このとき、2つの一般的に用いられる方法があります。次のどのような、私が詳細にどのようなこれらの2つの方法をあなたを取るでしょう。

例示の目的のために、私は、テーブルdb1.t 1000を作成し、同じ構造を持つテーブルを作成し、データの行を挿入db2.t.

データベースDB1を作成します。
DB1を使用します。

テーブルt(ID INT主キー、INT、B int型、インデックス(a))は、エンジン= InnoDBテーブルを作成します。
区切り記号;; 
  手続きIDATA()を作成し
  始め
    、私はint型宣言を。
    Iに= 1を設定します。
    (iは= 1000 <)しながら行う
      t値(I、I、I)に挿入します。
      セットiは= I 1を+。
    エンド間; 
  終わり;; 
区切り文字; 
IDATA呼び出し(); 

データベースDB2を作成します。
db1.tのようなテーブルdb2.tを作成します

我々は> 900ラインの内側db1.tデータがdb2.t.に挿入し、引き出したいと

二、mysqldumpをする方法

意味の1、mysqldumpを主なパラメータ

一つの方法は、INSERT文のセットにデータをエクスポートするためのmysqldumpコマンドを使用することです。次のコマンドを使用することができます

mysqldumpを-h $ホスト-P $ポート-uは$ユーザー--add-ロック= 0 --no-作成-情報--single-トランザクション--set-GTIDパージ= OFF DB1トン--where = "A> 900" --resultファイル= / client_tmp / t.sql

一時ファイルに出力。

次のようにこのコマンドは、主なパラメータは次のとおりです。

  • 1. -single-トランザクションデータをエクスポートする際に、追加のテーブルロックテーブルdb1.tを必要としない行動が、一貫したスナップショット方式でのSTART TRANSACTIONを使用します。
  • 2. -add-ロックが0に設定され、それは増加させることなく、ファイル内の結果の出力を示す「Tが書き込みロックテーブルを、」。
  • 3. -no-作成-infoがテーブル構造をエクスポートする必要はありません意味します。
  • 4. -set-GTIDパージ=オフ出力がGTID関連付けられていないことを示しています。
  • 5. -resultファイルは、ファイルがクライアントマシンにクライアントを表すために生成された出力ファイルへのパスを指定します。

このコマンドによってt.sqlのmysqldumpファイルは、図2に示すINSERT文が含まれて生成します。

部分的な結果の出力ファイル1つのmysqldumpを図。

あなたは、データを書き込む際に、実行速度が速くなることができ従って、この文書を使用することですより多くの価値の権利が含まれますINSERT文を参照してくださいすることができます。

あなたがデータの唯一の1行を挿入するINSERT文でファイルを生成したい場合は、mysqldumpをコマンドの実装では、パラメータ-skip-拡張のインサートを追加することができます。

その後、あなたはそれを行うには、DB2ライブラリーには、このコマンドこれらのINSERT文を以下のように使用することができます。

mysqlの-h127.0.0.1 -P13000 -urootのDB2 -e "ソース/client_tmp/t.sql"

2、ソースは、SQL文が、クライアントのコマンドではありません

これは、ソースがSQL文が、クライアントのコマンドではありません、注意すべきです。コマンド処理を実行するためのmysqlクライアントは、このようなものです:

1.ファイルは、デフォルトでは、SQL文のセクションを読んで終わりにセミコロン;
を実行するサーバーに送信2. SQL文。

言い換えれば、ない声明この「t.sqlソース」のサーバー側の実行が、INSERT文で。だから、それはスロークエリログ(スローログ)にあるかどうか、またはバイナリログでは、これらのレコードは、本当に実行される
INSERT文を。

第三に、輸出のCSVファイル

1.エクスポートCSVファイルの考慮事項

別のアプローチは、直接、.csvファイルに結果をエクスポートすることです。MySQLは結果を照会するには、次の構文を提供します

サーバーのローカルディレクトリにエクスポートします。

'/server_tmp/t.csv' OUTFILEへ> 900 db1.tから選択*;

私たちは、このステートメントを使用するときは、次の点に注意を払う必要があります。

1.この文は、サーバー側で結果を保存します。あなたが同じマシン上にないクライアントとMySQLサーバのコマンドを実行すると、クライアントマシン上の一時ディレクトリはt.csvファイルを生成するつもりはありません。
outfileを指定した場所に生成(/ server_tmp /)ファイルに2、位置パラメータは、対象でなければならない
secure_file_privの制限。またsecure_file_privパラメータ値とアクションは、次のとおりです。

    • あなたは空に設定した場合、安全でない配置されて生成されたファイルの場所を限定するものではありません。
    • パスの文字列表現に設定した場合、それが唯一の指定されたディレクトリを生成されたファイル、またはサブディレクトリに必要とされます。
    • NULLに設定されている場合、それは意味OUTFILE操作に...このMySQLインスタンス上での選択の実行を禁止します

3.このコマンドは、ファイルを上書きする助けにはなりませんので、このファイルが存在しない/server_tmp/t.csvあなたは確認する必要があり、またはステートメントがあるため、同じ名前のファイルやエラーの存在になります実行されたとき。
4.このコマンドは、テキストファイル、テキストファイルの原理に対応する行のデータラインを生成します。フィールドが含まれている場合は、テキストの改行で改行が生成されます。しかし、同様の改行、タブなどの記号、フロント
フィールド間のデータ線との間にデリミタ領域を分離することができるように、顔は、エスケープ文字は「\」を維持します。

.csvファイルをエクスポート取得した後、あなたは、次のコマンドを使用して、負荷データにおけるターゲット表db2.tにデータをインポートすることができます。

LOAD DATA INFILEテーブルdb2.tに '/server_tmp/t.csv';

2、負荷データフロー文が実行されます

.csvファイルをエクスポート取得した後、あなたは、次のコマンドを使用して、負荷データにおけるターゲット表db2.tにデータをインポートすることができます。

次の文に示すように、この処理が行われます。

1.ファイル/server_tmp/t.csv、記録の間にセパレータとしてのフィールド、改行(\ n)の間の区切り文字としてタブ(\ tの)によって、データを読み出すために、
2スタートトランザクションを。
3.各行のフィールドの数を分析する同じテーブルdb2.tあります。

    • 同じでない場合は、直接のエラーは、トランザクションがロールバックされます。
    • はい、行に設定されている場合、InnoDBのエンジンインターフェースコールは、テーブルに書き込まれます。

4.手順3を繰り返し、ファイル全体が完成/server_tmp/t.csvに読み込まれるまで、トランザクションがコミットされます。

3の後、binlog_format = if文、バイナリログに記録されているこのロードステートメントは、どのようにスタンバイ・データベースでそれを再生しますか?

binlog_format =文は、バイナリログに記録されているこのロードステートメントは、どのようにスタンバイ・データベースでそれを再生する場合は、将来的には、疑問を持っていること?

唯一のオリジナル書面のビンログを置くために、実装の準備の時にライブラリは、ドキュメントをローカルマシン上のライブラリによって調製されていない場合/server_tmp/t.csvファイルは唯一、ホストコンピュータのメインのライブラリに保存されているので、それがにつながります停止ステップスタンバイ同期

図4に示すように、負荷データの処理の完全な実装

したがって、このステートメントの実装の完全なプロセスは、実際には、以下の通りです。

1.メインライブラリの実装が完了した後、書き込んだファイルの内容は、直接バイナリログファイルを/server_tmp/t.csv。
2.データをローカルのINFILEのbinlogファイル「を/ tmp / SQL_LOAD_MB-1-0'INTOのTABLEロードするための文で書く `db2`.`t`を。
3.ライブラリによって到達binlogのログ。
4.このトランザクションログの実行にスレッドライブラリ装置を適用します。

。SUMMARY t.csvファイルの最初のbinlogは一時的にローカルディレクトリを/ tmp / SQL_LOAD_MB-1-0に書き込まれ、読み出され;
Bは、挿入ライブラリに用意されたテーブルをdb2.tために、文の負荷データを実行します。メインデータベース内の同じデータ。

実行プロセスは、図2に示します。

図2負荷データ同期プロセス。

、「ローカル」よりも、ライブラリ内で実行負荷データここに準備されたステートメントを、注意してください。それは、「顧客がローカルファイル/ tmp /コンテンツSQL_LOAD_MB-1-0機械の、このコマンドの終了を実行し、中にターゲット表db2.tにロードされます。」という意味します

図5は、負荷データは、2つの方法でコマンド

1.ファイルがsecure_file_priv指定されたディレクトリやサブディレクトリにある必要があり、ファイルサーバに読み込まれ、「ローカル」を追加しないでください。
2.アドオンは、「ローカル」、クライアントのファイルを読んで、限り、クライアントは、MySQLへのアクセス権を持っているとして、ファイルのパーミッションをすることができます。このとき、MySQLクライアントは、最初にローカルファイルサーバを通過し、その後、上記負荷データフローを実行します。

また、OUTFILE方法に...選択したファイルのテーブル構造を生成しませんので、我々はまた、コマンドテーブル構造の定義を取得した別の派生データを必要に応じて、ことに注意してください。-tab mysqldumpをパラメータテーブルを同時に接合導出することができる提供
構造CSVデータファイルと定義ファイルを。次に、このコマンドの使用は次のとおりです。

mysqldumpを-h $ホスト-P $ポート-uの$ユーザー---シングルトランザクション--set-GTIDパージ= OFF DB1さt --where = "> 900 A" --tab = $ secure_file_priv

このコマンドは、CSVデータファイルが保存されているt.txt作成、t.sql table文を構築するために保存したファイルを作成し、$ secure_file_priv定義されたディレクトリの下になります。

第四に、物理的なコピー方法

1、db2ディレクトリーに直接コピーする.frmファイルdb1.tテーブルとの.ibdファイル、実行可能?

mysqldumpを我々は方法が挙げ前述およびCSVファイルの導出方法は、論理的アプローチガイドデータであり、データは、表db1.t、テキストの世代から読み出され、その後、宛先表db2.t.に書き込まれます

あなたは、物理的なデータの方法は、それを案内し、求めることができますか?たとえば、テーブルに直接.frmファイルをコピーし、実行可能な、db2ディレクトリーにdb1.tファイルをの.ibd?

答えは受け入れられません。

InnoDBのテーブル、ので、これらの2つの物理ファイルを含むことに加えて、データ・ディクショナリに登録する必要があります。ダイレクトコピー文書、データはこの表db2.t辞書にはないので、システムはそれらを受け入れると認識しませんどちらも

達成するために、テーブルの2、MySQLの5.6ステップ物理コピー

しかし、MySQLの5.6バージョンが使用可能なテーブルスペース(トランスポータブル表)を送信するための方法を導入した導入+表領域、テーブルの機能物理コピーの方法によって導出することができます。

次のように我々は今、db1のライブラリを目指していると、テーブルt rの同じテーブルのコピーを、具体的な実施手順は次のとおりです。

1.同じテーブル構造を持つ空のテーブルを作成し、トンのような表を作成し、Rを実行します。
2. ALTER TABLE rの廃棄表領域を実行し、この時間r.ibdファイルが削除されます。
3.実装フラッシュテーブルtを輸出するために、この時間DB1ディレクトリを次のファイルt.cfgを生成する;
DB1ディレクトリで行わ4のCP t.cfgのr.cfg; CP t.ibd r.ibd、両方のコマンド(ファイルの2つのコピーが得られることに留意すべきです、 MySQLのプロセス)は読み書きアクセスしておく必要があります。
5.テーブルのロックを解除行い、この時間t.cfgファイルが削除されます。
6.以来、テーブルRのインポート表領域、新しい表スペースのテーブルRとして、このr.ibdファイルを変更し実行しますデータコンテンツ及びこの文書t.ibdは同じであるので、テーブルと同じデータTのテーブルRが存在するであろう。

このように、テーブルデータは、操作が完了したコピーします。次のように実行プロセスは次のとおりです。

図物理コピーテーブル3

図3に示すように、物理的なコピー方法の考慮事項

テーブルのこのプロセスのコピーについては、いくつかの点注意があります。

1.テーブル全体db1.t、flsuh tableコマンドを実行した後、ステップ3は読み取り専用された後、unlocktablesの実施後放出を注文するまでロックを読み取る;
2.ファイルテーブルスペースIDを可能にするために、インポートテーブルスペースを行う際そして、一貫性のあるデータ・ディクショナリ、r.ibd表スペースIDを変更します。そして、この表スペースIDは、各データページに存在します。このように、あれば
あなたには、いくつかの時間がかかるimport文の実装が表示されますので(例えばTBレベルなど)の大きなファイル、データの各ページには、変更する必要があります。ロジックを導入する方法に比べて場合はもちろん、時間のかかるインポート文は非常に短いです。

V.の概要

今日、この記事では、私は3と別のテーブルのデータテーブルをインポートする方法を紹介します。
のは、これらの3つのアプローチの長所と短所を比較してみましょう。

1.特に大規模なコピー用紙のための物理コピー最速の方法は、最速の方法です。誤って削除する前に、一時的なデータベースのバックアップとリカバリと誤ったパンクチャリングテーブルの発生は、その後、復元、一時的なリポジトリ図書館の生産にシートをコピーする場合
、データに最速の方法を。しかし、このアプローチはまた、いくつかの制限があります。

  • 表には一部のデータのみをコピーすることができないの完全なコピーでなければなりません。
  • あなたは、ユーザーがデータベースホストのログを記録することができないシナリオで使用することはできませんサーバーにデータをコピーする必要があります。
  • コピーすることにより、物理ファイルの使用が実装されているために、ソースとターゲットのテーブルがInnoDBエンジンを使用しています

mysqldumpをINSERT文ファイルの生成を用いる方法は、フィルタパラメータは、データの一部のみ輸出を達成するための条件に増加させることができます。この方法の1つの欠点は、あなたがこのような複雑な結合を使用することはできませんということです
条件の文言を。

3.選択... OUTFILE方法に最も柔軟性があり、それはすべてのSQLの書き込みをサポートしています。しかし、この方法の欠点は、あなただけのテーブルにデータをエクスポートすることができ、およびテーブル構造はまた、個別にバックアップの追加文を必要とすることです。
後者の二つは、クロスエンジンとすることができる、論理的なバックアップです。

最後に、私はバーに思考を残します。

ビンログコマンド負荷データがローカルで記録されたとき、私たちは以前binlog_format =文を記述しました。このコマンドは実行するには、スタンバイ・データベースに送信されますので、スタンバイ・データベースがローカルで実行されたときに、なぜ、実行し
、我々はそれこのローカル必要ですか?ローカルずにコマンドをbinlogの書かれた場合、どのような問題が起こるのだろうか?

あなたは、私は次の記事を終了し、あなたがこの問題を議論、コメント欄にあなたの分析を書くことができます。聴いてくれてありがとう、あなたは一緒に読むためにもっとたくさんの友達にこの共有を送るために歓迎されています。

第六に、時間の問題について

私は記事のタイトルは最後の答えは、今日、この記事のボディを行われている、あなたを残したと思います。コメント欄の記事では、私はあなたと共有するためにここにいる、いくつかの非常に良いメッセージがあります。

@huolang学生が質問を:セッションA GET C =録音5ロックは書き込みロックであれば、なぜセッションBを追加し、セッションCのC = 5のリードは、それをロックすることができますか?

ネクストキーロックはロックプラスレコードロックと相まってギャップ、することがあるためです。プラスギャップロックは成功し、プラスレコードロックがブロックされます。あなたはこのプロセスについて質問がある場合は、その後、関連するコンテンツの最初の30件の記事の上に行くことができます。

@だけ偉大な学生は、クリアランスロック効果を追加した文を挿入し、後に主キー違反を検証するために実験を行いました。例としては、私が体内に前回の記事で述べたことは、より直感的なのデッドロックにつながるよりも、この知識のための彼の非常に良い理由反映ロールバック
ソリューションと思考を、それは賞賛です。

MySQLの8.0バージョンで検証学生を@roaming、我々は、元のテーブルに記述された一時表の挿入... select文に対処することができました。

@同志ヤンの答えは、この記事では、いくつかの方法が私たちのに来る言及しています。

おすすめ

転載: www.cnblogs.com/luoahong/p/11763557.html