本文共 3183 字,大约阅读时间需要 10 分钟。
mysql主从原理?主从不同步怎么办?主从慢
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
slave将master的binary log events拷贝到它的中继日志(relay log)slave重做中继日志中的事件,将改变反映它自己的数据。或
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
先上Master库:
mysql>show processlist; 查看下进程是否Sleep太多。发现很正常。show master status; 也正常。mysql> show master status;+-------------------+----------+--------------+-------------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+----------+--------------+-------------------------------+| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |+-------------------+----------+--------------+-------------------------------+1 row in set (0.00 sec)再到Slave上查看mysql> show slave status\G Slave_IO_Running: YesSlave_SQL_Running: No可见是Slave不同步下面介绍两种解决方法:方法一:忽略错误后,继续同步该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况解决:stop slave;#表示跳过一步错误,后面的数字可变set global sql_slave_skip_counter =1;start slave;之后再用mysql> show slave status\G 查看:Slave_IO_Running: YesSlave_SQL_Running: Yesok,现在主从同步状态正常了。。。方式二:重新做主从,完全同步该方法适用于主从库数据相差较大,或者要求数据完全统一的情况解决步骤如下:1.先进入主库,进行锁表,防止数据写入使用命令:mysql> flush tables with read lock;注意:该处是锁定为只读状态,语句不区分大小写2.进行数据备份#把数据备份到mysql.bak.sql文件[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失3.查看master 状态mysql> show master status;+-------------------+----------+--------------+-------------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+----------+--------------+-------------------------------+| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |+-------------------+----------+--------------+-------------------------------+1 row in set (0.00 sec)4.把mysql备份文件传到从库机器,进行数据恢复#使用scp命令[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/5.停止从库的状态mysql> stop slave;6.然后到从库执行mysql命令,导入数据备份mysql> source /tmp/mysql.bak.sql7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;8.重新开启从同步mysql> start slave;9.查看同步状态mysql> show slave status\G 查看:Slave_IO_Running: YesSlave_SQL_Running: Yes好了,同步完成啦。如果延迟比较大,就先确认以下几个因素:
1.?从库硬件比主库差,导致复制延迟2.?主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。更高版本的mysql可以支持多线程复制3.?慢SQL语句过多4.?网络延迟5.?master负载主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层6.?slave负载一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作.另外,?2个可以减少延迟的参数:–slave-net-timeout=seconds?单位为秒?默认设置为?3600秒#参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据–master-connect-retry=seconds?单位为秒?默认设置为?60秒#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟MySQL数据库主从同步延迟解决方案最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit=?1?之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。转载于:https://blog.51cto.com/13575683/2345802