只需在运行在ubuntu16.04上的MySQL5.7主服务器和运行在我的Asustor NAS204-TE上的MariaDB 10.0.28从服务器之间设置二进制日志复制。
经过几次尝试,复制工作正常,但我唯一担心的是,当我从主页单击' replication‘视图时,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()因此,遵循一点逻辑,错误消息似乎围绕着列出连接到主服务器的从服务器。因此,我在错误上单击'Ignore All‘,然后单击'Show connected slaves’链接,该链接只显示一个提示,以确保在从服务器上设置了"--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)我不清楚我的下一步应该是什么,以进一步调试这一点,所以我会感谢任何指示?
发布于 2017-03-29 05:56:46
好的,所以我自己回答这个问题,因为我得到的印象是,用PHP提交bug将需要一段时间。
这不是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从机does.因此从从机到来宾的返回值是不完整的,这在某种程度上与错误消息所说的一致。我向PHP提交的bug有望澄清mysqli扩展是否应该更好地容忍这些细微差别。因为我的复制用例是由开发人员记录的,所以我本以为应该这样做,但是。
无论如何,为了证明我的理论,我创建了一个测试容器,部署了ubuntu lamp包和phpmyadmin,并重新创建了场景,但在主机和从机上都使用了mysql。在实现server_uuid时,“SHOW SLAVE HOSTS;”命令将返回所有4个值,并且上面的测试脚本和phpMyAdmin都不再发出牢骚声。
复制肯定是有效的,所以这更是一个烦人的问题,我将继续忍受。
https://stackoverflow.com/questions/42889395
复制相似问题