1、主从服务器操作系统版本和位数一致
2、Master和Slave数据库的版本要一致
3、Master和Slave数据库中的数据要一致
4、Master开启二进制日志,Master和Slave的server_id在局域网内必须唯一
硬件需求
两台或两台以上安装了相同版本的MySQL(我没有试过不同版本会不会有问题,有兴趣的可以试试),当然这个可以用虚拟机或者Docker代替,个人推荐用Docker,比虚拟机消耗少太多了,当然用起来可能没有虚拟机那么方便,但是却不用挨个环境配置了
一、安装数据库
二、配置my.ini
[mysqld]
##设置server_id,一般设置为IP,注意要唯一
server_id=100
##复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
##开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
##为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
##主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
##二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
配置完成后重启mysql
关于复制过滤
复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:
1、在Master上过滤二进制日志中的事件
2、在Slave上过滤中继日志中的事件。
复制类型
1、基于语句的复制
在Master上执行的SQL语句,在Slave上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制
2、基于行的复制
把改变的内容复制到Slave,而不是把命令在Slave上执行一遍。从MySQL5.0开始支持
3、混合类型的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制
三、创建数据同步用户
1.CREATE USER ‘slave’@’%’ IDENTIFIED BY ‘123456’;
2.GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@’%’;
这里主要是要授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限
一、安装数据库
二、配置my.ini
[mysqld]
##设置server_id,一般设置为IP,注意要唯一
server_id=101
##复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
##开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin
##为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
##主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
##二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
##relay_log配置中继日志
relay_log=edu-mysql-relay-bin
##log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
##防止改变数据(除了特殊的线程)
read_only=1
如果Slave为其它Slave的Master时,必须设置bin_log。配置完成后重启mysql
完成Master和Slave链接
一、初始化数据
保证Master和Slave除不同步的数据库,其他库的数据一致
二、查询Master状态
在Master中执行
1 show master status;
记录下返回结果的File列和Position列的值
三、Slave中设置Master信息
在Slave中执行
1 change master to master_host=‘192.168.1.100’, master_user=‘slave’, master_password=‘123456’, master_port=3306, master_log_file=‘edu-mysql-bin.000001’, master_log_pos=1389, master_connect_retry=30;
上面执行的命令的解释:
master_host=’192.168.1.100’ ## Master的IP地址
master_user=’slave’ ## 用于同步数据的用户(在Master中授权的用户)
master_password=’123456’ ## 同步数据用户的密码
master_port=3306 ## Master数据库服务的端口
master_log_file=’edu-mysql-bin.000001’ ##指定Slave从哪个日志文件开始读复制数据(Master上执行命令的结果的File字段)
master_log_pos=429 ## 从哪个POSITION号开始读(Master上执行命令的结果的Position字段)
master_connect_retry=30 ##当重新建立主从连接时,如果连接建立失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。
四、查看主从同步状态
在Slave中执行命令
1 show slave status;
可看到Slave_IO_State为空, Slave_IO_Running和Slave_SQL_Running是No,表明Slave还没有开始复制过程。相反Slave_IO_Running和Slave_SQL_Running是Yes表明已经开始工作了
五、开启主从同步
在Slave中执行命令
1 start slave(开启同步线程执行同步);
2 stop slave(关闭同步线程)
查询查看主从同步状态,会发现Slave_IO_Running和Slave_SQL_Running是Yes了,表明开启成功
注意:我在实际操作中,首次操作完成后,在主服务器数据库添加数据后,发现从服务器数据库并没有天机对应的数据,这时候不要着急,请按照如下步骤再操作一次:
1.在Slave中执行 stop slave 命令
2.在master中执行 show master status,并查看master_log_file 和 master_log_pos的值
3.重新再slave中执行 (设置master_log_file和master_log_pos的的值为如上查出的值)
change master to master_host=‘192.168.1.100’, master_user=‘slave’, master_password=‘123456’, master_port=3306, master_log_file=‘edu-mysql-bin.000001’, master_log_pos=1389, master_connect_retry=30;
4.重新执行 show slave status命令,可看到Slave_IO_State为空, Slave_IO_Running和Slave_SQL_Running是No,表明Slave还没有开始复制过程。相反Slave_IO_Running和Slave_SQL_Running是Yes表明已经开始工作了
5.在Slave中执行 start slave命令
6.继续执行 show slave status,Slave_IO_Running和Slave_SQL_Running是Yes表明已经开始工作了,此时主从复制正式开启