MySQL自带复制方案,带来好处有:
数据备份。
负载均衡。
分布式数据。
概念介绍:
主机(master):被复制的数据库。
从机(slave):复制主机数据的数据库。
复制步骤:
(1). master记录更改的明细,存入到二进制日志(binary log)。
(2). master发送同步消息给slave。
(3). slave收到消息后,将master的二进制日志复制到本地的中继日志(relay log)。
(4). slave重现中继日志中的消息,从而改变数据库的数据。
下面放一张经典的图片来说明这一过程:
实现复制有以下步骤:
1.设置MySQL主库的二进制日志以及server-id
MySQL配置文件一般存放在/etc/my.cnf
# 在[mysqld]下面添加配置选项[mysqld]server-id=1log-bin=mysql-bin.log |
server-id是数据库在整个数据库集群中的唯一标示,必须保持唯一。
重启MySQL。
注:如果MySQL配置文件中已经配置过此文件,则可以跳过此步。
2.新建复制账号
在主库里面新建用于从库复制主库数据的账号,并授予复制权限。
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO user_name@'host' IDENTIFIED BY 'password'; |
3.设置MySQL主库server-id
和第二步配置一样,要注意的地方有两点:
如果不需要从库作为别的从库的主库的话,则不需要配置二进制日志。很多时候复制并不需要复制主库的全部数据库(特别是mysql的信息配置库)。因此可以配置replicate_do_db来指定复制的数据库 4.从库初始化主库的数据
如果数据量不算大的情况下,可以使用mysqldump工具导出主库数据,然后导入到从库里面。
mysqldump --single-transaction --triggers --master-data databasename > data.sql |
如果数据量大的情况下应该使用Xtrabackup去进行数据库的导出,此处不做介绍。
可能会有同学问,为什么不直接使用二进制日志进行初始化呢?
如果我们主库运行了比较长的一段时间,并不太适合使用从库根据二进制日志进行复制数据,直接使用二进制日志去初始化从库会比较耗费时间和性能。更多的情况下,主库的二进制日志的配置项没有打开,因此也就不存在以前操作的二进制日志。 5.开启复制
从库执行下面命令
mysql> CHANGE MASTER TO MASTER_HOST='host',-> MASTER_USER='user',-> MASTER_PASSWORD='password',-> MASTER_LOG_FILE='mysql-bin.000001',-> MASTER_LOG_POS=0; |
注意最后的两个命令:MASTER_LOG_FILE和MASTER_LOG_POS,表示从库的从哪个二进制文件开始读取,偏移量从那里开始,这两个参数可以从我们导入的SQL里面找到。
新闻热点
疑难解答