2つありますMySQL 5.5
サーバーで実行中Ubuntu 12.04
。
server01からserver02まで3つのデータベースを正常に複製していますが、4番目の(新しい)データベースを追加する必要があります。
私たちのmy.cnf
マスター上:
binlog_do_db = database1
binlog_do_db = database2
binlog_do_db = database3
4番目のデータベースをレプリケーションに追加するにはどうすればよいですか?私が読んだすべては、MySQLを再起動する必要があることを示しています、これを回避する方法はありますか?それとも、それをスケジュールする必要があるだけですか?
これまでの計画ですが、再起動を必要としない方法を望んでいました。これは複雑すぎますか?
GRANT REPLICATION SLAVE ON *.* TO 'slaveusr'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
QUIT;
My.cnfを編集して、新しいデータベースを含めます。
binlog_do_db = database4
MySQLを再起動します
service mysql restart
初期コピー用のデータベースをスレーブサーバーにバックアップします
USE database4;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
新しいシェルで
mysqldump -u root -ppassword --opt database4 > database4.sql
scp database4.sql root@server02:/home
古いシェルで
UNLOCK TABLES;
QUIT;
スレーブサーバーのmy.cnfを変更します
replicate-do-db = database4
MySQLを再起動します
service mysql restart
ダンプされたDBを復元する
mysql -u root -ppassword database4 < database4.sql
Binlog-do-dbに変更を加えると、再起動が必要になると思います。
個人的には、マスターmy.cnfからすべてのbinlog-db-dbを削除し、スレーブでreplicate-do-dbを使用して、処理するものをフィルター処理します。
この方法で、将来的に再起動する必要なく、マスターにさらにデータベースを追加できます。
私が正しく理解している場合、新しいデータベース(database4)を、すでに3つのデータベースが複製されているスレーブにコピーしようとしています(これらはすべて同じMySQLデータベースにあります)。
この場合の問題は、これを行う間、レプリケーションを一時停止する必要があることです。
私が使用するプロセスは次のとおりです。
1)マスター-新しいbinlog-do-db
でマスターを再起動します|バイナリログにデータベース4のデータを入力し始めるために、すべてのbinlog-do-db
を削除します
2)スレーブ-スレーブデータベースのレプリケーションが最新であることを確認します(SHOW SLAVE STATUS
> Seconds_Behind_master
)。それがあるまで待てない場合
3)MASTER-FLUSH TABLES WITH READ LOCK;
マスターに入る新しいデータを停止するには
4)SLAVE-レプリケーションが完全に追いついており、データがレプリケートされていないことを確認します(read_master_log_pos
とexec_master_log_pos
は同じであり、(show slave status;
で)変更されません)
5)SLAVE-STOP SLAVE;
は、マスターのロックをすぐに解除すると、データベースへのデータの複製を停止します。
6)--single-transaction
オプションを指定してMySQLDUMP
を実行します
7)MySQLDUMPの実行が開始したら、マスターデータベースのロックを解除しますUNLOCK TABLES;
このようにして、システムはマスターへの読み取りと書き込みを続行でき、ダウンタイムを最小限に抑えることができます
n.b. MySQLDUMPがシステムに応じて機能している間、database4スキーマをロックする可能性があること
8)MySQLDUMPが完了したら、スレーブデータベースにインポートします
9)新しくインポートされたデータベース4が正しいように見えることを確認します
10)スレーブデータベースを再起動し、replicate-do-db=database4
をmy.cnfファイルに追加します。
再びオンになると、中断したところからレプリケーションを続行しますが、database4を含みます。
IGGtによる回答へのコメントとして、データベースが新しく、使用されていない場合、つまりデータベースに接続されていない場合は、最初に新しいデータベースをダンプしてから、マスターにドロップするか名前を変更します。
スレーブが現在のデータベースのみを複製するように指示されていないと仮定すると、次に実行する必要がある唯一の手順は次のとおりです。
1)マスター-新しいbinlog-do-dbでマスターを再起動します。 binlog-do-dbをすべて削除して、バイナリログにdatabase4のデータを入力し始めます。
2)新しいデータベースを作成します(database4)
3)ダンプからマスターにデータベースをインポートします
このようにして、レプリケーションプロセスによって新しいデータベースが作成され、すべてのスレーブにデータが読み込まれます。
これには、他のデータベースへのダウンタイムをマスターdbインスタンスの再起動にかかる時間だけに減らすという利点もあります。
すべてのbinlog-do-dbステートメントを削除することをお勧めしますので、将来的には新しいデータベースを追加でき、これらはスレーブで自動的に複製されます。データベースを1つ以上のスレーブに複製したくない場合は、データベースの作成前または後で、スレーブに replicate-ignore-db スタートアップ変数を設定して、データベースを削除できます。それらの奴隷から。
バージョンがMySQL 5.7以降の場合、スレーブを再起動せずにスレーブに含まれるデータベースまたは無視されるデータベースを管理できます。 https://dev.mysql.com/doc/refman/5.7/en/change-replication -filter.html