【问题标题】:phpMyAdmin replication error: ./libraries/dbi/DBIMysqli.class.php#298phpMyAdmin 复制错误:./libraries/dbi/DBIMysqli.class.php#298
【发布时间】:2017-08-10 21:25:22
【问题描述】:

只需在运行 ubuntu 16.04 的 mysql 5.7 主服务器和运行在我的 Asustor NAS AS204-TE 上的 MariaDB 10.0.28 从服务器之间设置二进制日志复制。

经过几次尝试,复制工作正常,但我唯一担心的是当我从主页单击“复制”视图时 phpmyadmin 显示两条错误消息...

错误 1:

Warning in ./libraries/dbi/DBIMysqli.class.php#298
 mysqli_fetch_array(): Malformed server packet. Field length pointing 0 bytes after end of packet

Backtrace

./libraries/dbi/DBIMysqli.class.php#298: mysqli_fetch_array(
object,
integer 1,
)
./libraries/DatabaseInterface.class.php#2760: PMA_DBI_Mysqli->fetchAssoc(object)
./libraries/DatabaseInterface.class.php#2069: PMA_DatabaseInterface->fetchAssoc(object)
./libraries/replication_gui.lib.php#612: PMA_DatabaseInterface->fetchResult(
string 'SHOW SLAVE HOSTS',
NULL,
NULL,
)
./libraries/replication_gui.lib.php#56: PMA_getHtmlForReplicationSlavesTable(boolean true)
./server_replication.php#56: PMA_getHtmlForMasterReplication()

错误 2:

Warning in ./libraries/dbi/DBIMysqli.class.php#298
 mysqli_fetch_array(): Error while reading a row

Backtrace

./libraries/dbi/DBIMysqli.class.php#298: mysqli_fetch_array(
object,
integer 1,
)
./libraries/DatabaseInterface.class.php#2760: PMA_DBI_Mysqli->fetchAssoc(object)
./libraries/DatabaseInterface.class.php#2069: PMA_DatabaseInterface->fetchAssoc(object)
./libraries/replication_gui.lib.php#612: PMA_DatabaseInterface->fetchResult(
string 'SHOW SLAVE HOSTS',
NULL,
NULL,
)
./libraries/replication_gui.lib.php#56: PMA_getHtmlForReplicationSlavesTable(boolean true)
./server_replication.php#56: PMA_getHtmlForMasterReplication()

所以按照一些逻辑,错误消息似乎围绕着列出连接到主服务器的从服务器。因此,我在错误上单击“全部忽略”,然后单击“显示连接的从属服务器”链接,该链接只显示了一个提示,以确保在从属服务器上设置了“--report-host=xxx”。我已经确认 mysql (MariaDB) 实例正在使用所需参数在从属服务器上启动,并通过主服务器上的命令行进入 mysql 并发出 SHOW SLAVE HOSTS;给我以下输出...

mysql> show slave hosts;
+-----------+----------+------+-----------+------------+
| Server_id | Host     | Port | Master_id | Slave_UUID |
+-----------+----------+------+-----------+------------+
|         2 | blacknas | 3306 |         1 |            |
+-----------+----------+------+-----------+------------+
1 row in set (0.00 sec)

我不清楚下一步应该采取什么措施来进一步调试这个问题,所以希望得到任何指点?

【问题讨论】:

  • 所以我在任何地方都找不到与此相同问题的任何其他参考,我认为我可能需要将其升级为 github 上的问题,除非有人可以提供替代方案?
  • 提出了phpMyAdmin 的问题,该问题很快就结束了,结论是这是 PHP 到 mysql 的问题。现在用ubuntu提出了一个错误
  • 因此通过 ubuntu 的错误修复测试了最新的 php 7.0.17 包,但问题仍然存在。现在已经用 php 提出了bug

标签: mysql phpmyadmin replication mariadb


【解决方案1】:

好的,所以我自己回答这个问题,因为我觉得使用 PHP 提交错误需要一段时间。

这不是 phpMyAdmin 的错误,而是错误是由 PHP 中的 mysqli 扩展生成的,可以使用以下代码重现(代码 sn-p 归功于 nijel,他在 github 上提出了我的问题) ...

<?php
error_reporting(E_ALL);

$link = mysqli_connect("localhost", "my_user", "my_password");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SHOW SLAVE HOSTS";
$result = mysqli_query($link, $query);

/* get associative array */
while (($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) !== null) {
    print_r($row);
}

/* free result set */
mysqli_free_result($result);

/* close connection */
mysqli_close($link);
?>

我相信 mysqli 扩展抱怨的原因是因为发出的命令应该返回 4 个值,但在我的用例中它只返回 3。这是因为 MariaDB 从站没有实现 server_uuid 功能,而它的 MySQL 对应 @ 987654321@ 结果从从机到来宾的返回值不完整,这与错误消息所说的有些一致。我用 PHP 提交的错误有望澄清 mysqli 扩展是否应该更好地容忍这些细微差别。由于开发人员记录了我的复制用例,因此我认为应该这样做。

无论如何,为了在一定程度上证明我的理论,我创建了一个测试容器,部署了 ubuntu 灯包和 phpmyadmin,并重新创建了场景,但对主从使用 mysql。随着 server_uuid 的实施,'SHOW SLAVE HOSTS;'命令返回所有 4 个值,上面的测试脚本和 phpMyAdmin 都不再抱怨了。

复制肯定是有效的,所以我会忍受这种烦恼。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 2021-12-27
    • 2014-11-20
    • 2016-03-05
    • 2011-11-15
    • 2021-04-14
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多