MySQL主从复制
原理
从机有两个线程,一个IO线程,一个SQL线程
IO 线程会主动请求大哥的日志文件 ,小弟的SQL线程会读取解析生成SQL逐一执行
注意
-
-
从机开启IO线程 和SQL线程
-
尽量版本相同,要么主机的版本低于从机的
-
主从复制至少需要两个mysql服务
-
主机和从机需要时间同步
主从复制
1.一主一从
2.主主复制
3.一主多从
4.多主一从
5.联机复制
配置文件
【准备工作:所有机器安装好mysql就行了】
-
主(大哥的)机器
#配置vi /etc/my.cnf 复制下面放在文件最下面就行 ################################################### log-bin=master-bin #日志文件名 ,这个名字自己定义 binlog-format=ROW #三种格式:row、statement、mixed, #row 基于行的复制 把改变的内容复制过去,不是把命令执行一遍 #statement 基于语句的复制,效率较高 #mixed 一旦发现基于语句的无法精确的复制时,就采用基于行的复制,用的比较多 server-id=1 #要求各个服务器的id必须不一样 binlog-do-db=msb #同步的数据库名称 binlog-ignore-db=mysql #这个库过滤掉一般不用复制 expire_logs_days=7 #为避免占用磁盘,默认0不删除 #跳过复制中的错误,避免slave端复制中断 slave_skip_errors=1062 #指主键重复错误,1032错误是因为主从数据库不一致
################################################## [root@dlb ~]# systemctl restart mysqld 重启服务 #进入mysql 执行 mysql> show master status; #查看状态 ,看同步的数据库名称在不 +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 156 | msb | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> #################################################### #给小弟配置下权限 进入mysql 这里可以省略,其实就是分配一个账号登录 set global validate_password_policy=0; set global validate_password_length=1; grant replication slave on *.* to 'root'@'%' identified by 'Sony+168'; flush privileges;
2.小弟从机的配置
##配置vi /etc/my.cnf 复制下面的 log-bin=master-bin #日志文件名 ,这个名字自己定义 binlog-format=ROW #三种格式:row、statement、mixed, server-id=2 #要求各个服务器的id必须不一样 binlog-ignore-db=mysql #这个库过滤掉一般不用复制 expire_logs_days=7 #为避免占用磁盘,默认0不删除 #跳过复制中的错误,避免slave端复制中断 slave_skip_errors=1062 #指主键重复错误,1032错误是因为主从数据库不一致 #配置中继日志,默认采用 主机名-relay-bin的方式保存 relay_log=liuchong-relay-bin #从机将事件写进自己的日志 log_slave_updates=1 #防止改变数据(只读操作,除了特殊线程) read_only=1 ##################################################### [root@iZbp1e0fmgc5gof1ly9cmlZ home]# vi /etc/my.cnf [root@iZbp1e0fmgc5gof1ly9cmlZ home]# systemctl restart mysqld #重启服务 [root@iZbp1e0fmgc5gof1ly9cmlZ home]# mysql -uroot -p change master to MASTER_HOST='47.101.165.96',MASTER_USER='admin',MASTER_PASSWORD='Amanda+3213',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=156; #################################以下为测试端口复制出来的 mysql> change master to MASTER_HOST='47.101.165.96',MASTER_USER='admin',MASTER_PASSWORD='Amanda+3213',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=156; Query OK, 0 rows affected, 9 warnings (0.02 sec) mysql> start slave; #启动从机线程,此时已经能够建成一主一从 Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show slave status\G #这里是查看信息!注意没有分号 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.101.165.96 Master_User: admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 156 Relay_Log_File: iZbp1e0fmgc5gof1ly9cmlZ-relay-bin.000002 Relay_Log_Pos: 325 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
主从复制完成