4

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

我该如何解决这个问题?重新启动从站没有帮助。

这是我的错:我没有给予 '复制奴隶' 特权*.*,而只是给予my_db.*.

4

3 回答 3

5

我没有给 . 提供“复制奴隶”特权,而是只为 my_db.* 提供它。

复制从属只是一个全局权限(即仅针对每个用户),这意味着诸如

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

没有效果,因为您不能按数据库/列/表授予它。

您需要运行的命令是:

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

然后做一个START SLAVE. 您可能还会发现查看 mysql 错误日志很有用。

我建议好好阅读复制设置文档,因为它详细解释了所有这些。

于 2009-11-14T12:20:18.127 回答
2

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

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

1.停止奴隶;

2.复位从机;

3.将 MASTER 更改为 MASTER_LOG_FILE='mysql-bin.000049';

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

4.将 MASTER 更改为 MASTER_LOG_POS=98;

5.启动奴隶;

检查你是否成功

于 2013-07-30T09:53:48.093 回答
2

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

步骤与@Luxknight007 提到的步骤相同,除了他的第 2 步。但是此线程包含更多细节,非常有帮助。以下是我使用的解决方案并且它有效。

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

代码:

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

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

找到正确的二进制日志文件名和位置后,使用您在错误日志中找到的信息在您的从属设备上重新运行更改主语句。请注意,您的文件名应该类似于“newcrmdb1-bin.XXXXXX”,而不是 mysql-bin.XXXXXX(您可以在上面的 show slave status 中看到此命名约定)。

代码:

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 失败的原始复制位置,你需要修复它开始抱怨的错误。

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

如果一切都失败了,你也可以作为最后的手段从主服务器重建从服务器。=)"

于 2014-06-19T12:26:01.790 回答