phpMyAdmin复制错误:./ library / dbi / DBIMysqli.class.php#298

时间:2017-03-19 16:57:50

标签: mysql phpmyadmin replication mariadb

只需在运行ubuntu 16.04的mysql 5.7 master和运行在Asustor NAS AS204-TE上的MariaDB 10.0.28 slave之间设置二进制日志复制。

经过几次尝试后,复制工作没有问题,但是我唯一担心的是当我从主页面点击“复制”视图时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)实例正在从带有所需参数的slave启动,并通过master上的命令行进入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)

我不清楚我的下一步应该是什么来进一步调试这个,所以会欣赏任何指针?

1 个答案:

答案 0 :(得分:1)

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

这不是phpMyAdmin的错误,而是错误是由PHP中的mysqli扩展生成的,可以使用下面的代码重现(代码片段归功于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对应{ {3}}因此,从slave到guest的返回值是不完整的,这与错误消息的说法有些一致。我提交PHP的错误有望澄清mysqli扩展是否应该更好地容忍这些细微差别。由于开发人员记录了我的复制用例,我认为应该这样做。

无论如何在某种程度上证明我的理论我创建了一个测试容器,部署了ubuntu灯包和phpmyadmin并重新创建了场景,但是使用mysql进行主和从。当server_uuid实现'SHOW SLAVE HOSTS;'时命令返回所有4个值,上面的测试脚本和phpMyAdmin都不再发牢骚。

复制当然有效,所以这更令我感到烦恼。