优点:对于负载比较大的网站,主从同步可以有效缓解数据库读写压力。 当主库有变更事件时,从库进行相应更新,而如果从库有变更,主库是不会进行同步信息的。
-->mysql主从同步机制:
1.主服务器(master)将变更事件(更新,删除,表结构变更)写入二进制日志(master log)
2.从服务器(slave)的IO线程从主服务器(binlog dump)获取二进制日志,并在本地保存一份自己的二进制日志(relay log)
3.从服务器的sql线程读取本地日志(slave log),重演变更事件
-->mysql主从同步作用:
1.可以作为一种备份机制,相当于热备份(在从备份,避免在备份期间影响主服器工作)
2.可以用作读写分离,均衡数据库负载(主写从读)
3.当主服务器出现问题,可以切换到从服务器
-->mysql 主从同步步骤:
(1)准备工作:
1.主从数据库版本一致;
2.主从数据库数据一致。(即两个数据库中数据库、表、表数据都要一致,停止数据写入,如果有数据写入,则要进行锁表操作)
(2)主数据库master修改:
1、修改MySQL配置:
# /etc/my.cnf
log-bin = mysql-bin
# 主数据库端ID号
server-id = 1
log-bin=/home/mysql/logs/binlog/bin-log
max_binlog_size = 500M
binlog_cache_size = 128K
binlog-do-db = adb
binlog-ignore-db = mysql
log-slave-updates
expire_logs_day=2
binlog_format="MIXED"
#服务器标志号,注意在配置文件中不能出现多个这样的标识,如果出现多个的话mysql以第一个为准,一组主从中此标识号不能重复。
server-id = 1 log-bin=/home/mysql/logs/binlog/bin-log #开启bin-log,并指定文件目录和文件名前缀。
#每个bin-log最大大小,当此大小等于500M时会自动生成一个新的日志文件。一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。 max_binlog_size = 500M binlog_cache_size = 128K
#日志缓存大小 binlog-do-db = adb #需要同步的数据库名字,如果是多个,就以此格式在写一行即可。 binlog-ignore-db = mysql #不需要同步的数据库名字,如果是多个,就以此格式在写一行即可。
#当Slave从Master数据库读取日志时更新新写入日志中,如果只启动log-bin 而没有启动log-slave-updates则Slave只记录针对自己数据库操作的更新。 log-slave-updates expire_logs_day=2
#设置bin-log日志文件保存的天数,此参数mysql5.0以下版本不支持。 binlog_format="MIXED" #设置bin-log日志文件格式为:MIXED,可以防止主键重复。
2、重启mysql,创建用于同步的账户:
# 创建slave帐号slave,密码111111 mysql>grant replication slave on *.* to 'slave'@'%' identified by '111111';
# 更新数据库权限 mysql>flush privileges;
3、查询master的状态
mysql> show master status;
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+
| mysql-bin.000009 | 196 | | | +------------------+----------+--------------+------------------+ 1 row in set
============================================================版本二=============================================================================================
一主多从和一主一从是一样的,从库的配置都相同,但server-id主库从库1从库2都不能同
master 上;
1.修改master上的配置文件my.cnf。
server-id = 1
log-bin=mysql-bin
binlog-do-db=YYY //需要同步的数据库
binlog-ignore-db=mysql //被忽略的数据库
binlog-ignore-db=information-schema //被忽略的数据库
2.登陆主库的数据库,进行赋予权限
mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.182' identified by 'pwd123';
//在slave1上登陆成功
mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.111' identified by 'pwd123';
//在slave2上登陆成功
3.退出数据库并重启数据库服务
service mysql restart;
mysql> show master statusG;
*************************** 1. row ***************************
File: mysql-bin.000087 重要
Position: 106 重要
Binlog_Do_DB: YYY
Binlog_Ignore_DB: mysql,information-schema
1 row in set (0.00 sec)
slave 上:
1.检查从库上 /etc/my.cnf 文件中的server-id 和主库上的server-id 不能相同
2.登陆从库数据库,并执行以下代码 (master_log_pos
为 show master statusG;中的 Position: 154 )
change master to master_host='192.168.31.128',master_user='slave1',master_password='LINqiuhua811!', master_port=3306, master_log_file='mysql-bin.000006',master_log_pos= 154;
3.开启 slave
start slave;
4.检查 Slave_IO_Running: Yes 是否都为YES
Slave_SQL_Running: Yes
1.如果不为yes,查看日志 Last_IO_Error: error connecting to master 'slave1@192.168.31.128:3306' - retry-time: 60 retries: 1
解决:ip、端口、用户、密码是否和master中的赋予的权限中的用户密码ip一致
2.如果不为yes,查看日志
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.
因为数据库为克隆的,所以UUIDs参数一致。而主从同步中UUIDs不能一致
[root@localhost mysql]# vim auto.cnf
[auto]
server-uuid=11739547-dc5f-11e7-ad91-000c29e73110
解决:
因此要对UUIDs进行修改,即修改 vi /main/mysql/data/auto.cnf 中的auto.cnf文件
1.进入 /etc/my.cnf 找到 socket=/var/lib/mysql/mysql.sock ,则auto.cnf路径为 /var/lib/mysql/auto.cnf
2.mv /var/lib/mysql
/auto.cnf /var/lib/mysql
/auto.cnf.bk ###重命名该文件
3.重启mysql服务 service mysqld restart;
再进入 auto.cnf 里面的server-uuid值已经修改。
如何删除主从同步:
在从服务器上进行 stop slave; reset slave;
删除后如果又想进行主从同步:(此时binlog位置已经改变,我们需要chang master)
1.先在主服务器上 show master statusG; 得到File: mysql-bin.000012 Position: 148157
两个值
2.从服务器上
①stop slave;
②change master to master_host='192.168.31.128',master_user='linqiuhua',master_password='LINqiuhua811!',master_port=3306,master_log_file='mysql-bin.000012',master_log_pos=148157;
③start slave;
即可开启主从同步