Fixing yum incomplete transactions
I just found an issue with a server that wouldn't let me install any additional
software with yum because it complained of an incomplete transaction. Plus
checking the list of installed RPMs with rpm -qa
showed that many of them
where duplicated (old and new versions at the same time).
I used the following commands to get out that mess, and worked beautifully :
package-cleanup --dupes | grep -v Loaded | grep x86_64 | awk 'NR % 2 == 0' | xargs -n1 rpm -e --nodeps --justdb --noscripts package-cleanup --dupes | grep -v Loaded | grep i686 | awk 'NR % 2 == 0' | xargs -n1 rpm -e --nodeps --justdb --noscripts package-cleanup --dupes | grep -v Loaded | grep noarch | awk 'NR % 2 == 0' | xargs -n1 rpm -e --nodeps --justdb --noscripts yum update yum-complete-transaction yum -y reinstall kernel
The first command is the meaty part; get a list of duplicate RPMs and, with the awk command get one out of two lines. Then pipe that list to rpm so we can mark the RPM as removed without running their removal scripts, or actually removing the files from disk !
After that, running yum update
will take care of ensuring we didn't remove
any dependency and finally yum-complete-transaction
will replay the last
failed command.
The last command is optional but apparently is a common problem to end up with a borked kernel and/or initrd, so reinstalling it for good measure.
As a sample of what yum
and yum-complete-transaction
where complaining about,
here's a small excerpt of what was going on at the time of the issue:
--> Restarting Dependency Resolution with new changes. --> Running transaction check --> Finished Dependency Resolution Error: Trying to remove "systemd", which is protected Error: Trying to remove "yum", which is protected You could try using --skip-broken to work around the problem ** Found 43 pre-existing rpmdb problem(s), 'yum check' output follows: audit-libs-2.7.6-3.el7.i686 is a duplicate with audit-libs-2.6.5-3.el7.x86_64 32:bind-license-9.9.4-50.el7.noarch is a duplicate with 32:bind-license-9.9.4-37.el7.noarch 7:device-mapper-1.02.140-8.el7.x86_64 is a duplicate with 7:device-mapper-1.02.135-1.el7.x86_64 7:device-mapper-libs-1.02.140-8.el7.x86_64 is a duplicate with 7:device-mapper-libs-1.02.135-1.el7.x86_64 dracut-033-502.el7.x86_64 is a duplicate with dracut-033-463.el7.x86_64 e2fsprogs-libs-1.42.9-10.el7.x86_64 is a duplicate with e2fsprogs-libs-1.42.9-9.el7.x86_64 fipscheck-lib-1.4.1-6.el7.x86_64 is a duplicate with fipscheck-lib-1.4.1-5.el7.x86_64 glib2-2.50.3-3.el7.x86_64 is a duplicate with glib2-2.46.2-4.el7.x86_64 glibc-2.17-196.el7.i686 is a duplicate with glibc-2.17-157.el7.x86_64 glibc-common-2.17-196.el7.x86_64 is a duplicate with glibc-common-2.17-157.el7.x86_64 gobject-introspection-1.50.0-1.el7.x86_64 is a duplicate with gobject-introspection-1.42.0-1.el7.x86_64 kbd-misc-1.15.5-13.el7.noarch is a duplicate with kbd-misc-1.15.5-12.el7.noarch kernel-tools-libs-3.10.0-693.el7.x86_64 is a duplicate with kernel-tools-libs-3.10.0-514.el7.x86_64 krb5-libs-1.15.1-8.el7.x86_64 is a duplicate with krb5-libs-1.14.1-26.el7.x86_64 libblkid-2.23.2-43.el7.x86_64 is a duplicate with libblkid-2.23.2-33.el7.x86_64 libcap-2.22-9.el7.i686 is a duplicate with libcap-2.22-8.el7.x86_64 libcom_err-1.42.9-10.el7.x86_64 is a duplicate with libcom_err-1.42.9-9.el7.x86_64 libcurl-7.29.0-42.el7.x86_64 is a duplicate with libcurl-7.29.0-35.el7.x86_64 libdb-5.3.21-20.el7.i686 is a duplicate with libdb-5.3.21-19.el7.x86_64 libgcc-4.8.5-16.el7.i686 is a duplicate with libgcc-4.8.5-11.el7.x86_64
Happy hacking!