# 复制原理
Master 将数据改变记录到二进制日志 (binary log) 中,也就是配置文件 log-bin 指定的文件,这些记录叫做二进制日志事件 (binary log events)
Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志 (relay log)
Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据 (数据重放)
要求
主从服务器操作系统版本和位数一致
Master 和 Slave 数据库的版本要一致
Master 和 Slave 数据库中的数据要一致
Master 开启二进制日志,Master 和 Slave 的 server_id 在局域网内必须唯一
# 一主一从配置
进入 conf 目录中编辑 my.cnf
主:172…18.12.1
从:172…18.12.2
主配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 [client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character_set_server=utf8 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #配置大小写不敏感 lower_case_table_names=1 server_id=1 ###服务器id log-bin=mysql-bin ###开启日志文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 配置说明:# 不同步哪些数据库 binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema #只同步哪些数据库,除此之外,其他不同步 binlog-do-db = order ##设置server_id,一般设置为IP,注意要唯一 server_id=1 ##复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql ##开启二进制日志功能,可以随便取,最好有含义(关键就是这里了) log-bin=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
授予从机权限
1 2 3 mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码'; mysql>flush privileges; #刷新权限
指定 ip
1 2 3 4 mysql>CREATE USER '用户名'@'%' IDENTIFIED BY '密码'; #创建用户 mysql>GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%'; #分配REPLICATION(主从复制)权限 mysql>flush privileges; #刷新权限
从配置文件
1 2 3 4 5 6 7 8 9 10 11 port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character_set_server=utf8 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #配置大小写不敏感 lower_case_table_names=1 server_id=2 ###服务器id log-bin=mysql-bin ###开启日志文件
连接到主服务器
1 2 show master status;(查询主状态信息)
连接从服务器
同步主服务器配置
1 2 change master to master_host='172.18.12.1',master_user='root',master_password='root', master_log_file='mysql-bin.000005',master_log_pos=1188;
配置说明
1 2 master_host为主库IP,master_user,master_password为主库用户名和密码,master_log_file和master_log_pos就是上图的这个File和Position
开始同步 start slave;
检查从服务器复制功能状态 SHOW SLAVE STATUS; (Slave_IO_Running 、Slave_SQL_Running 都为 Yes 说明配置成功)
从机挂掉后重启后,可能会复制失败,可用执行 reset slave; 清空然后再 start slave; 重新配置主机时,需要先 stop slave; 再 change master to …
# 双主双从配置
主配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character_set_server=utf8 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #配置大小写不敏感 lower_case_table_names=1 server_id=2 ###服务器id log-bin=mysql-bin ###开启日志文件 auto_increment_increment=2 auto_increment_offset=2 binlog_format=mixed expire_logs_days=7 ##relay_log配置中继日志 relay_log=edu-mysql-relay-bin ##log_slave_updates表示slave将复制事件写进自己的二进制日志2 log_slave_updates=1 ##防止改变数据(除了特殊的线程) read_only=1 slave_skip_errors=1062
在两个主机上都执行一次主从复制的步骤即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 主从复制语句备份 CREATE TABLE `user` ( `user_id` bigint(20) AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(30) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; grant replication slave, replication client on *.* to 'root'@'172.18.12.2' identified by 'root'; grant replication slave, replication client on *.* to 'slave'@'172.18.12.3' identified by 'slave'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; flush privileges; show master status; change master to master_host='172.18.12.2', master_port=3306, master_user='root', master_password='root', master_log_file='mysql-bin.000003', master_log_pos=588; start slave; stop slave; show slave status;