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


8

問題

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

可能な解決策

スレーブBで読み取りロック付きのテーブルをフラッシュし、BでSHOW SLAVE STATUSを使用して、binlogと位置を書き留めます。次に、Xtrabackup を使用してデータベースをバックアップし、バックアップをCに送信してスレーブを作成し、レプリケーションをAを指すように設定しました。

質問

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

回答:


20

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

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

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

ステップ3)ServerCで、mysqlを停止します。

ステップ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時間かかりました。次に、上記の手順を実行すると、すべてが完了します。


笑。私はあなたの提案を使用するためにOPについてコメントするつもりでした、そして「Fridge」DBAであるRolando氏に注目してください。Rolandoは釘を頭に当てました。これは、マスターを停止する必要がなく、Bスレーブを長時間停止させずに、推奨される方法です。
coderwhiz 2011

2
私はこれがかなり古い投稿であることを知っていますが、誰かがこの方法について私に尋ねました。これは、新しいスレーブと古いスレーブがまったく同じであると想定して正常に機能します。新しいスレーブが別のアーチの場合、機能しません(iirc)。また、ファイルごとのinnodbテーブルスペースを使用している場合は機能しないと確信しています。最も安全な解決策は、疑いがある場合はマスターから完全バックアップを実行することです。
lusis

@lusis-あなたのコメントは非常に真実です。ほとんどのmysqlクライアントが持っていると想像する完璧な世界では、すべてのハードウェア仕様が同一であるため、これを実行したいと考えています。ハードウェアが異なるセットアップでは、mysqldumpsとreloadが最も安全です。コメントを回答として送信してください。私はそれを賛成します。他の人がするかどうか見てみましょう!!!
RolandoMySQLDBA 2009

手順に従いました。mysqlをSlaveCで再び起動すると、「データベースが破損しているか、InnoDBテーブルスペースはコピーしているがInnoDBログファイルはコピーしていない可能性があります」というエラーが表示されます。そして、start slave(SlaveC)に「リレーログを開くことができませんでした '/var/log/mysql/mysql-relay-bin.001603」が表示されます
フセインタンボリ

この方法では、ServerCのデータを簡単に失う可能性があります。
アクズミンスキー2017年

3

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

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

私は今日の午後自分でこれをしなければなりません
でした

1

私は@RolandoMySQLDBAが提案することを行いましたが、6 '8'のステップも追加しました(これにより、@ Hussain Tamboliのコメントが解決されます)。

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

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

ステップ3)ServerCで、mysqlを停止します。

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

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

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

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

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

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

手順8 ') ServerBからServerCへのrsync / var / log / mysql

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

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

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


あなたの答えは完全ではなく、それは他のものを参照しています。それはフォーラムではありません。自分で答えが完全になるように改善してください。
asdmin 2016年

0

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

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


0

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

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


-2

マスターが2つのスレーブを区別できるように、auto.cnfのスレーブuuidを変更する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.