プライマリのクラスタ レプリケーション プロセスが失敗した場合、二次レプリケーション チャネルに切り替えることができます。この切り替えを行うために必要なステップの手順を以下説明します。
最も最新のグローバル チェックポイント
(GCP)
の時間の取得.つまり、最も最新のエポックをスレーブ
クラスタの ndb_apply_status
テーブルで決める必要があります。それ以下のクエリで検索できます。
mysqlS'
>SELECT @latest:=MAX(epoch)
->FROM mysql.ndb_apply_status;
ステップ 1
で説明したクエリから取得した情報を使用して、マスタ
クラスタの ndb_binlog_index
テーブルから以下のように相当するれレコードを取得します。
mysqlM'
>SELECT
->@file:=SUBSTRING_INDEX(File, '/', -1),
->@pos:=Position
->FROM mysql.ndb_binlog_index
->WHERE epoch > @latest
->ORDER BY epoch ASC LIMIT 1;
これらはプライマリ レプリケーション
チャネルの失敗以来のマスタに保存されたレコードです。ここではステップ
1 で取得した値を表すユーザー変数
@latest
を使用しています。勿論、1 つの
mysqld
インスタンスで別のサーバーのインスタンスに設定されたユーザー変数に直接アクセスすることはできません。これらの値は手動で
2 番目のクエリあるいはアプリケーション
コードに 「plugged in」
する必要があります。
ここで二次のスレーブ サーバーに以下のクエリを実行して二次のチャネルを同期できます。
mysqlS'
>CHANGE MASTER TO
->MASTER_LOG_FILE='@file',
->MASTER_LOG_POS=@pos;
再度ユーザー変数 (この場合は
@file
および @pos
)
を使用してステップ 2 で取得しステップ 3
で適用した値を表します。実際はこれらの値は手動で挿入するか、あるいは使用している両方のサーバーにアクセスするアプリケーション
コードを使用します。
@file
は
'/var/log/mysql/replication-master-bin.00001'
などの文字列の値で、SQL
あるいはアプリケーション
コードで使用されるときに引用される必要があります。しかし、@pos
で表される値は引用する必要はあり
ません。MySQL
は通常文字列を番号を変換しようとしますが、この場合は例外です。
今二次スレーブ mysqld の適切なコマンドを発行して二次チャネルでレプリケーションを開始できます。
mysqlS'
>START SLAVE;
二次のレプリケーション チャネルが利用できるようになったら、プライマリの不具合を調べ問題を解決します。問題の解決にはプライマリ チャネルの問題を正しく見極めた正確な対応が必要です。
その問題が 1
台のサーバーに限定されるのであれば、その不具合は(論理的には)
M
から
S'
、あるいは
M'
から
S
にレプリケートできます。しかし、この件はまだ検証していません。