十五周一次课(4月2日)
17.1 MySQL主从介绍
17.2 准备工作
17.3 配置主
17.4 配置从
17.5 测试主从同步
17.1 MySQL主从介绍
MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的
MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致有3个步骤
1)主将更改操作记录到binlog里
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里
3)从根据relaylog里面的sql语句按顺序执行
主上有一个log dump线程,用来和从的I/O线程传递binlog
从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地
MySQL主从原理图
17.2 准备工作
192.168.37.100从mysql,192.168.37.101主mysql
17.3 配置主
安装mysql
修改my.cnf,增加server-id=101和log_bin=aminglinux1
修改完配置文件后,启动或者重启mysqld服务
service mysqld restart
查看/data/mysql/目录下下,会多出2个已aminglinux1开头的文件,这些aminglinux1开头的文件非常重要,是实现主从的根本
aminglinux1.index //索引文件,必须要有
aminglinux1.000001 //二进制日志文件,以后还会生成aminglinux1.000002等,依次类推
把zrlog库备份并恢复成aming库,作为测试数据
备份zrlog库:mysqldump -uroot -paminglinux zrlog > /tmp/zrlog.sql
查看/tmp/zrlog.sql大小:du -sh /tmp/zrlog.sql
新建aming数据库:mysql -uroot -paminglinux -e "create database aming"
恢复zrlog库到aming库中:mysql -uroot -paminglinux aming < /tmp/zrlog.sql
对比开始时的aminglinux1.000001文件大小,可以看出文件大小也同步增加,增加的大小正好和zrlog库大小保持一致,里面完整的记录了数据库的创建过程,库,表,内容等
创建用作同步数据的用户
进入mysql:mysql -uroot -paminglinux
创建用户:grant replication slave on *.* to 'repl'@slave_ip identified by 'password'; //repl是为从(slave)端设置的访问主(master)端的用户,也就是要完成主从复制的用户。
grant replication slave on *.* to 'repl'@192.168.37.100 identified by 'password';
锁定表,不让继续写入:flush tables with read lock; //这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行
show master status; //查看master的状态,这是数据要记录的,一会要在slave端用到
继续备份其他库
mysqldump -uroot -paminglinux mysql2 > /tmp/my2.sql
17.4 配置从
安装mysql
查看my.cnf,配置server-id=100,要求和主不一样
修改完配置文件后,启动或者重启mysqld服务:service mysqld restart
把主上aming库同步到从上:scp 192.168.37.101:/tmp/*.sql /tmp/
做2个alias
alias 'mysql=/usr/local/mysql/bin/mysql'
alias 'mysqldump=/usr/local/mysql/bin/mysqldump'
进入mysql:mysql –uroot //没有设置密码
创建3个库
create database aming;
create database zrlog;
create database mysql2;
恢复3个库
mysql -uroot aming < /tmp/zrlog.sql
mysql -uroot zrlog < /tmp/zrlog.sql
mysql -uroot mysql2 < /tmp/my2.sql
要保证主从的数据要一致
登陆mysql:mysql –uroot
先关闭主从同步:stop slave;
实现主从同步:change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx;
change master to master_host='192.168.37.101', master_user='repl', master_password='pa ssword', master_log_file='aminglinux1.000001', master_log_pos=12994;
master_log_file是主上使用show master status命令查询到的File列里的aminglinux1.000001
master_log_pos是主上使用show master status命令查询到的Position列里的12994
打开同步:start slave;
判断主从是否配置成功:show slave status\G(最后可以不用分号,\G本身就是结束符)
确认以下两项参数都为Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
还需关注
Seconds_Behind_Master: 0 //为主从延迟的时间
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
还要到主上执行 unlock tables;
17.5 测试主从同步
几个配置参数
主服务器上
binlog-do-db= //仅同步指定的库,多个库可以用逗号分隔
binlog-ignore-db= //忽略指定库
从服务器上
replicate_do_db=
replicate_ignore_db=
replicate_do_table= //仅同步指定的表
replicate_ignore_table= //忽略指定表
replicate_wild_do_table= //如aming.%, 支持通配符%
replicate_wild_ignore_table=
使用时尽量使用最后两项,因为支持 库名.表名
主上使用aming库:use aming;
查看表:show tables;
查看log表的行数:select count(*) log;
在从上也查看一下:
主上清空log表:truncate table log;
有报错,我们清空的表具有外键约束报ERROR 1701(42000)
解决方法:在主上设置外键约束=0
set foreign_key_checks=0;
truncate table log;
select * from log; //表为空了
从上的表也是空了
主上删除log表:drop table log;
从上查看log表:select * from log; //没有了
恢复外键约束:set foreign_key_checks=1;
主上删除库:drop database aming;
从上查看:show databases; //没有aming库了
主从配置起来虽然很简单,但是这种机制非常脆弱,一旦我们不小心再slave上写了数据,那么主从复制也就被破坏了。另外,如果重启master,务必要先关闭slave,即在slave上执行stop slave命令,然后再去重启master的MySQL服务。否则主从复制很有可能会中断,重启master后,我们还需要执行start slave命令开启主从复制的服务。
如果主从复制破坏了,在从上执行
stop slave;
start slave;
show slave status\G命令查看
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果没有都是yes,那只有重新做主从复制了。
原文地址:http://blog.51cto.com/415326/2093964