вторник, 20 мая 2014 г.

DB2 - как бороться с ошибкой "База с алиасом ... уже существует" при восстановлении БД.

Потратил довольно много времени на решение этой проблемы, поэтому запишу решение здесь, чтобы в следующий раз его было проще найти.

Понадобилось мне перенести БД с одного сервера DB2 на другой.
Начало стандартное. Вводим команду резервного копирования базы в файл:
db2 backup database BaseName to C:\Backup
Получаем стандартный ответ:
 Резервное копирование завершилось успешно. Отметка времени копии : 
20140517122420 
Получаем архив с базой, который отправляем на конечный сервер DB2.
На конечном сервере вводим команду восстановления базы:
db2 restore database BaseName from C:\Backup taken at 20140517122420 TO D: INTO BaseName
Здесь TO D:  указывает, где физически располагается база. INTO BaseName - Имя, которое получит база в новом node.

И в этом моменте появилась непонятная ошибка:
База с алиасом BaseName уже существует
Номер ошибки не помню, записываю по памяти.
Смотрю список баз  командой db2 list db directory - базы BaseName в списке нет.
А вот если сделать  db2 list db directory on D: - база BaseName появляется в списке.
Видимо, после предыдущих экспериментов в записях осталась какая-то информация об этой базе.
По идее нужно сделать db2 drop db BaseName. 
Однако на эту команду получаю ответ:
Ошибка ввода\вывода
Дальнейшее гугление привело к файлу db2diag.log (который, кстати, находится не в папке с СУБД, а где-то в LocalSettings).
Это лог DB2, в который направляется всякая диагностическая информация.
В логе обнаружилось, что удаление базы невозможно, так как не удается получить доступ к файлам SQLOGCTL.LFH.1 и SQLOGCTL.LFH.2.
Гугление этой проблемы привело к следующему решению (не знаю, насколько оно хорошее, для меня важно, что оно действует):
1. Сделать резервные копии всех БД NODE'ы.
2. Очистить папку NODE0000 (вместо 0000 могут быть другие цифры)
3. Восстановить все БД NODE'ы.
4. Восстановить БД, которую нужно было восстановить в самом начале.

Метод железный, т.к. уничтожается вся информация о структуре ноды. Однако следует быть внимательным, чтобы не пропустить резервное копирование какой-нибудь базы.