我正在尝试将 php 升级到最新版本 (5.5),我当前的 php 版本是 5.3.6,与 ubuntu 12.04 LTS 捆绑在一起。问题是我不想升级任何其他东西,只升级 php,但尽管我明确告诉 apt-get 我正在尝试升级的软件包,但坚持删除 mysql 5.1 并安装 mysql 5.5,这是我正在使用的命令:
sudo apt-get --only-upgrade install php5-common
我也试过
sudo apt-get upgrade php5-common
我得到的答复是这样的:
The following extra packages will be installed:
libalgorithm-diff-xs-perl libapache2-mod-php5 libdbd-mysql-perl libdbi-perl liblocale-gettext-perl libmysqlclient18 libsub-name-perl libterm-readkey-perl libtext-charwidth-perl libtext-iconv-perl mysql-client-5.5
mysql-client-core-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 perl perl-base perl-modules php5-cli php5-curl php5-gd php5-mysql php5-pgsql
Suggested packages:
tinyca mailx perl-doc libterm-readline-gnu-perl libterm-readline-perl-perl php5-suhosin
The following packages will be REMOVED:
mysql-client-5.1 mysql-client-core-5.1 mysql-server-5.1 mysql-server-core-5.1
The following NEW packages will be installed:
libmysqlclient18 libterm-readkey-perl mysql-client-5.5 mysql-client-core-5.5 mysql-server-5.5 mysql-server-core-5.5
The following packages will be upgraded:
libalgorithm-diff-xs-perl libapache2-mod-php5 libdbd-mysql-perl libdbi-perl liblocale-gettext-perl libsub-name-perl libtext-charwidth-perl libtext-iconv-perl mysql-common mysql-server perl perl-base perl-modules php5-cli php5-common
php5-curl php5-gd php5-mysql php5-pgsql
为什么会发生这种情况?php 是否依赖于 mysql,这完全是疯了。如果我说是,apt-get 是否会在删除它时删除我当前的 mysql 数据?由于这是一个正在运行的实例,我不能冒丢失任何数据的风险(我可能会进行备份,但这意味着将网站置于维护状态数小时,我不喜欢)
答案1
问题是 php5-mysql 包依赖于 libmysqlclient18,而后者又依赖于 mysql-common:
# apt-cache depends php5-mysql
php5-mysql
Depends: libc6
Depends: libmysqlclient18
....
# apt-cache depends libmysqlclient18
libmysqlclient18
Depends: mysql-common
Depends: libc6
Depends: zlib1g
PreDepends: multiarch-support
multiarch-support:i386
Replaces: libmysqlclient18:i386
Breaks: libmysqlclient18:i386
MySQL 5.1 是 10.04 中的默认版本,而 12.04 中的默认 MySQL 版本是 5.5,这就是为什么所有这些包都间接依赖于它。
如果您确实不想升级 MySQL,您应该找到与 MySQL 5.1 链接的 php 包 - 为 10.04 构建的包 - 或者您应该启动 10.04 VM 并构建您自己的包(通过重建官方的)。
另一方面,MySQL 升级不应该删除您的数据。只有“清除”才会删除数据。
但是,为了安全起见,您可以这样做:
# /etc/init.d/mysql stop
# mv /var/lib/mysql /var/lib/mysql_orig
然后执行升级。这将安装新的 mysql 服务器并创建带有空数据库的新 /var/lib/mysql。它不会触及您的数据,因为 /var/lib/mysql_orig 在任何 mysql-* 包定义中都没有提及。升级后,执行:
# mv /var/lib/mysql /var/lib/mysql_new_55
# mv /var/lib/mysql_orig /var/lib/mysql
# chown mysql: /var/lib/mysql
# chmod 0700 /var/lib/mysql
# /etc/init.d/mysql start
如果您有足够的磁盘空间和时间,请用 cp -ar 替换 mv,这样您就有一份 MySQL 数据的副本,以防升级出现问题。备份始终是一个不错的选择。
在此之后,您还需要运行 mysql_upgrade 脚本将 mysql.* 表升级到 5.5 格式。
另外,检查配置中的所有差异 - 一些 my.cnf 设置已重命名,并且一些默认值已更改。
答案2
除了 PHP 之外,您还将使用以下模块:php5-mysql。这需要 php common 5.5,这会强制服务器更新。尝试安装 php5-mysqlnd 而不是 php5-mysql。