问题说明:做了Mysql的主从,还没做主从分离,导致同事在mysql从服务器执行了写入操作,引起不同步(show slave status\G;Slave_SQL_Running: No)
解决方法:
1,
1
2
3
4
|
Mysql > slave stop;
Mysql >
set
global sql_slave_skip_counter =1 ;
Mysql > slave start;
Mysql > show slave status\G
|
因为插入的数据不止是1条,操作太慢且麻烦
2,
在主查询show master status\G,再从这个点执行
change master to master_host='master_ip', master_user='user', master_password='pwd', master_port=3306, master_log_file='mysql-bin.00000*', master_log_pos=000000***;
数据会丢的更多。
因此,还是选择第一种方法,不过set global sql_slave_skip_counter=500 把这个数值调大,一次跳过去500条,一直循环那4条语句,直到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
造成结果:这样操作的结果是丢失一些数据,不过少点,另外其中某一个表不同步了(因为有跳过从本来应该执行的语句),接下来解决这个问题,选择数据库插入频率很小的时候做,最好这时候不要有数据写入,以免影响生产环境(下面只是举例子说明解决步骤)
3,
用Navicat for MySQL登录主库,下面操作都是在主库进行
1,在主库查询“SELECT COUNT(*) FROM date.table;”知道现在这个表有多少行,作为最后验证,选择“复制表”,复制后的表名称为 table_name_copy,复制的表数据也不会同步的
2,把复制的表导出,选择“转储SQL文件----结构和数据”,保存到硬盘上面
3,删除这个复制的表table_name_copy。在数据库右键选“运行SQL文件”,把刚才导出的数据再导入进去
现在的结果是刚导入的表table_name_copy主从肯定是同步的
4,关键的一步,继续查主库“SELECT COUNT(*) FROM date.table;” 看数据表有没有写入内容,如果没有写入,赶紧F2把table的名字改一下,3秒钟时间
table_name(数据对,没同步)改为table_name1
table_name_copy(趁着数据没写入table_name,已同步)改为table_name
再次“SELECT COUNT(*) FROM date.table;”查询,看有没有插入数据
5,总结,主从不同步会造成查询的数据不一致,做这个动作之前要和用这个表的人商量,保证不出现意外。主从做好了,要么做读写分离,要么控制权限,从只能查,没其他权限,这样才不会出问题