MySQL主从全量同步

一、全量同步

由于一些原因导致从库与主库的数据不同步,可以重新全量同步主从的数据

1.锁表并把内存中的数据保存到binlog中

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

2.导出数据

bin/mysqldump  --single-transaction --master-data=2 -uroot -p123456  --all-databases > dbdump_20190128.sql

3.从库恢复数据

停止slave

stop slave;

source /root/dbdump_20190128.sql

4主从同步

(a)同步数据

change master to master_user='root',\
master_password='123456',\
master_host='172.23.6.96',\
master_log_file='mysql-bin.000002',\
master_log_pos=2254981;

(b)启动slave

start slave;

(c)master机器解锁表

 UNLOCK TABLES;

说明:

master_log_file为mysql-bin.000002
master_log_pos为2450399
start  slave;

mysqldump参数说明:
mysqldump:mysql导出工具
--socket、-u、-p、-h:指定mysql的sock文件、用户名、密码、主机地址
--single-transaction:保证一个事务中所有相同的查询读取到同样的数据,其他innodb引擎的线程修改了表的数据并提交,对该dump线程的数据并无影响,不会锁表
--master-data=2:对于生成的sql文件产生备份时刻的mysql-bion的信息和pos信息
--all-databases:备份全库  

方法2:使用直接拷贝方式(速度快)

1.锁表,查看master信息
   FLUSH TABLES WITH READ LOCK;
   SHOW MASTER STATUS;
2.停止slave
   stop slave;
3.备份data目录
   cp -r data/ data_bak
4.清空数据库文件夹或mv到其他目录
   mv 库名 ../databases/
   ......
5.直接复制主库到slave机器
   scp 库名 ip:/home/hadoop/mysql/data
   ......
6.重新同步数据
change master to master_user='root',\
master_password='123456',\
master_host='172.23.6.96',\
master_log_file='mysql-bin.000002',\
master_log_pos=2254981;

7.启动slave并查看状态

start slave;

show slave status \G;

二、slave同步错误恢复

主从同步时slave出现语句错误导致同步停止

从库缺少deviceuser表导致同步时 执行错误
解决方法:对主从数据要求不高,可以允许少量数据不同步的情况下可以使用一下方法
步骤:
1.flush tables enterpriseuser.deviceuser for export;
2.master机器执行mysqldump命令导出该表的数据
3.slave机器创建该表,并导入master导出的数据
4.执行set global sql_slave_skip_counter =1; 跳过错误语句

说明:该值1需要根据需要修改成相应的数值
修改参考方法:
通过show slave status \G;查看错误代码 Last_Errno=1812
在mysql.err中搜索改代码的个数,搜索范围在该错误发生的时间段范围内
5.执行start slave; 启动slave
6.执行show  slave status \G;查看状态


MySQL主从全量同步
https://www.hechunyu.com/archives/mysqlzhu-cong-quan-liang-tong-bu
作者
chunyu
发布于
2021年03月30日
许可协议