- mysqlサーバーでは、1つのサーバーをマスターサーバーとして設定でき、複数のスレーブデータベースサーバーで、1つのmysqlデータベースサーバーから1つ以上のmysqlデータベースサーバーにデータをコピーできます。
- mysqlマスタースレーブは非同期レプリケーションのプロセスです
- このマスタースレーブレプリケーションをサポートする最下層には何がありますか?
回答:マスターはbin-log関数を開き、ログファイルはデータベースの読み取りと書き込みの追加と削除を記録するために使用されます
マスタースレーブ構成では、合計3つのスレッドが必要です。
- マスター:IOスレッド:
上記のメインサーバーの変更は、独自のIOスレッドbin-logを介してバイナリログに保存されます。
- スレーブオン:IOスレッド:
スレーブサーバーは、構成されたユーザー名とパスワードを使用してIOスレッドを開始し、メインサーバーに接続してバイナリログの読み取りを要求し、読み取ったコンテンツをローカルのRealyログ(リレーログ)に保存します。
- スレーブ:SQLスレッド:
同時にサーバーからSQLTheardを開き、Realyログを定期的に確認します。更新が見つかった場合は、すぐにローカルデータベースで更新されたコンテンツを実行します。
3つのスレッドの仕組み:
スレーブはIOスレッドとsqlスレッドを開始します。スレーブはIOスレッドを介してマスターに接続し、特定のbin-log位置の後にコンテンツを要求します。マスターサーバーはスレーブIOスレッドから送信されたログ要求情報を受信し、ioスレッドはbin-logコンテンツを位置はスレーブIOスレッドに返されます
スレーブサーバーは、bin-logログの内容を受信し、bin-logログの内容をrelay-logリレーログに書き込み、masteripのユーザー名とパスワードを記録するmaster.infoファイルを作成します。masterbin-log名bin-ログの位置。
スレーブ側はSQLスレッドを開始し、リレーログログの内容がリアルタイムで更新されているかどうかを監視し、ファイル内のSQLステートメントを解析して、スレーブデータベースで実行します。
上:
設定方法を見てみましょう。設定する前に、mysqlが2つのサーバーにインストールされていることを確認する必要があります。
ここで使用する2つのサーバーは
マスター:10.55.185.80
スレーブ:10.55.185.81
最初の一歩:
構成mysqlファイルmy.iniは次のように説明しています。
配置说明:
#[必须]服务器唯一ID,每台服务器需不同
server-id = 1
#[必须]启用二进制文件
log-bin = /home/mysql/mysql-bin
#[不是必须]二进制文件启用混合模式
binlog_format = mixed
#[不是必须]二进制文件过期时间,单位是天
expire-logs-days = 14
#[不是必须]当每进行1次事务提交之后,MySQL将进行一次磁盘同步指令来将binlog_cache中的数据强制写入磁盘
sync-binlog = 1
#[不是必须]只将对应的数据库变动写入二进制文件。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
binlog-do-db = test,androidpnserver
#[必须]不需要记录二进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项。一般为了保证主主同步不冲突,会忽略mysql数据库。
binlog-ignore-db = mysql,information_schema,performance_schema
#[必须]做主主备份的时候,因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。
#解决这个问题的办法就是让每个数据库的自增主键不连续。上面两项说的是,假设需要将来可能需要10台服务器做备份,将auto-increment-increment设为10。而auto-increment-offset=1表示这台服务器的序号。从1开始,不超过auto-increment-increment。
auto-increment-increment = 10
auto-increment-offset = 1
メインサーバーのmysql構成ファイルの内容:
[mysqld]
server-id=1
log-bin = mysql-bin
binlog-do-db = bd-ecxel
binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-increment = 10
auto-increment-offset = 2
サーバーからのmysql構成ファイルの内容:
[mysqld]
server-id=2
log-bin = mysql-bin
binlog-do-db = bd-ecxel
binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-increment = 10
auto-increment-offset = 2
注:ここでのサーバーIDは一意である必要があります
2番目のステップ:
最初にmysqlを再起動します。
#停止mysql服务
net stop mysql
#开启mysql服务
net start mysql
进入mysql
mysql -u root -p
注:データベースのマスタースレーブ構成の前に、マスタースレーブデータベースが一時的に同期されていることを確認してください。最初にマスターサーバーのデータベースのロックを解除できます。データベースを追加、削除、または変更しないでください。
3番目のステップ:
首先刷新,停止线程
mysql>stop slave;
mysql>reset slave;
刷新mysql的系统权限相关表
mysql>flush privileges;
4番目のステップ:
マスターサーバーで同期アカウントを作成します:(マスタースレーブレプリケーションを実行している場合は、マスターサーバーで同期アカウントを作成するだけで済みます
マスターマスターレプリケーションを実行している場合は、マスターとスレーブの両方が同期アカウントを作成する必要があります)
grant replication slave on *.* to '<userName>'@'<hostIp>' identified by '<passWord>';`
# userName 用户名,默认root
# passWord 用户密码(均为数据库账户,密码)
# hostIp 需要同步的主机IP,可以写%,表示全部
例:
grant replication slave on *.* to 'root'@'%' identified by '123456';
5番目のステップ:
マスターサーバーでマスターステータスを確認し、バイナリファイル名を記録し、ファイルと位置がスレーブで使用されること を 忘れないでください
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
6番目のステップ:
スレーブライブラリの同期を設定し、そこにある同期ポイントに注意してください。メインライブラリの|ファイル|位置にマスターステータス情報が表示されます。
(マスタースレーブの場合はスレーブでのみ同期する必要があり、マスターの場合はこの手順を実行する必要があります)
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.55.185.80',
-> MASTER_USER='root',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=73;
ホストはスレーブ同期スレッドを開始します
mysql>stop slave;
mysql>start slave;
ホストはスレーブステータスを表示します。
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.55.185.80
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 11662
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
両方がイエスの場合、これはスレーブの2つのスレッドの成功です!
補足:ステータスの確認時にエラーが発生した場合、エラーコードに従ってエラーの原因を検出できます。
一般的なエラーを解決するには、次の2つの方法があります。
1つ目:エラーを無視して同期を続行します
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,现在主从同步状态正常了。
2番目のタイプ:構成ファイルでスキップエラーコードを指定し、同期を続行します
主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件指定略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断
[mysqld]
slave-skip-errors = 1062,1032,1060
重新启动mysql
service mysqld restart
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes