web-dev-qa-db-ja.com

MySQLスレーブを別のスレーブから作成しますが、マスターに向けます

問題

マスター([〜#〜] a [〜#〜])とスレーブ([〜#〜] b [〜#〜]の2つのサーバー間でMySQLレプリケーションをセットアップしています。 =)。新しいスレーブをミックスに追加する必要があります([〜#〜] c [〜#〜])。このスレーブがマスターから直接更新を取得するようにしたいのですが、スレーブからのチェーンレプリケーションは必要ありません。ただし、マスターは「ホット」です。通常、Xtrabackupを使用してマスターの完全バックアップを作成しますが、データベースのサイズが約20GBであるため、マスターを10分間ロックします。

可能な解決策

スレーブでの読み取りロック付きのフラッシュテーブル[〜#〜] b [〜#〜][〜#〜] b [〜#〜]でSHOW SLAVE STATUSを使用binlogと位置を書き留めます。次に、Xtrabackupでデータベースをバックアップし、バックアップを[〜#〜] c [〜#〜]に送信し、それを使用してスレーブを作成し、レプリケーションが[〜#〜 ] a [〜#〜]私が書き留めたbinlogの位置で。

質問

ロックする必要がないより良い方法はありますか[〜#〜] b [〜#〜]長い間?または、より簡単に自動化できるものはありますか?

8
Alex Recarey

ねえ、マスター(ServerA)またはスレーブ(ServerB)の操作を拡張することなくスレーブを作成するクレイジーな方法を知っている

手順1)新しいサーバーをセットアップする(ServerC)

ステップ2)ServerCにMySQLをインストールします(ServerBと同じバージョン)

ステップ3)ServerCで、サービスmysql stop

ステップ4)/etc/my.cnfをServerBからServerCにコピーします

ステップ5)ServerCで、server_idをServerAおよびServerBとは異なる値に変更します。

ステップ6)ServerBからServerCへのrsync/var/lib/mysql

手順7)rsyncが完了したら、「STOP SLAVE;」を実行します。 ServerB上

ステップ8)ServerBからServerCへのrsync/var/lib/mysql

手順9)ServerBで「START SLAVE;」を実行します。

ステップ10)ServerCで、mysql startサービス

ステップ11)ServerCで「START SLAVE;」を実行します。 (skip-slave-startが/etc/my.cnfにある場合はこれを行います)

試してみる !!!

ところで、私は過去2日間にクライアントのためにこれを実行しただけなので、これが機能することを確信しています。クライアントのスレーブには2.7TBのデータがありました。スレーブがまだアクティブな間に別のサーバーにrsyncdしました。 rsyncは11時間ほどかかりました。その後、STOP SLAVEを実行しました。最初のスレーブで再度rsyncを実行しました。さらに1時間かかりました。次に、上記の手順を実行すると、すべてが完了します。

20
RolandoMySQLDBA

スレーブをミックスに追加する場合、次のことを行います。

  • 1つのスレーブをオフラインにする
  • データベースデータディレクトリを新しいスレーブにコピーします(スレーブからコピーしたため、スレーブ設定-binlog位置、マスターホストなどが正しい)
  • 元のスレーブを起動します
  • 新しいスレーブのmy.cnfのserver-idを変更します
  • 新しいスレーブを開始
3
sreimer

@ RolandoMySQLDBA が示唆することを行いましたが、6 '8'も追加しましたステップ(これは @ Hussain Tamboli コメントを解決します。):

手順1)新しいサーバーをセットアップする(ServerC)

ステップ2)ServerCにMySQLをインストールします(ServerBと同じバージョン)

ステップ3)ServerCで、サービスmysql stop

ステップ4)/etc/my.cnfをServerBからServerCにコピーします

ステップ5)ServerCで、server_idをServerAおよびServerBとは異なる値に変更します。

ステップ6)ServerBからServerCへのrsync/var/lib/mysql

ステップ6 ')rsync/var /log/ mysql on ServerB to ServerC

手順7)rsyncが完了したら、「STOP SLAVE;」を実行します。 ServerB上

ステップ8)ServerBからServerCへのrsync/var/lib/mysql

ステップ8 ')rsync/var /log/ mysql on ServerB to ServerC

手順9)ServerBで「START SLAVE;」を実行します。

ステップ10)ServerCで、mysql startサービス

ステップ11)ServerCで「START SLAVE;」を実行します。 (skip-slave-startが/etc/my.cnfにある場合はこれを行います)

1
Pere Barceló

「LOAD DATA FROM MASTER」オプションがありますが、これはお勧めしません。

システムで毎晩/毎週バックアップを取っていますか?その場合は、バックアップの位置にも注意してください。そのバックアップを使用して、新しいスレーブをセットアップできます。そのままにして、しばらくの間最新の状態にしてください。

0
jishi

私はRolandoの回答を試してうまくいきましたが、最初から再生を開始し、スキップするエラーコードを追加する必要がありました(推奨されていませんが、何をしているのかはわかっています)。

ステップ7が完了したら、mysqlログをチェックインし、binログの名前と位置を書き留めて、9番目のステップまで続行しました。 10番目のステップの前に、私はchange masterログファイルとログの位置。そしてステップ11から続けます。

0
Spike