在看过老男孩老师博客http://oldboy.blog.51cto.com/2561410/839399里写的关于mysql的主从复制后,我将 自己做的试验过程记录如下,包括脚本,故障解决,图文并茂叙述过程,因篇幅过长,可能有所删减,请看到此文的朋友见谅.   因借鉴老男孩老师的视频,虽然不是他的学生,也在此默默的感谢他的视频,他视频里的环境是在一机多实例的环境当中,并且mysql可能做了相关优化,我的环境则是两台机器上,有任何不对的地方欢迎大家指出.
1复制准备
主库(mysql master):  ip192.168.1.5   port3306
从库(mysql slave):   ip192.168.1.4  port3306
数据库环境准备,具备两台服务器每个机器一个数据库的环境.
2.主库上执行操作
2.1设置server-id值并开启binlog参数
根据mysql的同步原理,我们知道复制的关键因素就是binlog日志.
执行vi   /etc/my.cnf编辑my.cnf配置文件,按如下两个参数内容修改:
[mysqld]
server-id = 1
log-bin = mysql-bi
提示:
1.上面两参数放在my.cnf中的[mysqld]模块下,否则会出错;
2.要先在my.cnf文件中查找相关参数,并按要求修改,不存在时在添加参数,切记,参数不能重复;
3.修改my.cnf配置后需要重启数据库命令为:/etc/init.d/mysql  restart,注意确认真正重启了(此处数据库为源码包安装,在后面我将贴出mysql的启动脚本)
检查配置后的结果(这是一个好的习惯):
grep  -E  "server-id|log-bin" /etc/my.cnf   egrep一样的作用
 
mysql数据库的主从同步过程详述(一)
/etc/init.d/mysql  restart
2.2建立用于同步的账号rep
登陆mysql 3306实例主数据库
mysql  -uroot  -p'123123'  -S  /tmp/mysql.sock
mysql>select   user();    查看用户
mysql>grant  replication  slave  on  *.*  to  'rep'@'192.168.1.%'  identified  by  "123456"建立用于库复制的账号rep
#replication  slavemysql同步的必须权限,此处不要授权all
#*.*表示所有库所有表,库也是可以指定具体的库和表进行复制,test.test1test库的test1表);
#'rep'@'192.168.1.%' rep为同步账号,192.168.1.%为授权主机,使用了%表示允许整个192.168.1.0网段以rep用户访问;
#identified  by  "123456" , 123456为密码,实际环境时复杂一点为好。
再次检查创建的rep账号
select  user.host  from  mysql.user;
也可以查看用户权限   mysql>show  grants  for  [email protected]'192.168.1.%';
mysql数据库的主从同步过程详述(一)
2.3对数据库锁表只读(当前窗口不要关闭)
生产环境时,操作主从复制,需要申请停机时间,锁表会影响业务。
mysql>flush  tables  with  read  lock;
提示,这个锁表命令的时间,在不同引擎的情况,会受下面参数的控制,锁表时,如果超过设置时间不操作会自动解锁;
interactive_timeout = 60
wait_timeout = 60
默认情况下的时长为:
mysql>show  variables  like  "%timeout%";  可以查看到默认值很大
mysql数据库的主从同步过程详述(一)
完成后测试下是否锁表,打开另一窗口创建一test1表,是不会执行的,证明锁表不能更新,但可读,不可写,因为是read读锁,锁表主要是为了导出数据库文件,从而取得正确的偏移量的值,保证导入从数据库,数据一致。
2.4查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
show  master  status;命令显示的信息要记录在案,后面的从库复制时是从这个位置开始的。
mysql数据库的主从同步过程详述(一)
2.5导出数据库数据
单开新窗口,导出数据库数据,如果数据库量很大(100G+,并且允许停机可以,可以直接停库打包数据文件迁移。
mkdir  /server/backup/  -p
mysqldump  -uroot  -p"123123"  -S  /tmp/mysql.sock  -A  -B  | gzip  > /server/backup/mysql_bak.$(date  +%F).sql.gz
#注意,-A表示备份所有库, -B表示增加user  DBdrop等参数(导库时会直接覆盖所有的)。
ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
为了确保导库期间,数据库没有数据插入,可以再检查下主库状态信息
mysql  -uroot  -p"123123"  -S  /tmp/mysql.sock  -e  "show  master  status"
提示,无特殊情况,binlog文件及位置点是保持不变的。
mysql数据库的主从同步过程详述(一)
导库后,解锁主库,恢复可写;
mysql>unlock  tables;
特别提示,有读者这里犯迷糊,实际上做从库的,无论主库更新多少数据了,最后从库都会从上面show  master  status  的位置很快赶上主库的位置进度的。
2.6把主库备份的mysql数据迁移到从库
这步常用命令有scp,rsync等。
ls  -l  /server/backup/mysql_bak.$(date  +%F).sql.gz
mysql数据库的主从同步过程详述(一)
请继续关注mysql数据库的主从同步过程详述(二)

转载于:https://blog.51cto.com/wanghaipeng1124/874651

相关文章: