MySQL从属I / O线程未运行

时间:2009-11-12 17:59:56

标签: mysql replication slave

我已经为MySQL服务器设置了复制。我可以使用复制用户/密码从从机连接到主服务器。我已经运行了从属SQL线程,但是当使用“show slave status”检查时,从属I/O线程未运行且从属I / O状态为空。可能是什么问题?

我该如何解决这个问题?重启奴隶没有帮助。

这是我的坏处:我没有给*.*提供“复制奴隶”权限,而是仅仅为my_db.*提供了这一权限。

3 个答案:

答案 0 :(得分:4)

  

而不是给'复制   奴隶的特权,我只是   给它my_db。*。

复制slave只是一个全局权限(即仅限每个用户),这意味着一个命令,如

GRANT REPLICATION SLAVE on mydb.* TO 'someuser'@'%';

无效,因为您无法为每个数据库/列/表授予它。

您需要运行的命令是:

GRANT REPLICATION SLAVE on *.* TO 'someuser'@'%';

然后执行START SLAVE。您可能还会发现查看mysql错误日志很有用。

我建议您好好阅读replication setup documentation,因为它会详细解释所有这些内容。

答案 1 :(得分:2)

我遇到了同样的问题,并使用以下步骤进行了修复。完整的主题链接是http://www.percona.com/forums/questions-discussions/percona-xtrabackup/11842-backup-stopped-working-slave-sql-running-no

除了他的第2步之外,步骤与@ Luxknight007提到的相同。但是这个帖子包含更多细节,这非常有用。以下是我使用过的解决方案。

“第一个问题是您更改了复制位置而不是修复错误,并使用了不正确的binlog文件名格式(您可能只使用了您猜到的那个帖子中的那个)。要回到在你开始的地方,你需要找到binlog文件和slave sql_thread停止的位置。根据你的slave状态输出,看起来slave正在读取一个新的binlog文件(你可以看到Read_Master_Log_Pos值小于Exec_Master_Log_Pos值,这意味着它必须读取比从sql_thread停止时更新的binlog文件,因此你需要找到slave sql_thread实际上失败的binlog文件。所以在错误日志中查找类似于下面:

代码:

2013-10-08 12:48:51 37545 [ERROR] Slave SQL: Error 'Table 'testdb.test2' doesn't exist' on query. Default database: 'testdb'. Query: 'insert into test1 select * from test2', Error_code: 1146
2013-10-08 12:48:51 37545 [Warning] Slave: Table 'testdb.test2' doesn't exist Error_code: 1146
2013-10-08 12:48:51 37545 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000001' position 3427

这是我重新创建的示例,因此您的示例会有所不同。请注意,ERROR与您在从属状态下看到的类似。因此,在错误日志文件中找到您的特定错误消息,然后找到结束部分,其中给出了文件名和位置(在我的示例中,“我们停在日志'mysql-bin.000001'位置3427”)。根据您的show slave状态,该位置应为315098143,因为从属sql_thread停止执行事件(Exec_Master_Log_Pos)但io_thread继续读取新的(Read_Master_Log_Pos)。

找到正确的binlog文件名和位置后,使用错误日志中的信息在您的从站上重新运行change master语句。请注意,您的文件名应该类似于“newcrmdb1-bin.XXXXXX”,而不是mysql-bin.XXXXXX(您可以在上面看到此显示从属状态的命名约定。)

代码:

mysql> change master to MASTER_LOG_FILE='newcrmdb1-bin.XXXXXX', Master_Log_Pos=315098143;

change master to MASTER_LOG_FILE='mysql-bin.000082' , Master_Log_Pos=47914844;

一旦你指向奴隶sql_thread失败的原始复制位置,你需要修复它抱怨开始的错误。

初始复制错误似乎告诉您从属服务器上不存在表asteriskcdrbpleadcf,因此当尝试从该表中选择数据时,insert语句失败。所以问题是你的奴隶似乎已经与你的主人不同步了。如果主服务器上的表是静态的或者大部分是静态的,您可以通过使用mysqldump从主服务器上的该表导出数据并将其加载到从服务器来解决此问题。如果那是不可能的,或者你不关心那些数据,你总是可以跳过带有sql_slave_skip_counter的复制语句,但是奴隶将与主服务器进一步不同步。

如果所有其他方法都失败了,你也可以随时从主人那里重建奴隶。 =)“

答案 2 :(得分:1)

我遇到了同样的问题,我尝试了这个步骤

首先在my.cnf或my.ini slave-skip-errors=1046下面的[mysqld]下面添加此代码 这将跳过所有重复的条目,因为我们将执行复制停止的整个二进制日志文件,您可以在成功复制后注释此代码。

1.STOP SLAVE;

2.重置奴隶;

3.CHANGE MASTER TO MASTER_LOG_FILE ='mysql-bin.000049';

Note: MASTER_LOG_FILE must be the last file where it stop from replicating

4.CHANGE MASTER TO MASTER_LOG_POS = 98;

5.START SLAVE;

检查您是否成功