Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


17.4.1.27 サーバー側ヘルプテーブルのレプリケーション

サーバーは、HELP ステートメントの情報を格納するテーブルを mysql データベース内で保持します (セクション13.8.3「HELP 構文」を参照してください)。これらのテーブルは、セクション5.1.10「サーバー側のヘルプ」で説明したとおり、手動でロードできます。

ヘルプテーブル内容は MySQL リファレンスマニュアルから抽出されます。各 MySQL リリースシリーズに固有のマニュアルバージョンがあるため、ヘルプの内容も各シリーズに固有です。一般的には、サーバーバージョンに一致するバージョンのヘルプ内容をロードしてください。これはレプリケーションに密接な関係があります。たとえば、MySQL 5.5 マスターサーバーには MySQL 5.5 ヘルプ内容をロードしますが、5.6 ヘルプ内容がより適している MySQL 5.6 スレーブサーバーには必ずしもその内容を複製する必要はありません。

このセクションでは、サーバーがレプリケーションに参加するときに、ヘルプテーブル内容の更新をどのように管理するかについて説明します。サーバーバージョンがこのタスクの 1 つの要因です。もう 1 つは、ヘルプテーブル構造がマスターとスレーブで異なる場合があることです。

ヘルプ内容が fill_help_tables.sql という名前のファイルに格納されているとします。MySQL 配布では、このファイルは share または share/mysql ディレクトリの下にあり、最新版はいつでも https://dev.mysql.com/doc/index-other.htmlからダウンロードできます。

ヘルプテーブルをアップグレードするには、次の手順を使用ます。ここで説明する mysql コマンドの接続パラメータは示されていません。どのような場合でも、mysql データベース内のテーブルを変更するための権限を持つ、root などのアカウントを使用してサーバーに接続してください。

  1. mysql_upgrade をまずスレーブ上で実行してからマスター上で実行することで、サーバーをアップグレードします。スレーブを最初にアップグレードするというのが一般原則です。

  2. ヘルプテーブル内容をマスターからそのスレーブに複製するかどうかを決めます。しない場合は、マスターと各スレーブに個別に内容をロードします。または、マスターおよびそのスレーブ上のヘルプテーブル構造の非互換を確認し、ある場合は解決してから、内容をマスターにロードしてそこからスレーブに複製します。

    ヘルプテーブル内容をロードするためのこれらの 2 つの方法をこれから詳しく説明します。

スレーブへのレプリケーションなしでヘルプテーブル内容をロードする

ヘルプテーブル内容をレプリケーションなしでロードするには、サーバーバージョンに適した内容を含む fill_help_tables.sql ファイルを使用して、マスターおよび各スレーブで個々に次のコマンドを実行します (コマンドは 1 行に入力します)。

mysql --init-command="SET sql_log_bin=0"
  mysql < fill_help_tables.sql

レプリケーショントポロジ内でスレーブがほかのスレーブのマスターとしても動作している場合は、各サーバー (スレーブを含む) に --init-command オプションを使用します。SET ステートメントはバイナリロギングを抑止します。アップグレードする各サーバーでコマンドが実行されると、完了です。

スレーブへのレプリケーションありでヘルプテーブル内容をロードする

ヘルプテーブル内容を複製しない場合は、マスターとそのスレーブ間のヘルプテーブル非互換を確認します。help_category および help_topic テーブル内の url カラムは、最初は CHAR(128) でしたが、長い URL に対応するために新しい MySQL バージョンでは TEXT です。ヘルプテーブル構造を確認するには、次のステートメントを使用します。

SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'mysql'
AND COLUMN_NAME = 'url';

古い構造のテーブルの場合、ステートメントは次の結果を返します。

+---------------+-------------+-------------+
| TABLE_NAME    | COLUMN_NAME | COLUMN_TYPE |
+---------------+-------------+-------------+
| help_category | url         | char(128)   |
| help_topic    | url         | char(128)   |
+---------------+-------------+-------------+

新しい構造のテーブルの場合、ステートメントは次の結果を返します。

+---------------+-------------+-------------+
| TABLE_NAME    | COLUMN_NAME | COLUMN_TYPE |
+---------------+-------------+-------------+
| help_category | url         | text        |
| help_topic    | url         | text        |
+---------------+-------------+-------------+

マスターとスレーブの両方が古い構造の場合、または両方が新しい構造の場合は、互換であるため、マスターで次のコマンドを実行することでヘルプテーブル内容を複製できます。

mysql mysql < fill_help_tables.sql

テーブル内容はマスターにロードされてから、スレーブに複製されます。

マスターとスレーブのヘルプテーブルが非互換の場合は (一方のサーバーが古い構造で、もう一方が新しい構造)、ヘルプテーブル内容を最終的に複製しないか、または内容を複製できるようにテーブル構造を互換にするかを選択できます。

  • 最終的に内容を複製しないことを決めた場合、すでに説明したように、--init-command オプション付きの mysql を使用してマスターとスレーブを個々にアップグレードします。

  • そうではなく、テーブル構造に互換することを決めた場合は、サーバー上の古い構造のテーブルをアップグレードします。マスターサーバーのテーブル構造が古いとします。次のステートメントを実行することで、テーブルを新しい構造に手動でアップグレードします (すでに新しい構造のスレーブに変更が複製されることを回避するために、ここではバイナリロギングが無効になっています)。

    SET sql_log_bin=0;
    ALTER TABLE mysql.help_category ALTER COLUMN url TEXT;
    ALTER TABLE mysql.help_topic ALTER COLUMN url TEXT;

    次に、マスターで次のコマンドを実行します。

    mysql mysql < fill_help_tables.sql

    テーブル内容はマスターにロードされてから、スレーブに複製されます。