サーバーは、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
などのアカウントを使用してサーバーに接続してください。
mysql_upgrade をまずスレーブ上で実行してからマスター上で実行することで、サーバーをアップグレードします。スレーブを最初にアップグレードするというのが一般原則です。
-
ヘルプテーブル内容をマスターからそのスレーブに複製するかどうかを決めます。しない場合は、マスターと各スレーブに個別に内容をロードします。または、マスターおよびそのスレーブ上のヘルプテーブル構造の非互換を確認し、ある場合は解決してから、内容をマスターにロードしてそこからスレーブに複製します。
ヘルプテーブル内容をロードするためのこれらの 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
テーブル内容はマスターにロードされてから、スレーブに複製されます。