Category Archive: DB2

SQL6031N Ошибка в файле db2nodes.cfg

Несколько раз сталкивался с подобной проблемой, когда при запуску DB2 выходило следующее сообщение:

SQL6031N Ошибка в файле db2nodes.cfg

SQL6031N

В моих случаях причина была в том, что у компьютера (сервера) менялось имя, а в файле db2nodes.cfg было старое название компьютера. Нужно либо вернуть компьютеру прежнее название, либо переписать название в файле db2nodes.cfg. Для это любым текстовым редактором откройте файл db2nodes.cfg, который по умолчанию расположен в папке:

C:\Program Files\IBM\SQLLIB\DB2\

Примерное содержимое этого файла:

0 microsof-0a0782 MICROSOF-0A0782 0

db2nodes cfg
Допустим, теперь имя компьютера TEST, внесем соответствующие изменения:

0 test TEST 0

Обратите внимание, что имя компьютера нужно заменить в двух местах, при чем в первом случае название в нижнем регистре, а во втором — в верхнем. Почему это так — не знаю)).
Все! После сохранения внесенных изменений можно запускать DB2.

Перенос файлов базы данных DB2 v8.1

Перед нами встала задача перенести базу данных DB2 v8.1 со старого компьютера на новый.

Сразу оговорюсь, существуют более простые и надежные способы переноса база данных DB2, чем описанный ниже способ. Но кому-то он может пригодиться. Например, в том случае, если от базы данных остались лишь файлы.

Данный способ описывает перенос базы путем копирования файлов базы данных.

1) Нужно установить на новом компьютере DB2 той же версии, что и на старом компьютере

2) Следующий шаг — копирование папок, в которых содержаться файлы базы данных DB2. Для начала просмотрим какие есть табличные пространства, выполним следующий запрос:

list tablespaces

Будет выведена информация о существующих табличных пространств: ID табличного пространства, название табличного пространства и другая информация.


ID табличного пространства = 0
Имя                        = SYSCATSPACE

ID табличного пространства = 1
Имя                        = TEMPSPACE1

ID табличного пространства = 2
Имя                        = USERSPACE1

ID табличного пространства = 3
Имя                        = USERSPACE2

ID табличного пространства = 4
Имя                        = SYSTOOLSPACE

т.е. в данном случае у нас 5 табличных пространств.

Остается определить расположение этих табличных пространств на жестком диске. Для каждого табличного пространства нужно выполнить запрос, указав в качестве параметра ID табличного пространства.

list tablespace containers FOR 0;
list tablespace containers FOR 1;
list tablespace containers FOR 2;
list tablespace containers FOR 3;
list tablespace containers FOR 4;

Будет выведен список контейнеров табличных пространств:


Контейнеры табличных пространств для табличного пространства 0
 Имя = C:\DB2\NODE0000\SQL00008\SQLT0000.0

Контейнеры табличных пространств для табличного пространства 1
 Имя  = C:\DB2\NODE0000\SQL00008\SQLT0001.0

Контейнеры табличных пространств для табличного пространства 2
Имя = C:\DB2\NODE0000\SQL00008\SQLT0002.0

Контейнеры табличных пространств для табличного пространства 3
Имя = C:\project\USER_DB_CONTAINER

Контейнеры табличных пространств для табличного пространства 4
Имя = C:\DB2\NODE0000\SQL00008\SYSTOOLSPACE

Обратите внимание, что кроме стандартного размещения файлов в папке C:\DB2, также используется контейнер C:\project\USER_DB_CONTAINER.
Из этого делается вывод: нужно перенести на новый компьютер папку C:\DB2 и папку C:\project.

3) Скопировав все необходимые папки на новый компьютер, открываем Центр управления DB2.
Находим элемент «Базы данных»:
развернуть список
В контекстном меню этого пункта выберите «Добавить…»
добавить
Откроется окно добавления базы данных:
выбрать бд
Для начала выберите диск, автоматически будут считаны доступные базы данных на этом диске. Выберите свою базу и нажмите «OK». Если у вас несколько баз, то проделайте операцию для каждой базы данных.
Добавленные базы появятся в списке:
список баз данных

4) В случае, если у вас имеются распределенные (федеративные, federated) базы данных, то нужно включить поддержку федеративных баз и настроить user mapping.
Поддержка федеративных баз включается командой:

UPDATE DBM CFG USING FEDERATED YES DEFERRED;

После этого нужно перегрузить DB2. Это можно сделать через значок в трее:
db2 in tray

У DB2 есть особенность: он берёт пользователей из операционной системы. После того, как мы заходим под своей учеткой на компьютер, база будет доступна и она не требует отдельного подключения к базе данных. Но не будут доступны псевдонимы, которые настроены на таблицы из федеративных баз данных.
При попытке обратиться к псевдониму выйдет следующая ошибка.

com.ibm.db.DataException: Ошибка менеджера баз данных. : [IBM][CLI Driver][DB2/NT] 
SQL1101N Не удалось получить доступ к удаленной базе данных  на узле "" 
при указанном ID авторизации и пароле. SQLSTATE=08004

Нужно настроить пользователя и пароль для доступа к федеративной базе, не смотря на то, что базы находятся на одном компьютере и в одном инстансе. Если быть точнее, то нужно настроить отображение пользователя на удаленного пользователя с пароле (user mapping).
Для начала просмотрим существующие отображения пользователей:

SELECT * FROM syscat.useroptions

user_mapping_table
Столбец AUTHID — имя пользователя из операционной системы.
Столбец SERVERNAME — имя федеративной базы
Столбец OPTION храним одну из опций: REMOTE_AUTHID или REMOTE_PASSWORD
Столбец SETTING — значение настройки: для REMOTE_AUTHID — удаленный пользователь, для REMOTE_PASSWORD — кэш от пароля удаленного пользователя.
В нашем случае данные пользователя операционной системы совпадают с данными удаленного пользователя.

Здесь возможно три случая:
a) Просто обновить пароль

ALTER USER MAPPING FOR DB2ADMIN SERVER COMMON OPTIONS 
(SET REMOTE_PASSWORD  'your_password');

б) Обновить учетку удаленного пользователя и пароля

ALTER USER MAPPING FOR DB2ADMIN SERVER COMMON OPTIONS 
(SET REMOTE_AUTHID 'new_remote_user_login', SET REMOTE_PASSWORD 'your_password');

в) Добавление нового(дополнительного) пользователя в таблицу отображений

CREATE USER MAPPING FOR YOUR_USER SERVER COMMON OPTIONS 
(REMOTE_AUTHID 'remote_user', REMOTE_PASSWORD  'remote_password');

На этом перенос баз данных завершен!

p.s. Даже, если на новом компьютере у вас будут аналогичные удаленные пользователь с таким же паролями, советую обновить кэши паролей для всех пользователей в таблице отображений.