MYSQL的复制
复制原理
复制原理分为三个步骤:
主服务器把数据更新记录到二进制日志中
从服务器把主服务器的二进制日志拷贝到自己的中继日志中
从服务器重做中继日志中的时间,把更新应用到自己的数据库上
从服务器有两个进程:一个是I/O线程,负责读取主服务器的二进制日志,并将其保存为中继日志;另一个是SQL线程,复制执行中继日志
复制的流程
1配置master;
2:配置slave;
3:将slave连接到master
复制的具体操作
配置master
1)修改/etc/m.cnf 配置master
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
解析:log-bin 给出了二进制产生的文件的基本名;login-bin-index给出了二进制索引文件的文件名。每一个服务器都应该有唯一的server-id。
修改之后重启master使配置生效
2)在master创建一个复制用户
mysql> create user repl_user;
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to rel_user identified by 'redhat';
Query OK, 0 rows affected (0.00 sec)
解析:replication slave权限并没有什么特别之处,只是让这个用户能够从master上取的二进制日志的转储数据。
配置slave
1)配置my.cnf文件
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
2)链接master和slave
将slave指向master,让它直到从哪里复制,为次需要知道master的主机名,端口号,master上拥有replication slave权限的帐号和密码
mysql> change master to master_host='master-1', master_port=3306, master_user='repl_user', master_password='redhat';
Query OK, 0 rows affected (0.27 sec)
然后执行start slave开始执行复制
观察复制的动作
mysql> select * from ll;
mysql> flush logs;
Query OK, 0 rows affected (0.30 sec)
Flush logs 命令以强制轮换二进制日志,从而得到一个完整的二进制文件
mysql> show binlog events\G 检查二进制文件里有哪些事件
mysql> show master status; 命令来查看当前正在写入的是哪个二进制文件
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 | 106 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
析:reset master(在master上)删除所有的二进制文件,确保没有slave链接到该master上;
Reset slaves(在slave上),先执行stop slave命令,确保slave上没有活动的复制
复制后续
刚才的复制并没有说明复制从哪里开始,所以slave将从他开始,读取master的二进制文件。这里change master to命令有两个有用的参数,即master_log_file
Master_log_pos。使用这些参数指定master开始发送时加的binlog位置,而不是从头开始。
> change master to master_host='172.25.254.224',master_port=3306,master_user='repl_user',master_password='redhat',master_log_file='master-bin.000004',master_log_pos=106;