首页 > 代码库 > 玩转mysql主从
玩转mysql主从
++++++++++++++++++++++++ 在master上处理 ++++++++++++++++
#1 配置文件中添加并保证唯一
server-id=1
log-bin=/var/lib/mysql/mysql-bin
#2 重启
/etc/init.d/mysqld restart
#3 建立用于同步的账号rep
grant replication slave on *.* to ‘rep‘@‘192.168.11.%‘ identified by ‘123456‘;
flush privileges;
show grants for rep@‘192.168.11.%’;
注意: replication slave 为mysql 同步的必须权限,此处不要授权all容易被黑客攻击。
#4 进行导库操作(对数据库锁表只读) 当前窗口不要关闭
注意:生产环境时,操作主从复制,需要申请停机时间。数据量很大锁表会影响业务。
flush table with read lock;
提示: 这个锁表命令的时间,在不同的引擎的情况,会受下面参数控制,锁表时,如果超过设置时间不操作会自动解锁。
受二参数限制:interactive_timeout = 60 wait_timeout = 60
默认情况下时长: show variables like ‘%timeout%‘;
#5 查询bin-log日志在哪里 查询主库状态
show master status;
查询主库状态,即当前binlog日志文件名和二进制binlog日志偏移量。
表示我现在主库往bin-log里写数据写到了 000001这个文件的342位置点
#6 备份所有库 即导出数据库所有数据
mysqldump -u root -p123456 --events --compact --default-character-set=utf8 -A -B -F |gzip > mysql_all_$(date +%F).sql.gz
#7 解锁
unlock table
++++++++++++++++++++++++ 在slave上处理 ++++++++++++++++
#1 配置文件中设置server-id 并关闭bin-log参数配置
server-id=2
#log-bin=/var/lib/mysql/mysql-bin
#2 重启
/etc/init.d/mysqld restart
#3 将主库的数据库拉取到本地导进数据库
scp root@192.168.11.16:/home/yeqing/mysql_all_2017-01-18.sql.gz .
gzip -d mysql_all_2017-01-18.sql.gz
注意: 有外键的表不好导,mysql等系统表不要导
#4 配置同步参数(根据show master status设置)
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘192.168.11.16‘,
-> MASTER_PORT=3306,
-> MASTER_USER=‘rep‘,
-> MASTER_PASSWORD=‘123456‘,
-> MASTER_LOG_FILE=‘mysql-bin.000001‘,
-> MASTER_LOG_POS=342;
Query OK, 0 rows affected (0.11 sec)
#5 检查是否有master.info
cat /var/lib/mysql/master.info
#6 执行同步开关啦
slave start;
#7 检查是否已经同步
show slave status\G;
io和sql进程要yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
延迟要为0
Seconds_Behind_Master:0
#8 如果遇到IO进程和sql进程有不是YES,进行如下处理:
方案1:
1. 在master上
清除bin-log: reset master;
重新查看位置点:show master status;
2. 在slave上
关闭同步:slave stop
清除bin-log: rester
对照master位置点重新进行配置同步参数
重新开启同步: slave start;
再次查看是否同步: show slave status\G;
方案二:
差异小的情况下直接通过navicat的数据对比功能 找出来 给从库补上
关闭同步:slave stop
清除bin-log: rester
重新开启同步: slave start;
方案三:
差异大的情况下,直接重新做主从同步。
#9 测试同步
在master上:
create table test_2(id int);
mysqlbinlog mysql-bin.*|egrep -v ‘#|*!‘
在slave上:
show tables;
本文出自 “开发与运维” 博客,谢绝转载!
玩转mysql主从