1

以前の仕事では、次のステートメントを使用して本番環境から簡単にデータをコピーできました。

from テーブル名@UNIXPROD2 INSERT INTO テーブル名@UNIXTEST2

私の現在の仕事のデータベースは、この方法でセットアップされていません。

そのため、MySQL 5.0+ についていくつか調査を行いました。これは、私たちが顧客の 1 人に使用しているものだからです。そして、FEDERATEDテーブルに出くわしたので、読んでいるときにこれを見つけました(here):

MySQL 5.0.46 以降、FEDERATED は一括挿入処理を実行し、複数の行がバッチでリモート テーブルに送信されるようになりました。これにより、パフォーマンスが向上します。また、リモート テーブルがトランザクション対応の場合、エラーが発生した場合に、リモート ストレージ エンジンがステートメントのロールバックを適切に実行できるようになります。この機能には次の制限があります。

これは、(A) prod データベースから test データベースにデータをコピーできることを示しています。(B) 連合テーブルで実行されたアクションは、ソース テーブルでも処理されますが、これは私がやりたいことではありません。実行する必要があるスクリプトがいくつかあり、実際の製品データに対して実行して、製品環境で使用する前に機能することを確認したいと考えています。

私の質問: 私の解釈は正しいですか?

そうであると仮定して、私は試しました:

  • select * from database.tablename@ipaddress を実行しましたが、MySQL のマニュアルで実行中のバージョンを確認するようにというエラー メッセージが表示されました。これは、[質問を投稿] をクリックした後に行うことです。

この件で何か助けていただければ幸いです。

編集:さらに調査した結果、OUTFILE と INFILE を使用して必要なことを実行できる可能性があると思います。これにより、prod テーブルで OUTFILE を使用し、テスト テーブルでそれらの行を INFILE します。考え?

4

1 に答える 1

1

私の答え:

A - 正しい

B - 正しい。

ユーザー権限を読み取り専用に設定することもできますが、あなたの状況では連合テーブルを使用せず、代わりにデータベース全体をファイルにダンプしてから、他のサーバーに復元します。最も簡単な方法 - MySql Workbench を使用します。

連合テーブルに関するいくつかの情報:

  • サーバー B だけでフェデレーションを有効にする必要があります
  • B で連合テーブルを作成することにより、A のビューにアクセスできます。
  • 連合テーブルで INSERT UPDATE DELETE を実行できます
  • 読み取り専用アクセスが必要な場合は、ユーザー権限を制限できます

しかし!集計関数を実行することはできません。フェデレートされるビュー (例: COUNT()、MAX()、UNION...) (可能ですが、遅れます)

  • 作成している連合テーブルに KEY を設定することを忘れないでください。(または、それは恐ろしく遅れます。)
  • ビューで ALGORITHM=MERGE を使用することを忘れないでください
  • サーバーAで(接続文字列から)USERNAMEにアクセス権を付与することを忘れないでください

サーバー B の連合テーブルの例:

delimiter $$
CREATE TABLE `schemaName`.`tableName`(
    `keyName` VARCHAR(10) NOT NULL,
    `key2Name` DATE DEFAULT '2012-01-01',
    KEY `keyName` (`keyName`) 
)
ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://USERNAME:PASSWORD@IPADDRESS:PORTNUMBER/baseSchema/baseTable'
$$

サーバーAのビュー:

CREATE
    ALGORITHM = MERGE
    DEFINER = `ANOTHERUSERNAME`@`%`
    SQL SECURITY DEFINER
VIEW `baseSchema`.`baseTable` AS
    SELECT
        ... AS `keyName`,
        ... AS `key2Name`
    FROM
        ...
于 2012-09-11T11:59:59.817 に答える