【发布时间】:2016-03-28 08:28:40
【问题描述】:
概要:转储/恢复后无法再从 Web 应用程序连接到 MariaDB。这似乎是 MariaDB 中处理 PHP mysql() 和 mysqli() 接口的方式有些不同。
MacOS X 10.6.8 (Snow Leopard) 上的 MariaDB 10.1.8,带有 PHP 5.3.8 和 Apache 2.2.24。
由于磁盘驱动器故障,我遇到了“数据库腐烂”的情况,一些 InnoDB 表变得无法访问,最终导致服务器崩溃。我按照服务器错误日志条目所指向的网页中的说明进行操作,并且能够让它以只读方式运行,使用“mysqld --innodb_force_recovery=2”。(1 级仍然崩溃,我不敢尝试 3 级。)
在“force_recovery”模式下,我对所有数据库(11 GB)进行了逻辑(SQL 代码)转储,重命名了故障数据目录,并运行“scripts/mysql_install_db.sh”来初始化一个空数据目录。然后我加载了逻辑备份,只有小问题。
现在变得令人费解了。我可以很好地访问数据库,使用各种工具,包括 mysql CLI、phpMyAdmin、Sequel Pro、Valentia 等。
但我无法通过我托管的任何网站进入数据库,包括几个版本的 MediaWiki 和几个本土图像库的实例。使用通过 mysql CLI 工作的登录凭据在 mysql_connect() 中失败。但是 phpMyAdmin 可以工作,使用相同的登录凭据!
所以我爬取了 phpMyAdmirn 代码,发现它使用的是 mysqli(),而损坏的网络应用程序似乎使用的是 mysql()。 phpMyAdmin 有一个配置变量来控制它;我将它从“mysqli”更改为“mysql”,它坏了。把它改回“mysqli”,它又可以工作了。
我没有更改任何 PHP 代码。我没有更改任何 apache 设置。我没有更改/etc/my.cnf。我没有更改/etc/php.ini。我没有更改任何登录凭据。唯一改变的是所有数据库的转储、重新初始化和还原。
我在想也许是一些神奇的 MySQL 系统变量设置没有通过转储/恢复周期。
我做了 phpinfo(),这表明 mysqli() 正在使用正确的套接字:/tmp/mysql.sock,但是 mysql() 正在使用 /var/mysql/mysql.sock,它在 /etc/ 中没有启用php.ini。 /var/mysql 中有一个指向 /tmp/mysql.sock 的符号链接,这让我觉得我以前一直走这条路……我试着让它成为一个硬链接;仍然没有快乐。
我运行了“php -info”,实际上,编译的套接字是/var/mysql/mysql.sock。所以我把“socket=/var/mysql/mysql.sock”放在/etc/my.cnf中,删除/var/mysql中的符号链接,重启mysql和apache。套接字在 /var/mysql 中。现在,使用 mysqli() 的 web 应用程序不再运行,但使用 mysql() 的 web 应用程序也不再运行!
所以我很困惑。特别是因为在我对 mysql 数据目录进行转储/初始化/恢复之前一切正常。
提前感谢您提供的任何建议!
(是的,我知道 mysql() 已被弃用,但我确实将“PHP 5.3.8”放在前面。感谢所有没有回答问题的人指出不应使用已弃用的代码新的开发。现在,如果你这么聪明,让我们试着回答这个问题吧!我有遗留代码要维护!)
【问题讨论】:
-
警告 这个扩展在 PHP 5.5.0 中被弃用,在 PHP 7.0.0 中被移除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此功能的替代方案包括:
-
脚本会显示哪些错误(如果有)?如果没有,是否设置
error_reporting显示所有错误? -
我的猜测是:它与MySQL服务器使用的密码方案有关。见dev.mysql.com/doc/refman/5.5/en/old-client.html