mysqlコピーの原理と実践応用の詳細

11431 ワード

この実例はmysql複製原理と実践応用を述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
コピー機能は一つのmysqlデータベース上のデータを一つまたは複数のmysqlにコピーしてデータベースから実行します。
コピーの原理:ホストサーバで実行されるすべてのDDLとDML文は、バイナリログに記録されます。これらのログはサーバから取得し、ライブラリからコピーして中継ログとして保存されます。
このプロセスは、IOスレッドと呼ばれるスレッドが担当しており、SQLスレッドと呼ばれるものが順次中継ログの文を実行しています。
コピーには複数のトポロジーがあります。
1、伝統的にコピーし、主から一つ以上、主サーバ一つ以上はサーバーからなります。
2、チェーンコピー、サーバーはメインライブラリからコピーし、他のサーバーはこのコピーからコピーし、中間サーバは中継メインライブラリとも呼ばれます。
3、メインコピー、2つのメインライブラリは互いに書き込みとコピーを受け付けます。
4、マルチソースコピー、1つはライブラリから、複数のメインライブラリからコピーします。
一、コピーはどうやって操作しますか?
1、メインライブラリでバイナリログ記録を有効にします。
2、メインライブラリにコピーユーザを作成します。
3、トレーニングから唯一のセーバーを設置する。id
4、メインライブラリからデータをバックアップします。
5、ライブラリからメインライブラリのバックアップデータを復元します。
6、CHANGE MASTER TO命令を実行します。
7、コピーを開始します。
二、具体的な操作手順は以下の通りである。
1、メインライブラリでバイナリログを有効にし、server_を設定します。id

#  server_id
server_id = 1
#  binlog  
log-bin = mysql-bin
2、メインライブラリにコピーユーザを作成する

create user '   '@'%' identified by '  ';
grant replication slave on *.* to '   '@'%';
3、ライブラリにserver_を設置する。id。

#  server_id
server_id = 10
4、メインライブラリのデータをバックアップする

mysqldump -u root -p --all-databases --routines --events --triggers --single-transaction --master-data >     
5、ライブラリから導出したデータを復元する

mysql -u root -p -f <       .sql
6、ライブラリからCHANGE MASTER TO命令を実行する

CHANGE MASTER TO 
MASTER_HOST='  IP',
MASTER_USER='      ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='       ',
MASTER_LOG_POS=       ;
バイナリログ名とバイナリログ位置は、バックアップマスタファイルに含まれています。以下のようになります。

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000016', MASTER_LOG_POS=47845;
7、倉庫からstart slaaveを運行して、その後show slate status\G;コピー状態を表示します
三、マスターコピーの設定
メインライブラリがmaster 1とmaster 2であると仮定します。
1、マスタード2を読み取り専用に設定します。

set @@global.read_only = on;
2、master 2にコピーユーザを作成します。存在するなら、作成しなくてもいいです。

create user '   '@'%' identified by '  ';
grant replication slave on *.* to '   '@'%';
3、マスター2がバイナリログを開いていることを確認し、マスター2のバイナリログの座標を確認します。

show master status;
4、2ステップ目の情報により、マスター1でCHANGE MASTER TOコマンドを実行します。

CHANGE MASTER TO 
MASTER_HOST='MASTER2  IP',
MASTER_USER='MASTER2    ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='       ',
MASTER_LOG_POS=       ;
5、マスター1でslaaveモードをオンする

start slave;
6、master 2を設定し、読み書きできるようにします。

set @@global.read_only = off;
四、マルチソースコピーの設定
server 3はserver 1とserver 2のライブラリに設定します。
1、server 1とserver 2のバイナリログとserver_を設定します。id,具体的な操作は上を参照してください。
2、server 1とserver 2にコピーユーザを作成し、具体的な操作は上を参照してください。
3、server 3にserver_をセットするid
4、server 1とserver 2のデータをバックアップします。
5、server 3でserver 1とserver 2でバックアップしたデータを復元します。
6、server 3において、複製在庫をFILEからTABLEに変更し、

stop slave;
set global master_info_repository = 'TABLE';
set global relay_log_info_repository = 'TABLE';
 設定ファイルで変更する必要があります。

[mysqld]
master-info-repository = TABLE
relay-log-info-repository = TABLE
7、server 3でCHANGE MASTER TOコマンドを実行し、チャンネル名を付けます。

