mysql主主复制
-1 主主复制读分担50%,写无法分担
-2 配置方法
--1 服务器1号(192.168.1.1)配置完,重启mysql
1 [mysql] 2 server-id=1 3 log-bin=mysql-bin 4 auto-increment-increment=2 5 auto-increment-offset=1 6 sync-binlog=1 7 innodb-flush-logs-at-trx-commit=1 8 replication-ignore-db=mysql
--2 服务器2号(192.168.1.2)配置完,重启mysql
1 [mysql] 2 server-id=1 3 log-bin=mysql-bin 4 auto-increment-increment=2 5 auto-increment-offset=2 6 sync-binlog=1 7 innodb-flush-logs-at-trx-commit=1 8 replication-ignore-db=mysql
auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2
auto-increment-offset的值用来设定数据库中自动增长的起点的,因为这两台服务器都设定了一次同一个自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突
--3 服务器1号备份当前数据并记录备份前一刻的bin日志位置(--lock-all-tables自缩/解表,--master-data=2加入bin日志位置,方便一会查看,这里假设1号当前日志是mysql-bin.000004;位置是300)
---1 备份服务器1号当前数据
1 mysqldump --all-databases --lock-all-tables --master-data=2 > /tmp/mysql1.sql 2 3 scp /tmp/mysql1.sql root@192.168.1.2:/tmp/
---2 创建授权账号
----1 服务器1号授权给服务器2号
1 mysql -uroot 2 >GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'REPL1'@'192.168.1.1' IDENTIFIED BY '123456';
----2 服务器2号授权给服务器1号
1 mysql -uroot 2 >GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'REPL2'@'192.168.1.2' IDENTIFIED BY '123456';
--4 服务器2号导入1号数据,保证1/2号数据库一致性,记录此时2号日志位置(这里假设2号日志是mysql-bin.000001;位置是100);添加1号日志位置,并开启2号slave;
同时服务器1号添加2号日志位置,并开启1号slave;
---1 服务器2号
1 mysql -uroot -ppassword < /tmp/mysql1.sql 2 mysql -uroot 3 4 >FLUSH TABLES WITH READ LOCK; 5 6 >SHOW MASTER STATUS\G 7 8 >UNLOCK TABLES; 9 10 >CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='REPL1',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql_bin.000004' \ 11 12 MASTER_LOG_POS='300'; 13 14 >START SLAVE;
---2 服务器1号
1 mysql -uroot 2 3 >CHANGE MASTER TO MASTER_HOST='192.168.1.2',MASTER_USER='PERL2',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql_bin-00001' \ 4 5 MASTER_LOG_POS='100'; 6 7 >START SLAVE;
关于FLUSH TABLES WITH READ LOCK
-1 进入mysql会话使用此命令时一定不能退出会话,如果退出会话,所有表会自动解锁
-2 使用flush tables with read lock后再用mysqldump导出数据库脚本会遇到“Toomany connections”的错误,此时在my.cnf中添加“max_connections=500”以及”max_packet=32M”的选项