#MySQL实战–主主复制
1 开启二进制复制
- 关闭MySQL服务
service mysqld stop
- 添加配置
vi /etc/my.cnf
添加以下内容:
log-bin=mysql-bin1 # 二进制文件名
server-id=1 # 服务器id,唯一
binlog-format=mixed #二进制日志格式,有row、statement、mixed三种格式,
#row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,
#statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。
#MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句
#的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog-do-db=database #同步的数据库名称
另一台
log-bin=mysql-bin2
server-id=2
binlog-format=mixed
binlog-do-db=database
######注:
######1. server-id必须是唯一的,每台机器不同。
######2. 如果你不设置server_id(或者显式地将其设置为默认值0),主服务器将拒绝从从节点获得任何连接。
######3. 在复制设置中获得最大的持久性和一致性,对于事务请使用InnoDB,您应该使用innodb_flush_log_at_trx_commit=1和sync_binlog=1在主节点my.cnf文件中设置。
######4. 确保您的复制母版上没有启用skip_networking系统变量。如果网络已被禁用,则从服务器无法与主服务器通信,并且复制失败。
2 创建用于复制的用户
创建一个仅用于复制进程的用户,官方示例:
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
实战使用:
mysql> CREATE USER 'repl'@'从节点ip' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从节点ip';
3 执行初始化脚本
- 建库
- 建表
######注:使用这种方式最简单,否则还要使用其他备份策略进行操作,提高了运维工作量。请按自己的情况使用。
4 查看主节点当前日志位置
查看复制起点,在主节点上查看:
mysql> FLUSH TABLES WITH READ LOCK; # 锁住表,保证同步期间不会出现数据修改
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin1.000001 | 619 | test | manual,mysql |
+------------------+----------+--------------+------------------+
######注:如果能够保证执行执行同步时,不会有客户端进行写操作,可以不用锁(不建议)。
5 设置复制(从)
得到的日志坐标,写在下面命令的master_log_pos属性上。
mysql> CHANGE MASTER TO
-> master_host='主IP',
-> master_port=3306,
-> master_user='repl',
-> master_password='password',
-> master_log_file='mysql-bin1.000001',
-> master_log_pos=619;
6 启动和检查(从)
mysql> start slave;
mysql> show slave status\G; # Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 即成功
7 主节点释放锁
mysql> unlock tables;
8 测试
往主节点中修改数据,去从节点中查询修改后的数据,验证主备是否真正成功。