当前位置:首页>

文章详细页

MySQL复制

分类:MySQL


========== MySQL 支持两种复制方式:
    基于行的复制
    基于语句的复制


========== 复制解决的问题:
    数据分布(如不同的地理位置)
    负载均衡(将读操作分布到多个服务器上,实现对读密集型应用的优化)
    备份(复制是对备份的技术补充)
    高可用性和故障切换(可以避免MySQL单点失败)
    MySQL升级测试


========== 复制机制
1、在主库上把数据更改记录存到二进制日志(Binary Log)中
2、备库将主库上的日志复制到自己的中继日志(Relay Log)中
3、备库读取中继日志中的事件,将其重放到备库数据之上


MySQL复制机制.png



===== 配置复制实例1(两台都是无数据的服务器)
基本信息:主库server1(192.168.0.1) 备库server2(192.168.0.2)

== 步骤一:在 主库/备库 都创建以下复制账号
-> grant replication slave, replication client on *.*
to repl@'192.168.0.%' identified by 'p4ssword';

-注:
这个账号限制为本地网络下。
包含两个权限
    复制账户只需要主库的replication slave
    用来监控和管理复制的账号需要replication client

== 步骤二:配置主库和备库

server1的my.cnf 内容
    log_bin = mysql-bin  #打开二进制日志,定义log名称
    server_id = 10         #指定唯一服务器id(如ip尾号)

重启MySQL,检查是否创建了二进制日志文件
-> show master status;

server2的my.cnf 内容
    log_bin = mysql-bin  #打开二进制日志,定义log名称
    server_id = 2         #指定唯一服务器id
    relay_log = /var/lib/mysql/mysql-relay-bin #指定中继日志的位置和名称
    log_slave_updates = 1 #允许备库将其重放的事件也记录到自身的二进制日志中
    read_only = 1 #阻止没有特权的线程修改数据,在备库建表时不适用

-注:尽量不在my.cnf 中配置master_port 和 master_host这些选项,而是在执行语句中设置。

== 步骤三:在备库启动复制
-> change master to master_host = 'server1',
master_user='repl',
master_password='p4ssword',
master_log_file='mysql-bin.000001',
master_log_pos=0;

检查复制是否正确执行
-> show slave status\G
# Slave_IO_Running显示为No,复制尚未运行;Read_Master_Log_Pos位置为4


开始复制
-> start slave;

再次检查复制是否正确执行
-> show slave status\G
# Slave_IO_Running显示为Yes

备库的I/O线程正在等待从主库传递过来的事件,这意味着备库的I/O线程已经读取了主库的所有的事件,同时Read_Master_Log_Pos位置发生了变化。

查看线程列表
-> show processlist\G
# 在主库线程表中查看由备库发起的连接
# 在备库可以看到I/O线程和SQL线程

-注:http://mysqlsandbox.net下载实例


(未完)