资讯专栏INFORMATION COLUMN

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

刘永祥 / 3299人阅读

摘要:的主从备份相关配置服务器号,不要和其他服务器重复开启二进制日志索引二进制日志的文件名设为就是把每次发生的修改和事件的日志即时同步到硬盘上复制模式防止从服务器在崩溃后自动开启,以给你足够的时间修复。

实践背景

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

预先配置

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

master的my.cnf

[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.cnf

 # 主从备份相关配置 - 从服务器
 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开始记录。

show master statusG

配置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数据库发生变化,如果主从复制失败,查看状态会显示出错误信息,可以根据情况进行调试。

// 开启slave
start slave;

// 查看状态
SHOW SLAVE STATUSG

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75531.html

相关文章

发表评论

0条评论

刘永祥

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<