Если упала база RPM — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(6 способ)
(6 способ. Добавлен комментарий)
 
(не показано 6 промежуточных версий 2 участников)
Строка 69: Строка 69:
  
 
== 6 способ ==
 
== 6 способ ==
Когда полный финиш
+
'''Этот способ не работает. urpmi не переваривает список пакетов из файла rpmpkgs.'''<br />
идём в /var/log и ищем последний здоровый rpmpkgs, скопировать в удобное место, скопировать на всякий случай всё из папки /var/lib/rpm
+
'''Ему нужен список без версий и архитектуры'''
  
 +
<!--
 +
Вероятно список пакетов можно создать самостоятельно командой rpm -qa --queryformat '%{name}\n' >/tmp/pkgs.txt,
 +
но я не знаю откуда rpm берет информацию. Может статься, что в созданный список из-за сломанной базы попадут
 +
не все пакеты, что присутствуют в rpmpkgs. Нужно сравнить списки rpmpkgs и pkgs.txt, но сделать
 +
этого не могу т.к. в данный момент не имею упавшей базы.
 +
Или, если кто-то знает иной выход из сложившейся ситуации, просьба внести соответствующие изменения.
 +
-->
 +
 +
Когда полный финиш копируем из /var/log последний здоровый rpmpkgs в удобное место.<br />
 +
Например, в ваш домашний каталог
 +
cp /var/log/rpmpkgs /home/username
 +
 +
На всякий случай копируем всё из папки /var/lib/rpm
 
  cp /var/lib/rpm/ /var/lib/rpm-stored
 
  cp /var/lib/rpm/ /var/lib/rpm-stored
  
и удалить из /var/lib/rpm Packages __db и логи из папки ./log
+
Удаляем файлы __db, Packages из /var/lib/rpm и логи из папки ./log
теперь вспомним, где rpmpkgs и скачаем все пакеты, т.к. в них находятся заголовки и прочая инфа для базы
+
rm -f /var/lib/rpm/__db*
 +
rm -f /var/lib/rpm/Packages
 +
rm -f /var/lib/rpm/log/log*
 +
 
 +
Теперь заново создадим базу
 +
rpm -vv --rebuilddb
 +
 
 +
Проверим, что работает
 +
urpmi wget,urpmi
 +
 
 +
Теперь вспомним, где rpmpkgs и скачаем все пакеты, т.к. в них находятся заголовки и прочая инфа для базы
  
  cat rpmpkgs | xargs urpmi --no-install --nodeps
+
  cat /home/username/rpmpkgs | xargs urpmi --no-install
последнее что остаётся, собственно всё поставить, но без установки  
+
Последнее что остаётся, собственно всё поставить, но без установки  
  cat rpmpkgs | xargs urpmi --justdb
+
  cat /home/username/rpmpkgs | xargs urpmi --justdb
 
или
 
или
  cat rpmpkgs | xargs rpm -i -v --nodeps --noscripts --notriggers --excludepath /
+
  cat /home/username/rpmpkgs | xargs rpm -i -v --nodeps --noscripts --notriggers --justdb --excludepath /
  
  

Текущая версия на 16:49, 26 августа 2020

Иногда, в силу каких-то магических причин база RPM падает. Ничего не установить, не обновиться, не удалить. Обычно признаки падения базы RPM примерно такие:

rpmdb: BDB0113 Thread/process 31581/140478801409856 failed: BDB1507
Thread died in Berkeley DB library
error: db_init:db3.c:1098: dbenv->failchk(-30973): BDB0087
DB_RUNRECOVERY: Fatal error, run database recovery
Re-opening dbenv with DB_RECOVER ...
BDB2526 Finding last valid log LSN: file: 25 offset 4260
recovery 13% completeBDB1514 Recovery starting from [25][28]
recovery 80% completeBDB1518 Recovery complete at Sun Feb  2 17:30:34 2014
BDB1519 Maximum transaction ID 8000830c recovery checkpoint [25][4260]
.
recovery succeeded.
rpmdb: BDB2506 file /var/lib/rpm/Packages has LSN 25/7320425, past end
of log at 25/4352
rpmdb: BDB2507 Commonly caused by moving a database from one database
environment
rpmdb: BDB2508 to another without clearing the database LSNs, or by
removing all of
rpmdb: BDB2509 the log files from a database environment
rpmdb: BDB0641 __db_meta_setup: /var/lib/rpm/Packages: unexpected file
type or format
error: cannot open Packages(0) index: Недопустимый аргумент(22)
        DB: Berkeley DB 5.2.42: (February 29, 2012)
error: не могу открыть базу данных Packages в
не удаётся открыть базу данных RPM

Если это ваш случай, тогда есть несколько вариантов восстановления:

1 способ

Удаляем __db.*

rm -f /var/lib/rpm/__db.*

Запускаем rpmdbchk:

/usr/lib/rpm/bin/rpmdbchk

Если не поможет, то:

2 способ

С помощью db52_recover

db52_recover -vh /var/lib/rpm

Если не поможет, что:

3 способ

С помощью perl

perl -MURPM -e 'URPM::DB::convert("/", "btree", 1, 1)'

4 способ

Если совсем ничего не помогло

rm -f /var/lib/rpm/__db*
rpm -vv --rebuilddb

5 способ

Можно попробовать откатить транзакции, если база их выдаёт

urpmi.recover --list-safe 

(найти стабильное состояние и откатить на нужное количество транзакций, обозначенных датами)

urpmi.recover --transactions --rollback 3


6 способ

Этот способ не работает. urpmi не переваривает список пакетов из файла rpmpkgs.
Ему нужен список без версий и архитектуры


Когда полный финиш копируем из /var/log последний здоровый rpmpkgs в удобное место.
Например, в ваш домашний каталог

cp /var/log/rpmpkgs /home/username

На всякий случай копируем всё из папки /var/lib/rpm

cp /var/lib/rpm/ /var/lib/rpm-stored

Удаляем файлы __db, Packages из /var/lib/rpm и логи из папки ./log

rm -f /var/lib/rpm/__db*
rm -f /var/lib/rpm/Packages
rm -f /var/lib/rpm/log/log*

Теперь заново создадим базу

rpm -vv --rebuilddb

Проверим, что работает

urpmi wget,urpmi

Теперь вспомним, где rpmpkgs и скачаем все пакеты, т.к. в них находятся заголовки и прочая инфа для базы

cat /home/username/rpmpkgs | xargs urpmi --no-install

Последнее что остаётся, собственно всё поставить, но без установки

cat /home/username/rpmpkgs | xargs urpmi --justdb

или

cat /home/username/rpmpkgs | xargs rpm -i -v --nodeps --noscripts --notriggers --justdb --excludepath /