mysql用binlog主从复制

150 阅读4分钟

微信技术群:Day9884125

1 linux编辑文档时候断网

当在编辑文档的时候,断网。再打开时候报发现交换文件

1.1 执行指令:

发现出问题的文件

ls -al        

1.2 删除出问题文件

image.png

然后就可以使用了

2 主库配置

2.1 编辑/etc/my.cnf文件

# server-id 建议不使用0,因为会有问题
server-id=412501
# 开启binlog
log_bin=mysql-bin
# 指定中继日志的位置和命名
relay_log=/var/lib/mysql/mysql-relay-bin
# log_slave_update 不开启会遇到比较奇怪的现象
log_slave_updates=1
# 不要在配置文件my.cnf中设置master_port或master_host这些选项,这是老的配置方式,已经被废弃,它只会导致问题,不会有任何好处


# 允许最大连接数
max_connections=200
# 允许连接失败的次数
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8

2.2 重启mysql服务

service mysqld restart

2.3 给用户分配权限

2.3.1 给root用户分配replication slave的权限

首先登录主数据库

mysql -u root -p

开放权限 用户slave

CREATE USER 'slave'@'%' IDENTIFIED BY 'Duay4125!';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

刷新数据库

flush privileges;

查看主节点同步状态

show master status;

   实际生产环境中,通常不使用root用户,而会创建一个拥有全部权限的用户来负责主从同步。

image.png

   这个指令结果中的file和position记录的是当前日志的binlog文件以及文件中的索引,而后面的binlog_do_db和binlog_lgnore_db这两个字段是表示需要记录binlog文件的库以及不需要记录binlog文件的库。目前没有进行配置,就表示是针对全库记录日志

3 从库配置

3.1 编辑/etc/my.cnf

# id不要和其他的server-id重复
server-id=412502
# 开启binlog
log_bin=mysql-bin
# 指定中继日志的位置和命名
relay_log=/var/lib/mysql/mysql-relay-bin
# log_slave_update 不开启会遇到比较奇怪的现象
log_slave_updates=1

# 允许最大连接数
max_connections=200
# # 允许连接失败的次数
max_connect_errors=10
# # 服务端使用的字符集默认为UTF8
character-set-server=utf8

3.2 设置主节点同步状态

3.2.1 登录从服务

mysql -u root -p;

3.2.2 设置同步主节点

change master to 
master_host='8.142.93.199', 
master_user='slave', 
master_password='Duay4125!', 
master_port=3306, 
master_log_file='mysql-bin.000002', 
master_log_pos=156, 
master_connect_retry=30;

3.2.3 开启slave

start slave;

3.2.4 关闭slave

stop slave;

3.2.4 查看主从同步状态

show slave status \G;

   注意,change master指令中需要指定的master_log_file和master_log_pos必须和主服务中查到的一致。
   并且后续如果要检查主从架构是否成功,也可以通过检查主服务与从服务之间的File和Position这两个属性是否一致来确定。

image.png

   我们重点关注其中红色方框的两个属性,与主节点保持一致,就表示这个主从同步搭建是成功的。
   从这个指令的结果能够看到,有很多Replicate_开头的属性,这些属性指定了两个服务之间要同步哪些数据库、哪些表的配置。只是在我们这个示例中全都没有进行配置,就标识是全库进行同步。后面我们会补充如何配置需要同步的库和表。

4 验证

4.1 首先在主库中创建一个数据库

create database `test-pro`

4.2 查看主库和从库中的新建的数据库是否存在

show databases;

如果两个mysql中都有新建的数据库表示就成功了

5 注意:

   这种binlog搭建的主从复制,数据库和表必须是新创建的,已有的数据库和表。从库默认是不会复制的
   本次配置默认的是全部复制,如果哪些表和库不复制需要在my.cnf中添加配置

6 全库同步与部分同步

   在实际环境中,一般并不需要针对全库做备份,而只需要对一些特别重要的库或者表进行同步。

6.1 master端:在my.cnf文件中

# 需要同步的二进制数据库名
binlog-do-db=master
# 只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
# 不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=sys

6.2 在slave端:在my.cnf文件中

# 如果salve库名称与master库名相同,使用本配置
replicate-do-db = master
# 如果master库名[master]与salve库名[master01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = master -> master01
# 如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=masterdemo01.t_dict
replicate-wild-do-table=masterdemo01.t_num