准备条件:
两台虚拟机(192.168.2.251,192.168.2.252),mysql都是5.7.24版本,以A B 区分
1,我们先以A服务器为起点, 配置它的数据库同步到B。 这就是主-从复制了。 之后再反过来做一次,就可以互相备份了。
#不要再客户端执行,我的就说没权限。
grant replication slave on *.* to 'mysql2'@'192.168.2.252' identified by 'mysql2';
账号密码这个等会在B上面要用。
2. 开启主服务器的 binarylog。
vi /etc/my.cnf
添加以下内容
server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1
explicit_defaults_for_timestamp = 1
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
#replicate-do-db = wang #需要同步的数据库
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
保存,重启!
3. 获取主服务器状态, 和同步初态。
假设我现在有这些数据库在A上面。
如果你是全新安装的, 那么不需要同步初态,直接跳过这一步,到后面直接查看主服务器状态。
这里我们假设有一个test 数据库作为初态。
先锁定 test数据库:
mysql>FLUSH TABLES WITH READ LOCK;
然后导出数据
[root@mysql1 home]# mysqldump --master-data -uroot -p test>/home/test.sql
Enter password:
然后查看A服务器的binary日志位置:
记住这个文件名和 位置, 等会在从服务器上会用到。
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 462
Binlog_Do_DB:
Binlog_Ignore_DB: mysql,sys,information_schema,performance_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)
File position会用到
主服务器已经做完了, 可以解除锁定了:
mysql> unlock tables
-> ;
Query OK, 0 rows affected (0.00 sec)
4. 设置从服务器 B 需要复制的数据库
打开从服务器 B 的 /etc/my.cnf 文件:
添加以下内容:
server-id = 2
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
#replicate-do-db = wang
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
保存,重启!
5. 导入初态, 开始同步。
把刚才从A服务器上导出的test.sql 导入到 B的test数据库中, 如果B现在没有test数据库,请先创建一个, 然后再导入:
创建数据库:
mysql> create database test default charset utf8;
把hello.sql 上传到B上, 然后导入:
[root@mysql2 ~]# mysql -uroot -p test < /home/test.sql
开启同步, 在B服务器上执行:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.2.251',
MASTER_USER='mysql1',
MASTER_PASSWORD='mysql1',
MASTER_LOG_FILE='mysql-bin.000004', #和上面保持一致
MASTER_LOG_POS=462;#和上面保持一致
重启mysql, 然后查看slave线程开启了没:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.251
Master_User: mysql2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: mysql2-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个参数都是Yes 证明成功!
主从复制大功告成!
下面反配置,就是主主复制。
1. 在B中创建用户;
grant replication slave on *.* to 'mysql1'@'192.168.2.251' identified by 'mysql1';
账号密码这个等会在A上面要用。
2. 开启主服务器B的 binarylog。
vi /etc/my.cnf
添加以下内容(回头看看上面)
server-id = 2
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
#replicate-do-db = wang
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema
auto-increment-increment = 2
auto-increment-offset = 2
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
3. 我们不需要导出B的初态了,因为它刚刚才从A导过来。 直接记住它的master日志状态:
mysql> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 798
Binlog_Do_DB:
Binlog_Ignore_DB: mysql,sys,information_schema,performance_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)
记住这两个数值,等会在A上面要用。
B服务器就设置完了。
4. 登录到A 服务器。 开启中继:
vi /etc/my.cnf
添加以下内容(回头看看上面)
server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1
explicit_defaults_for_timestamp = 1
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
#replicate-do-db = wang #需要同步的数据库
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
5. 启动同步:
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.2.252',
-> MASTER_USER='mysql1',
-> MASTER_PASSWORD='mysql1',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=798;
上面的ip地址是B的ip地址, 因为A把B当做master了
然后重启mysql服务。
然后查看,slave状态是否正常:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.252
Master_User: mysql1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 483
Relay_Log_File: mysql1-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个参数都是Yes,证明成功!