CHANGE MASTER TO 
MASTER_HOST='server1  IP',
MASTER_USER='server1    ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='server1       ',
MASTER_LOG_POS=server1        FOR CHANNEL 'server1';

CHANGE MASTER TO 
MASTER_HOST='server2  IP',
MASTER_USER='server2    ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='server2       ',
MASTER_LOG_POS=server2        FOR CHANNEL 'server2';
8、server 3で、各チャネルのためにSTART SLAVE FOR CHANNEL文を実行します。

start slave for channel 'server1';
start slave for channel 'server2';
9、同期状態を確認し、show slate status\G;
指定されたチャネルのライブラリ状態を取得するには、show slate status for chanel'チャンネル名'\G;
五、コピーフィルタの設定
どのテーブルまたはデータベースをコピーするかを選択して、メインライブラリでは、-binlogn-do-dbと--binlog-gnore-dbオプションを使用して変更を記録するデータベースを選択して、バイナリログを制御します。より良い方法はライブラリから制御することです。
1、指定されたデータベースをコピーする

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);
2、指定表をコピーする

CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = ('db1.table1');
3、ワイルドカードを使って表を選択したい場合

CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.tb_%');
4、データベースを無視する

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1, db2);
5、指定表を無視する

CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = ('db1.table1');
六、ライブラリを主にコピーからチェーンコピーに切り替えます。
例えば、現在はサーバAをメインライブラリとし、サーバBとサーバCをライブラリとしてサーバAにコピーします。今はサーバCをサーバBのライブラリとしたいです。
1、サーバCでライブラリからの運転を停止する

stop slave;
show slave status\G;
Relay_を記録しますマスターログFileとExec_マスターログPosの値
2、サーバBでライブラリからの運転を停止する

stop slave;
show slave status\G;
Relay_を記録しますマスターログFileとExec_マスターログPosの値
3、サーバBのログ位置をサーバCと比較して、どれがサーバAの最新の同期かを探します。通常、サーバCはまずライブラリからの運行を停止して、サーバBのログはより前になります。
4、サーバCで、START SLAVE UNTIL文を使ってサーバBのログ位置に同期する:

START SLAVE UNTIL MASTER_LOG_FILE='       B    ', MASTER_LOG_POS=       B    ;
5、サーバCで、ショーslave statusの中をチェックする。 Exec_マスターログPosと Unitil_ログPosは同じであるべきです。
6、サーバBで、メインライブラリの状態を確認し、ライブラリから起動する。

show master status;
start slave;
show slave status\G;
7、サーバCでライブラリからの運転を停止し、CHANGE MASTER TOコマンドを実行します。

stop slave;
CHANGE MASTER TO
MASTER_HOST='   B IP',
MASTER_USER='   B    ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='      show master status      ',
MASTER_LOG_POS=      show master status      ;
8、サーバCでコピーを開始し、状態を確認する

start slave;
show slave status\G;
七、チェーンコピーをメインコピーに切り替える
サーバA->サーバB->サーバCは、サーバCを直接サーバAのライブラリとして利用したい場合、どうすればいいですか?
1、サーバBでライブラリからの運転を停止し、メインライブラリの状態を記録する

stop slave;
show master status\G;
2、サーバCでは、ライブラリからの遅延が追いつかれていることを確認し、Relay_マスターログFileとExec_マスターログPosはサーバBのメインライブラリ状態と同じであるべきです。
遅れて追われると、ライブラリからの運行を停止します。

stop slave;
3、サーバBで、show slaave statusからサーバAのログ座標値を取得する。マスターログFileとExec_マスターログPos)をクリックし、ライブラリから起動します。

show slave status\G;
start slave;
4、サーバCでライブラリからの運転を停止し、CHANGE MASTER TOコマンドを実行し、サーバAを指す。

stop slave;
CHANGE MASTER TO 
MASTER_HOST='   A IP',
MASTER_USER='   A     ',
MASTER_PASSWORD='  ',
MASTER_LOG_FILE='         ',
MASTER_LOG_POS=           ;
5、サーバCでライブラリをオープンし、状態を確認する。

start slave;
show slave status\G;
八、設定ディレイコピー
なぜコピーを遅らせる必要があるのか、メインライブラリで災害文が実行されている可能性があります。バックアップ中の時点でリカバリしなければなりません。データベースのサイズが大きすぎると、長時間停止することになります。
このような状況を避けるために、遅延されたライブラリを使用してもいいです。もし災害が発生し、遅延されたライブラリからこの災害文が実行されていない場合は、まずコピーを停止して、ライブラリから災害文をスキップして、最後にライブラリからメインライブラリにアップグレードします。
1、ライブラリからの運転を停止する

stop slave;
2、遅延時間を設定し、秒単位で

CHANGE MASTER TO MASTER_DELAY = 3600;
start slave;
3、在庫状態を確認する

show slave status\G;
SQL_Delay:ライブラリからメインライブラリまでの秒数を遅延します。
SQL_Remaning_Delay:遅延がまだ残っている秒数は、遅延を維持する場合、この値はNULLです。
スラブ_SQL_Running_State:SQLスレッドの状態
九、設定GTIDコピー
グローバルトランザクション識別子GTIDは、プログラムにおいて作成された一意の識別子であり、メインライブラリに提出された各トランザクションに関連付けられている。この識別子は唯一であり、メインライブラリだけでなく他のライブラリにおいても一意である。
上記のすべてのコピーは、バイナリファイルとコピー元の位置を指定する必要があります。ライブラリのメインライブラリを別の場所に切り替えると、バイナリファイルの位置を再取得する必要があります。
避けるために、GTIDによるコピーが使用されてもよく、mysqlはGTIDを使用して、バイナリログの位置を自動的に検出する。
1、すべてのデータベースの中でmy.cnfでGTIDを起動する。

[mysqld]
gtid_mode = ON
enforce-gtid-consistency = 1
skip_slave_start
2、メインライブラリを読み取り専用に設定し、メインライブラリとライブラリデータが一致するようにする。

set @@global.read_only = on;
3、すべてのライブラリを再起動し、GTIDを有効にする。
4、メインライブラリを再起動します。
5、ライブラリからCHANGE MASTER TOコマンドを実行してGTIDコピーを設定する

CHANGE MASTER TO
MASTER_HOST='  IP',
MASTER_PORT=3306,
MASTER_USER='    ',
MASTER_PASSWORD='  ',
MASTER_AUTO_POSITION=1;
6、すべてのライブラリからスタートslaaveを実行する。状態を表示します。
十、半同期コピーを設定する
デフォルトではコピーは非同期です。メインライブラリは書き込み操作がライブラリに到達するかどうか分かりません。メインライブラリとライブラリ間に遅延があるとメインライブラリが崩壊し、ライブラリに到達していないデータが失われます。
このような問題を解決するために、半同期コピーは、メインライブラリが少なくとも1つのライブラリから書き込みデータを受信するまで待ち続けます。
1、メインライブラリに、rpl_を取り付けます。semi_.sync_マスタープラグイン

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
windowsでは次のように使ってください。

install plugin rpl_semi_sync_master SONAME 'semisync_master.dll';
2、プラグインがアクティブであることを確認する

select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%';
3、半同期コピーをオンし、タイムアウト時間を調整する

set @@global.rpl_semi_sync_master_enabled=1;
set @@global.rpl_semi_sync_master_timeout=100;
4、ライブラリからrpluをインストールするsemi_.sync_slaaveプラグイン

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
windowsでは次のように使ってください。

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.dll';
5、プラグインがアクティブであることを確認する

select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%';
6、ライブラリから半同期コピーを有効にし、ライブラリIOスレッドを再起動する

set global rpl_semi_sync_slave_enabld = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
7、以下のように半同期状態を確認する。

show status like 'rpl_semi_sync_master_clients';
半同期でメインライブラリに接続するクライアントの数を確認します。

show status like 'rpl_semi_sync_master_status';
メインライブラリは非同期と半同期コピーの間で切り替えられ、onは半同期を表し、offは非同期を表します。
MySQLに関する詳細について興味がある読者は、本駅のテーマを見ることができます。「MySQLクエリ技術大全書」、「MySQL常用関数大まとめ」、「MySQLログ操作テクニック大全」、「MySQL事務操作技術まとめ」、「MySQL記憶プロセス技術大全」および「MySQLデータベースのロックに関するスキルのまとめ
この記事が皆様のMySQLデータベース計に役立つことを期待します。