主从同步:顾名思义就是主库(master)和从库(slave)的数据同步。
主要作用:
1,数据备份一种方式,
2,读写分离实现主库的访问流量削峰,
3,实现负载均衡,
一,mysql主从数据库服务安装,mastaer安装在了win64(192.168.1.104)上,slave安装在win64(192.168.1.108)上,由于之前安装过两台物理都安装过mysql服务所以中间两台机器安装mysql都出现好多坑。
win:mysql-5.7.17.msi(mysql官网就能下载)
安装完成之后主要是对my.ini文件的配置,
master配置:
找到my.ini,这个文件不是安装目录下的my-default.ini,是win C:\ProgramData下对应mysql中my.ini文件(好多博主都没有说明这一点,导致很多人直接改了my-default.ini,但其实不会起作用)
Server Id.
server-id=101 #serverId主要是用来区分区分服务
log-bin=mysql #开启二进制日志,主从数据库同步就是通过读取这个日志来实现的(开启二进制日志就是把默认文件中log-bin前面的#去掉,并修改成这种新式log-bin=mysql,最后产生的二进日志文件的名字都是以mysql.xxx开始的)
binlog-do-db=csfootball #要同步的数据库
binlog-ignore-db=mysql #不需要同步的数据库
expire_logs_days=7 #二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
注(my.ini中的注解只能用#,我直接用了)
用命令登录mysql目录下:在master上给从slave用户授权的,msyql5.7之后的授权是先创建用户然后然后授权,之前是创建和授权一起,不过两个都可以,
新方法:
CREATE USER ‘slave’@’%’ IDENTIFIED BY ‘123456’;#创建用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@’192.168.1.108’; 授权
意思就是在107添加用户,这个用户的来访ip是192.168.1.108,用户名slave ,密码是123456。
可以通过命令查看日志开启状态;show variables like ‘log_bin’;
log_bin是on说明已经开启,of说明没开启,
可以通过show master status; 查看当前的日志
说明当前要同步的是csfootball数据库,日志是mysql.000018,位置是在154上。至此master配置完成。
slave配置:
也是找对应的my.ini文件
[mysqld]
server-id=106 #唯一的id,不能和master相同
master-host=192.168.1.107 #服务ip
master-user=slave#第一步创建账号的用户名
master-password=123456#第一步创建账号的密码
master-port=3306
master_log_file=’master-bin.000001’,#Master服务器产生的日志
master-connect-retry=60 # 当重新建立主从连接时,如果连接建立失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。
replicate-do-db=csfootball#要同步的mstest数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名
replicate-ignore-db=mysql#//要忽略的数据库
master_log_pos=154; #show master status命令查到的:postion位置
在slave命令模式下分别执行:
stop slave;
start alsve:
如果启动和停止没问题就可以下面一个命令
show slave status\G;
仔细看查看数,有master的ip,授权用户名,读取二进制文件的名字,等
重要的几个参数:
Slave_IO_Running: Yes #都必须为yes
Slave_SQL_Running: Yes
其它只要保证两个库相同(包括数据自字段类型,长度相同),两个物理能正常互相访问数据库就可以。在master中添加说话,从slave中也可以查询到。
slave可以直接在my.inizhi配置
server-id=103
连接ip用户等可以用命令来实现
mysql> change master to master_user=’slave01’,master_password=’123456zfq’,master_host=’192.168.1.107’,master_port=3306,master_log_file=’mysql.000017’,master_log_pos=154;
效果是一样的。