Mysql二进制日志文件(binlog)主从复制最佳实践

实践背景

最近加入了同窗的技术分享小组,4我的分两组,半月进行一次技术分享,如今一块儿搞Mysql我被分到讲解Mysql日志方面,上周已经讲完了,不过他们老是以为对于日志这块了解不透彻,以为不过关...因而你们自觉强制在加一轮分享做为对mysql这段时间的学习总结,结合实践来进行分享,以前分享的日志的分类和原理很是理论,我本身也不满意,因而花了一天把二进制日志的数据恢复和主从复制搞了一下,因而这篇文章产生了,纸上得来总觉浅,绝知此事要躬行,这句话忽然从我脑海中冒出来了。mysql

预先配置

我是将Mac OS本机的Mysql做为master,虚拟机的Mysql做为slave,首先修改master和slave的my.cnf数据库配置文件。内容以下:我这里配置的是同步master的test数据库。
git

master的my.cnfgithub

[mysqld]
# 主从备份相关配置
server-id = 1                # 服务器 id 号,不要和其余服务器重复
log-bin=mysql-bin            # 开启二进制日志
log_bin_index = mysql-bin.index        # 索引二进制日志的文件名
sync_binlog = 1                # 设为1就是把MySql每次发生的修改和事件的日志即时同步到硬盘上
binlog_format = Row            # 复制模式 Statement, Row, mixed
skip_slave_start = 1           # 防止从服务器在崩溃后自动开启,以给你足够的时间修复。
max_binlog_size = 200M         # 指定二进制日志的大小

# 须要同步的二进制数据库名
binlog-do-db = test
# 不一样步的二进制数据库名,若是不设置能够将其注释掉
binlog-ignore-db = information_schema
binlog-ignore-db = mysql

slave的my.cnfsql

# 主从备份相关配置 - 从服务器
 server-id = 2                   # 服务器 id 号,不要和其余服务器重复
 read_only = 1                   # 让从服务器只读,能够防止有人误从服务器插入数据,致使主从数据不一致。 
 log-bin=mysql-bin               # 开启二进制日志
 log_bin_index = mysql-bin.index # 索引二进制日志的文件名
 log_slave_updates = 1
 relay_log = mysql-relay-bin     # 中继日志 
 relay_log_index = mysql-relay-bin.index
 skip_slave_start = 1            # 防止从服务器在崩溃后自动开启,以给你足够的时间修复。 
 max_binlog_size = 200M          # 指定二进制日志的大小

 # 如下配置是为了方便之后,从库切换为主库
 # 须要同步的二进制数据库名
 binlog-do-db = test
 # 不一样步的二进制数据库名,若是不设置能够将其注释掉
 binlog-ignore-db = information_schema
 binlog-ignore-db = mysql

实践过程

配置文件修改完,须要将mysql服务重启,使得配置生效;而后在master上使用root用户建立同步帐户并受权slave;而后查看master状态,此时不要再进行master的操做,配置slave的跟踪master日志的位置;最后检查主从备份是否成功。具体实现过程以下:数据库

我这里建立的用户容许任何主机使用正确密码登录,也能够指定ip地址登录,至关于在master使用repl帐号密码也能够登录进行操做。服务器

// 建立同步帐户repl并受权
create user 'repl'@'%' identified by 'password'; 
grant all privileges on *.* to 'repl'@'%';

查看mster状态,我进行了两次mysql服务重启,因此二进制日志已经到mysql-bin.000003,咱们以后在master上操做会开始从mysql-bin.000003开始记录。ide

show master status\G

image

配置slave跟踪master日志的位置,本地ip地址是192.168.1.90,slave的ip地址是192.168.92.141,配置过程不须要用到slave的ip,repl是咱们建立的同步帐户,接下来是密码,二进制日志文件,和二进制日志中查看到的positon 5616。截图显示Position已经达到了6467,我应该是截图的时候搞得太慢了,数据库内部发生了一点变化,说明即便咱们不操做数据库,二进制日志也会记录数据库的变化,固然这不影响咱们的主从复制,由于Position提早了,就更不影响了。学习

CHANGE MASTER TO
             MASTER_HOST='192.168.1.90',
             MASTER_USER='repl',
             MASTER_PASSWORD='password',
             MASTER_LOG_FILE='mysq-bin.000003',
             MASTER_LOG_POS=5616;

接下来开启slave,检查slave主从备份的状态,这里Slave_IO_State状态是Wait for master to send event说明主从备份配置成功了,正在等待master数据库发生变化,若是主从复制失败,查看状态会显示出错误信息,能够根据状况进行调试。spa

// 开启slave
start slave;

// 查看状态
SHOW SLAVE STATUS\G

image

咱们接下来在test数据库的user表添加一行数据user4:调试

image

看下从库发生了同步,查看数据以下:image

看到从库同步增长了一行数据,说明咱们利用二进制日志binlog实现了主从备份成功了,最后提醒一下,个人数据库版本都是mysql8,0+的版本,若是版本不一致配置会遇到不少麻烦,最好是统一,不统一也不符合咱们的开发规范,建立同步帐户时,mysql8.0+版本的sql语句也不同,若是你的版本在mysql8.0如下,能够直接参考其余人的教程,可是大体步骤都是相同的,这篇文章着重于实现二进制日志的主从复制,目的为了更好的了解mysql日志,本人技术有限,若有错误,欢迎批评指正,谢谢。

相关文章
相关标签/搜索