简述:主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的 业务数据库、事务处理库,从库做查询库。
复制过程简单的说就是 master 将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志行数据操作
一、什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。在最常用的mysql数据库中,支持单向、异步复制。在复制过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器;此时主服务器会将更新信息写入到一个特定的二进制文件中。
并会维护文件的一个索引用来跟踪日志循环。这个日志可以记录并发送到从服务器的更新中去。当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。
二、主从复制的作用
- 是确保数据安全;做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据的丢失。
- 是提升I/O性能;随着日常生产中业务量越来越大,I/O访问频率越来越高,单机无法满足,此时做多库的存储,有效降低磁盘I/O访问的频率,提高了单个设备的I/O性能。
- 是读写分离,使数据库能支持更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
三、配置MySQL主从复制
主库(master):
1.修改配置文件 vi /etc/my.cnf
[mysqld]
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
# 在作为从库的时候,有写入操作也需要更新二进制日志文件
log-slave-updates
binlog-ignore-db=mysql
# 开启二进制日志功能
log-bin=mall-mysql-bin
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
# 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
2.重启MySQL服务器
systemctl restart mysqld
3.登录mysql,创建远程连接的账号,并授予主从复制权限
CREATE USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
4.通过指令,查看二进制日志坐标
show master status;
字段含义说明:
file: 从哪个日志文件开始推送日志文件
position:从哪个位置开始推送日志
binlog_ignore_db: 指定不需要同步的数据库
从库(slave):
1.修改配置文件 vi /etc/my.cnf
[mysqld]
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
# [可选] 启用中继日志
relay-log=mysql-relay
binlog-ignore-db=mysql
# 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
# 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7#
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# relay_log配置中继日志
relay_log=mall-mysql-relay-bin
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# slave设置为只读(具有super权限的用户除外)
read-only=1
2.重新启动MySQL服务
systemctl restart mysqld
3.登录mysql,设置主库配置(主库先执行后,从库再继续)
stop slave;(停止同步操作)
change master to master_host='192.168.31.135',master_user='slave1',master_password='123456',master_port=3306, master_log_file='mall-mysql-bin.000001', master_log_pos=591,master_connect_retry=30;
master_host:主库的ip地址,master_user:主库用户名,master_password:主库密码,master_port:端口号,master_log_file:二进制日志坐标file,master_log_pos:二进制日志坐标position
reset slave;(重置同步操作)
start slave;(启动同步操作)
5.查看主从同步状态(在从库数据库中执行)
show slave status\G
出现如图所示,出现两个(yes)就代表MySQL主从复制配置好了!!(可以通过增删改查数据库验证一下)
在主库中创建数据库,如下图所示:
在从库中查看数据库,如下图所示: