需要2个安装了mysql的服务器,一个主服务器,一个或多个从服务器。
mysql安装:https://www.cnblogs.com/duguxiaobiao/p/9465702.html
我的本地虚拟服务器:
默认3306端口
192.168.28.30 主
192.168.28.56 从
1、修改主服务器的my.cnf
# 1、编辑my.cnf
vim /etc/my.cnf
# 2、添加以下配置
server-id = 1 # 节点ID,确保唯一
# log config
log-bin = mysql-bin #开启mysql的binlog日志功能
sync_binlog = 1 #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
binlog_format = mixed #binlog日志格式,mysql默认采用statement,建议使用mixed
expire_logs_days = 7 #binlog过期清理时间
max_binlog_size = 100m #binlog每个日志文件大小
binlog_cache_size = 4m #binlog缓存大小
max_binlog_cache_size= 512m #最大binlog缓存大
binlog-ignore-db=mysql #不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行
auto-increment-offset = 1 # 自增值的偏移量
auto-increment-increment = 1 # 自增值的自增量
slave-skip-errors = all #跳过从库错误
# 3、重启mysql
systemctl restart mysqld
2、修改从服务器的my.cnf
# 1、编辑my.cnf
vim /etc/my.cnf
# 2、添加以下配置
server-id = 2
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
# 3、重启mysql
systemctl restart mysql
3、主服务器mysql创建复制用户并授权
# 1、进入master的数据库,为master创建复制用户
mysql -uroot -p123456
mysql > CREATE USER repl_user IDENTIFIED BY '复制用户的密码';
# 2、赋予该用户复制的权利
mysql > grant replication slave on *.* to '复制用户名'@'从服务器ip' identified by '复制用户的密码';
mysql>FLUSH PRIVILEGES;
# 3、查看master的状态
show master status
4、配置从服务器
执行mysql
CHANGE MASTER TO MASTER_HOST = '主服务器ip',MASTER_USER = '复制用户名',MASTER_PASSWORD = '复制用户的密码',MASTER_PORT = 3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=856,MASTER_RETRY_COUNT = 60,MASTER_HEARTBEAT_PERIOD = 10000;
备注
MASTER_LOG_FILE='mysql-bin.000001',#与主库File 保持一致
MASTER_LOG_POS=856, #与主库Position 保持一致
5、启动从库进程
mysql > start slave;
这一步后,配置就结束了。
6、测试
1、在主服务器mysql执行新建test数据库命令,从服务器mysql自动就出现了test数据库。
# 主库执行
create database test2;
2、主库在配置主从复制之前就已经存在的表,如果在test里新建表,会发生什么?
# 主库执行
create table `user`(`id` int(11) UNSIGNED AUTO_INCREMENT,`username` varchar(30) NOT NULL,`password` varchar(50) NOT NULL,PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=utf8;
结果:主库test库,从库没有test库,在主库的test库新建数据表,从库不会发生任何变化。
2.2、假如我在从库也新建了test库,然后再从主库test库新建user2表,从库的test库,会不会出现user2表呢?
结果:不会,只要配置主从后,后面创建的数据库才会进行从库同步
3、假如我在从库test2库,新建user2表,主库会不会同步从库的user2表呢?
结果:主库不会同步从库的命令
之后又在主库新建user2表,然后在主库插入一条数据,从库并没有出现插入的数据。
# 主库执行
insert into user2(`username`,`password`)values('user1','123456');
结果:在从库新建的表,再去主库新建一样的表,执行sql,不会进行同步操作。
7、经过这几次操作后
从库发生了错误,停止了同步,原因是从库数据冲突导致同步停止。
解决方法:
1、登陆从库查看从库的同步状态 SHOW SLAVE STATUS , 查看Slave_IO_Running 、Slave_SQL_Running 这两个状态是否是YES,如果不是那么就表示主从同步出错停止了,再看看错误的信息是什么(Last_SQL_Error提示)
2、解决错误:如果有在从库做什么操作,先备份从库新增的数据或者新建的表,然后把这些新增的数据、新建的表删除掉,关闭同步,重启同步,如果还有问题,则再执行下面的操作:
stop slave;
# 表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter=1;
start slave;
只要不在从库做插入更新删除等操作,就不会出现同步出错的问题。
以下省略。。。