数据库主从同步

优点:对于负载比较大的网站,主从同步可以有效缓解数据库读写压力。  当主库有变更事件时,从库进行相应更新,而如果从库有变更,主库是不会进行同步信息的。

-->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;       
即可开启主从同步















原文地址:https://www.cnblogs.com/linqiuhua/p/7513403.html