Потратил довольно много времени на
решение этой проблемы, поэтому запишу решение здесь, чтобы в следующий раз его
было проще найти.
Понадобилось мне перенести БД с одного сервера 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.
Восстановить БД, которую нужно было восстановить в самом начале.
Метод
железный, т.к. уничтожается вся информация о структуре ноды. Однако следует
быть внимательным, чтобы не пропустить резервное копирование какой-нибудь
базы.