mysql主从复制的原理:
master有一个io线程,slave有一个sql线程和io线程。
master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志中记录这些改变,即使事务是交叉执行的,
也会串行的写入二进制日志,在事务写入二进制日志完成后,master将通知存储引擎提交事务
slave将master的二进制日志拷贝到自己的中继日志。slave会开启一个io线程,io线程从master的二进制日志中读取事件,
并将这些事件写入中继日志,如果已经跟上master,它会睡眠等待master产生新的事件。
slave从中继日志读取事件,并执行日志记载的事务而更新slave的数据,使其与master的数据一致。
如何配置:
为准备主从复制,需要主服务器激活二进制日志功能,并且从服务器应该具备连接主服务
和主服务器把二进制日志传输给它的权限。
首先,在主服务器给从服务器创建复制账号:
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@’10.100.0.200’ IDENTIFIED BY ‘1234’;
然后,修改master的配置文件,包括打开二进制日志,服务器id
server-id=1
log-bin=mysql-bin 开启日志文件
max_binlog_size = 500M 每个日志文件的大小
binlog-do-db = adb 需要同步的数据库名字
log-slave-updates
binlog_format="MIXED" 设置bin-log日志文件格式为:MIXED
expire_logs_day=2 设置bin-log日志文件保存的天数
然后配置从服务器,包括打开二进制日志,打开中继日志
log_bin = mysql-bin
server_id= 2
relay_log = mysql-relay-bin
log_slave_updates = 1
配置主机并开启从服务器复制功能
查看主机151状态:master:SHOW MASTER STATUS \g;
在152从机上面执行:
change master to
master_host='192.168.1.151',
master_user='root',
master_password='root',
master_port=3306,
master_log_file='bin-log.003',这个和下面的值要根据SHOW MASTER STATUS记载的值来设定
master_log_pos=4;
start slave;
mysql支持的复制类型
语句的复制:二进制文件复制到中继文件时,在500M大小的文件末尾,按照语句;来复制
行的复制:把500M二进制文件整个复制
混合类型:默认使用语句复制,再不精确时用行复制
mysql主从复制数据不一致的原因以及解决办法
由于mysql的主从复制是网络传送二进制文件,网络延迟是主从不同步的绝大多数原因
怎么排查:
查看进程是否sleep太多了
查看主进程的状态
怎么解决:
先进入主库,进行锁表:flush tables with read lock
数据备份:mysqldump -uroot -p -hlocalhost > mysql.bak.sql
查看master状态:show master status;
把mysql备份文件传到从服务器:scp mysql.bak.sql root@192.168.128.101:/tmp/
停止从库:stop slave;
然后到从库执行mysql命令,导入数据备份 mysql> source /tmp/mysql.bak.sql
设置从库同步,注意该处的同步点,就是主库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;
重新开启从同步 mysql> start slave;
查看同步状态 mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
好了,同步完成啦。
master有一个io线程,slave有一个sql线程和io线程。
master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志中记录这些改变,即使事务是交叉执行的,
也会串行的写入二进制日志,在事务写入二进制日志完成后,master将通知存储引擎提交事务
slave将master的二进制日志拷贝到自己的中继日志。slave会开启一个io线程,io线程从master的二进制日志中读取事件,
并将这些事件写入中继日志,如果已经跟上master,它会睡眠等待master产生新的事件。
slave从中继日志读取事件,并执行日志记载的事务而更新slave的数据,使其与master的数据一致。
如何配置:
为准备主从复制,需要主服务器激活二进制日志功能,并且从服务器应该具备连接主服务
和主服务器把二进制日志传输给它的权限。
首先,在主服务器给从服务器创建复制账号:
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@’10.100.0.200’ IDENTIFIED BY ‘1234’;
然后,修改master的配置文件,包括打开二进制日志,服务器id
server-id=1
log-bin=mysql-bin 开启日志文件
max_binlog_size = 500M 每个日志文件的大小
binlog-do-db = adb 需要同步的数据库名字
log-slave-updates
binlog_format="MIXED" 设置bin-log日志文件格式为:MIXED
expire_logs_day=2 设置bin-log日志文件保存的天数
然后配置从服务器,包括打开二进制日志,打开中继日志
log_bin = mysql-bin
server_id= 2
relay_log = mysql-relay-bin
log_slave_updates = 1
配置主机并开启从服务器复制功能
查看主机151状态:master:SHOW MASTER STATUS \g;
在152从机上面执行:
change master to
master_host='192.168.1.151',
master_user='root',
master_password='root',
master_port=3306,
master_log_file='bin-log.003',这个和下面的值要根据SHOW MASTER STATUS记载的值来设定
master_log_pos=4;
start slave;
mysql支持的复制类型
语句的复制:二进制文件复制到中继文件时,在500M大小的文件末尾,按照语句;来复制
行的复制:把500M二进制文件整个复制
混合类型:默认使用语句复制,再不精确时用行复制
mysql主从复制数据不一致的原因以及解决办法
由于mysql的主从复制是网络传送二进制文件,网络延迟是主从不同步的绝大多数原因
怎么排查:
查看进程是否sleep太多了
查看主进程的状态
怎么解决:
先进入主库,进行锁表:flush tables with read lock
数据备份:mysqldump -uroot -p -hlocalhost > mysql.bak.sql
查看master状态:show master status;
把mysql备份文件传到从服务器:scp mysql.bak.sql root@192.168.128.101:/tmp/
停止从库:stop slave;
然后到从库执行mysql命令,导入数据备份 mysql> source /tmp/mysql.bak.sql
设置从库同步,注意该处的同步点,就是主库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;
重新开启从同步 mysql> start slave;
查看同步状态 mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
好了,同步完成啦。