只需在运行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)
我不清楚我的下一步应该是什么来进一步调试这个,所以会欣赏任何指针?
答案 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都不再发牢骚。
复制当然有效,所以这更令我感到烦恼。