Mysqlコピー表の3つの実現方法とgrant解析


どのように速く表をコピーしますか?
まずテーブルdb 1.tを作成し、1000行のデータを挿入し、同じ構造のテーブルdb 2.tを作成します。
仮に、db 1.tの中のa>900のデータ行を導き出す必要があると仮定して、db 2.tに挿入する。
mysqldumpメソッド
いくつかのキーパラメータのコメント:
  • Csingle-transactionの役割は、データを導出する際に、表db 1.tにロックをかける必要があります。
  • を使用します。
  • START TRANSACTION WITH CONSISTENT SNAPSHOPの方法。
  • Cno-creat-infoの意味は、不が表構造を導出する必要があるということです。
  • Cresult-fileはファイルの遼径を指定しています。ここで、clientは生成されたファイルはクライアント機ﲀ上にあると表しています。
  • csvファイルをエクスポート
    select*from db 1.t where a>900 into out file'/server_tmp/t.csv';
    この語は結果をサービスに保存します。日本語の命令を持っているクライアントとMySQLサービスが同じマシンにある場合、クライアント機の臨時ディレクトリの下に、t.csvファイルが生成されます。
    このコマンドはファイルを上書きしてくれますので、セーバーを確保してください。tmp/t.csvというファイルがあります。でないと、不語を持っている時、同名のファイルがありますから、間違いを申し込みます。
    csvを取得してファイルをエクスポートしたら、次のロードdataコマンドでターゲットテーブルdb 2.tにデータをインポートできます。
    load data infile'/server_tmp/t.csv'into table db.2 t
    ファイルを開く/server_tmp/t.csvは、フィールド間の区切り記号としてタブ(\t)を使用して、かたくなな人との間の区切り記号として、日本語のデータを読み込みます。
    事務を開始する。
    各タイプのフィールド数は表db 2.tと同じかどうかを判断します。
  • もし不が同じであれば、直接にエラーを報告し、事務がロールバックします。
  • もし同じなら、1つのタイプに构造して、InnoDBエンジンインターフェースを呼び出して、表に书き込みます。
  • ステップ3を繰り返します。tmp/t.csvファイル全体の読み込みが完了しました。事務を提出します。
    物理的なコピー方法
    mysqldumpメソッドとCSVファイルをエクスポートする方法は、いずれも論理ガイドデータの方法であり、つまりデータを表db 1.tから読み、テキストを生成してから、ターゲットテーブルdb 2.tに書き込みます。桜の木のデータを導く方法がありますか?例えば、db 1.tテーブルの.framファイルと.ibdファイルを直接db 2ディレクトリにコピーしてもいいですか?答えは不唳唳のです。
    なぜなら、InnoDBテーブルは、この二つの桜のファイルを含む以外に、データ辞書に登録する必要があります。この二つのファイルを直接コピーすると、データ辞書にはdb 2.tという表がないので、システムはそれらを識別して受け入れます。
    MySQL 5.6バージョンで、転送テーブル空間を導入する方法で、表空間を導出+導入することで、コピーテーブルの機能を実現します。
    現在の目標がdb 1のライブラリの下にあると仮定して、表tと同じテーブルrをコピーし、具体的にステップを実行する。
  • create table r like tを実行して、同じテーブル構造の空テーブルを作成します。
  • は、アレタテーブルdiscardテーブルspaceを実行すると、r.ibdファイルが削除されます。
  • flush table t for exportを実行すると、t.cfg
  • が生成されます。
  • 、db 1ディレクトリの下で、咻cp t.cfg r.cfgを执ります。cp t.ibd r.ibd;この二つの命令
  • 唴unlock tablesを持っていると、t.cfgファイルが削除されます。
  • は、このr.ibdファイルをテーブルrの新しいテーブル空間として持っていますが、このファイルのデータ内容はt.ibdと同じですので、テーブルrには_;とテーブルtと同じデータがあります。
  • この3つの方法の長所と短所
    桜のコピー方法は一番速くて、特に大きい表のコピーにとって一番早い方法です。全部コピーしなければならないです。部分コピーではなく、サーバーにデータをコピーする必要があります。ユーザーがデータベースホストにログインできない時は使えません。ソーステーブルとターゲットテーブルはinnodbエンジンでなければなりません。
    INSERT語句を含むファイルをmysqldumpで生成する方法で、whereパラメータにフィルタ条件を追加して、部分データのみを導出することができます。この方式の不足の一つは、ジョインという複雑なwhere条件の書き方ができます。
    select…into outfileを使う方法は最も柔軟で、すべてのSQLの書き方をサポートします。しかし、この方法の欠点の一つは、毎回表のデータだけを導き出すことができます。また、表の構造も別の言語バックアップが必要です。
    後の二つは全部論理バックアップ方式で、エンジンをまたぐことができます。
    mysqlグローバル権限
    SELECT*FROM MYSQL.USER WHERE USER='UA'\Gはすべての権限を表示します。
    機能領域全体のmysqlは、情報をmysqlのuserの表に保存します。
    ユーザに最高の権限を与える:grant all privileges on *.* to 'ua'@'%' with grant option;このgrantコマンドは、ディスク内のmysql.userの表里をYにし、メモリ内のacl_にします。userでユーザーが対応するオブジェクトは、access値を‘全1’に変更します。
    新しいクライアントがユーザ名uaでログインできたら、mysqlは新しい接続のためにスレッドオブジェクトを維持します。全体の権限についての判断は、スレッドオブジェクト内部に直接保存されている権限ビットです。
    grantコマンドは、グローバル権限に対して、ディスクと対応するメモリを同時に更新します。次に作成した接続は新しい権限を使います。
    既に存在している接続に対しては、グローバル権限はgrantの影響を受けない。
    上のパーミッションを回収する場合:revoke all privileges on *.* from 'ua'@'%';同じく対応する2つの操作であり、ディスク内のパーミッションフィールドはビットNを変更し、メモリ内のオブジェクトのaccessの値はビット0を修正する。
    mysqlDB権限grant all privileges on db1.* to 'ua'@'%' with grant option;SELECT*FROM MYSQL.DB WHERE USER='UA'\Gを使って現在のユーザのdb権限を調べます。同様にディスクとメモリ中のオブジェクトに対して権限を変更します。
    dbパーミッションはmysql.dbテーブルに格納されています。
    注意:グローバル権限とは異なり、db権限は既に存在している接続先に影響を与えます。
    mysql表の権限と列の権限
    表の権限はmysql.tablesに置く。privでは、列の権限はmysql.com lumnsに保存されます。privでは、これらの権限を組み合わせてメモリに格納するhash構造のcolumn_prvhashの中。
    dbの権限と似ています。この二つの権限は、grantのたびにデータテーブルを修正し、メモリ内のsh構造を同時に修正します。したがって、これらの権限の操作は、既存の接続にも影響します。
    flash prviegesの使用シーン
    いくつかの文書では、grant後にflush privegesコマンドを実行すると、賦権文が有効になります。データテーブルの権限がメモリ中のパーミッションデータと一致しない場合、flash priveges文はメモリデータを再構築するために使用されて、一致した状態になるということです。
    例えば、ある時点でデータテーブルの記録を削除しましたが、メモリのデータがまだ存在していて、ユーザへの権限付与に失敗しました。データテーブルに記録が見つからないからです。
    同時にこのユーザーを再作成してもいけません。メモリで判断すると、このユーザーはまだいると思います。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。