复制过程:
主节点必须启用二进制日志,记录任何修改数据库数据的事件。
从节点开启一个线程(I/O Thread)把自己扮演成mysql的客户端,通过mysql协议,请求主节点的二进制日志文件中的事件
主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具哪个二进制日志文件的哪个位置。
从节点启动另外一个线程(sql Thread ),把replaylog中的事件读取出来,并在本地再执行一次。
配置步骤:
1、主服务器修改配置文件
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id
2、启动主数据库服务
3、创建用于同步的用户账号
mysql> CREATE USER 'copy'@'*.*.*.*' IDENTIFIED BY '******';#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'copy'@'*.*.*.*';#分配权限
mysql>flush privileges; #刷新权限
4、从服务器修改配置文件:
server-id=2
5、启动从数据库服务
6、在从节点配置访问主节点的参数信息
CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='', MASTER_LOG_FILE='',MASTER_LOG_POS=;
7、启动复制线程
start slave;
8、查看同步状态
show slave status\g;
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。
主从复制架构中应注意的问题:
1、限制从服务器为只读
在从服务器上设置:
read_only = ON,但是此限制对拥有SUPER权限 的用户均无效。
阻止所有用户:
mysq>FLUSH TABLES WITH READ LOCK;
2、主服务器设置需要同步的库
binlog-do-db = db1
3、从库同步出问题了,在不重启主库的情况下进行主从复制恢复
首先导出db文件:mysqldump -uroot -p --routines --single_transaction --master-data=2 --databases db > db.sql
然后在从库stop slave
查看导出db文件 head -50 db.sql |grep "CHANGE MASTER" #-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=21212;
在从库执行CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='', MASTER_LOG_FILE='',MASTER_LOG_POS=;文件名及位置参照上面查询的结果
最后start slave;