我正在尝试安装此处提供的 mysql 补丁...
http://bugs.mysql.com/bug.php?id=64248
I have the mysql version 5.5.20
但我不知道如何复制代码。我使用的是 centOS。我尝试在 Google 上搜索,但没有找到任何教程来解释如何修补 mysql 代码。
更新:
我尝试下载该文件并将代码添加到当前 mysql 代码库中,如下所示:
# wget http://bugs.mysql.com/file.php?id=17978
# patch --dry-run < myp.patch
patch: **** Only garbage was found in the patch input.
我收到了上面提到的错误。
更新 1:
当我添加原始文件的路径时,出现以下错误:
# patch --dry-run /usr/sbin/mysqldump < /root/download/myp.patch
patching file /usr/sbin/mysqldump
Hunk #1 FAILED at 99.
Hunk #4 FAILED at 2348.
Hunk #7 FAILED at 3209.
3 out of 11 hunks FAILED -- saving rejects to file /usr/sbin/mysqldump.rej
答案1
正如 jkj 在上面的评论中所说,问题在于你似乎试图修补二进制文件。我很抱歉只是重复了他/她的评论,但我认为如果它是正确的,那么仅仅点赞还不够,因为你做的事永远不会成功。
补丁的作用不是这样的。补丁是应用于现有文本的文本更改,在本例中是来源对于 mysqldump,以便二进制文件可以作为正常构建的一部分进行重建。
你没有说明你是如何获得你正在运行的 mysql 版本的,但假设它是从软件包而不是源代码获得的 - 这在 CentOS 上很常见 - 你有很多工作要做。首先,你需要从源代码构建 mysql,并替换现有的软件包版本(或者,为了更省事,构建它以安装在自定义目录中)。然后,你必须验证新构建的 mysql 是否按预期运行。然后,你必须修补源代码,并重建二进制文件。
上述验证步骤的原因在于 Red Hat 的修补策略,即他们通常会包含针对其提供的某个版本的修复,并且实际上他们会从更高版本中反向移植有用的修复,而不会改变版本号。其推论是,您无法确定 RH 的 mysql 5.5.20 是否任何事物比如MySQL 5.5.20。
实际上,您最好从 redhat 获取 mysql SRPM(源的 RPM),安装它,然后目测看看您想要的补丁是否已经包含在内。即使没有,SRPM 也会为您提供更接近正确源的近似值,以重现您安装的二进制文件。缺点是,如果 RH 已经做出任何其他对 mysqldump.c 的更改,补丁将不再干净地应用,并且您需要对代码有一些了解才能让它这样做,而不会造成太大的破坏。
如果您知道这些,我很抱歉说出这些。如果您不知道,我认为最好非常清楚并提前说明,如果您决定开始构建自己的二进制文件,您将面临多大的痛苦。
答案2
patch 命令在标准输入上执行补丁。我建议首先使用“--dry-run”运行补丁,以确保补丁在实际修改文件之前能够干净地应用:
patch --dry-run < /path/to/patch
这应该会提示您尝试修补哪个文件。如果补丁干净地应用,您可以删除 --dry-run 以实际应用补丁。如果补丁没有干净地应用,则意味着补丁是为与您正在修补的软件版本不同的版本生成的。