16.03.2017 4 min to read

Multitenant : Клонирование PDB или Non-CDB в Oracle Database 12c (12.1.0.2)

Category : Статьи

Удаленное клонирование подключаемых БД в работающем виде доступно начиная с Oracle 12c версии 12.1.0.1. Доступно 2 варианта создания колона PDB – из подключаемой БД (remote PDB) и неконтейнерной БД (remote non-CDB).

Терминология

  • Локальная БД (local) – контейнерная БД (CDB), в которой будет создан новый клон подключаемой БД
  • Удаленная БД (remote) – исходная БД – подключаемая (PDB) или неконтейнерная (non-CDB), с которой будет сниматься копия

В примерах, иллюстрирующих процесс клонирования, используются следующие БД:

  1. cdb1 – Локальная контейнерная БД (CDB), где будут созданы клоны.
  2. db12c – Удаленная неконтейнерная БД (non-CDB).
  3. cdb3 – Удаленная контейнерная БД (CDB), где находится исходная подключаемая БД (PDB), с которой будет делаться клон.
  4. pdb5 – Удаленная подключаемая БД (PDB), с которой будет делаться клон.

Требования

Процесс клонирования удаленной БД, как PDB, так и non-CDB во многом идентичен. Поэтому требования в обоих вариантах одинаковые.

  1. Пользователь локальной БД должен иметь привилегии CREATE PLUGGABLE DATABASE.
  2. Удаленная БД (PDB и non-CDB) должна быть запущена в режиме только для чтения (read-only mode).
  3. В локальной БД должна быть создана ссылка (database link) на удаленную БД. Если клонируется PDB, то ссылка может быть связана с контейнерной удаленной БД (CDB) через глобального пользователя или с подключаемой БД (PDB) через локального или глобального пользователя.
  4. Пользователь удаленной БД, через которого настроена связь (database link) должен иметь привилегии CREATE PLUGGABLE DATABASE.
  5. Локальная и удаленная БД должны иметь одинаковые разрядности, установленные опции и кодировки.
  6. В случае клонирования non-CDB, обе БД должны иметь версию не ниже 12.1.0.2.

Подготовка локальной БД (CDB)

Устанавливаем переменные окружения в ОС с локальной БД.

TMP=/tmp
TMPDIR=$TMP
ORACLE_HOSTNAME=myhostname.domain.ru
ORACLE_UNQNAME=mysid
ORACLE_BASE=/oracle/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/db_1
ORACLE_SID=mysid
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
NLS_LANG=RUSSIAN_RUSSIA.UTF8
#NLS_LANG=RUSSIAN_RUSSIA.RU8PC866
#NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251
#NLS_LANG=RUSSIAN_RUSSIA.CL8KOI8R
NLS_DATE_LANGUAGE=RUSSIAN
NLS_SORT=RISSIAN

Создаем локальную контейнерную БД (CDB).

dbca

Клонирование удаленной подключаемой БД (PDB)

Через удаленный терминал (ssh) заходим на сервер с удаленной БД (CDB) и настраиваем переменные окружения.

export ORAENV_ASK=NO
export ORACLE_SID=cdb3
. oraenv
export ORAENV_ASK=YES

Соединяемся с БД.

sqlplus / as sysdba

Создаем пользователя для удаленного соединения с разрешением клонирования (в данном примере будет использоваться локальный пользователь).

ALTER SESSION SET CONTAINER=pdb5;
CREATE USER remote_clone_user IDENTIFIED BY remote_clone_user;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_clone_user;

Переводим подключаемую БД (PDB) в режим read-only.

ALTER PLUGGABLE DATABASE pdb5 CLOSE;
ALTER PLUGGABLE DATABASE pdb5 OPEN READ ONLY;
EXIT;

Через удаленный терминал (ssh) заходим на сервер с локальной БД (CDB) и настраиваем переменные окружения.

export ORAENV_ASK=NO
export ORACLE_SID=cdb1
. oraenv
export ORAENV_ASK=YES

Определяем строку соединения (tnsname) с удаленной подключаемой БД (PDB)

PDB5 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = remote.server)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb5)
)
)

Соединяемся с локальной БД (CDB).

sqlplus / as sysdba

Создаем ссылку для соединения с удаленной БД (remote database link с PDB) и проверяем ее.

DROP DATABASE LINK clone_link;
CREATE DATABASE LINK clone_link
CONNECT TO remote_clone_user IDENTIFIED BY remote_clone_user USING 'pdb5';
-- Test link.
DESC user_tables@clone_link

Клонирование БД. В простейшем случае клонирования подключаемой БД (PDB) используется автоматическое управление файлами данных (Oracle Managed Files – OMF). В этом случаем ручной конвертации имен файлов не требуется и достаточно выполнения простой команды клонирования.

CREATE PLUGGABLE DATABASE pdb5new FROM pdb5@clone_link;
Pluggable database created.
SQL>

Если использование автоматического управления файлами невозможно, то при запуске данной команды мы получим ошибку:

SQL> create pluggable database pdb5new from pdb5@clone_link;
create pluggable database pdb5new from pdb5@clone_link
*
ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specified

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

SQL> create pluggable database pdb5new from pdb5@clone_link
2 file_name_convert=('/oracle/u01/app/oracle/oradata/CDB3/25E8659A548818E7E0533C71A8C0C891', '/var/u01/app/oracle/oradata/cdb1/pdb5new');

Если же OMF используется, то может возникнуть ошибка:

create pluggable database pdb5new from pdb5@clone_link
*
ERROR at line 1:
ORA-01276: Cannot add file
/var/u01/app/oracle/oradata/cdb1/pdb5new/datafile/O1_mf_system_c5xjk0x9_.DBF.
File has an Oracle Managed Files file name.

В таком случае необходимо определить правило конвертации для каждого файла данных:

create pluggable database pdb5new from pdb5@clone_link
file_name_convert=('/oracle/u01/app/oracle/oradata/CDB3/25E8659A548818E7E0533C71A8C0C891/datafile/o1_mf_sysaux_c5xjk0xl_.dbf','/var/u01/app/oracle/oradata/cdb1/pdb5new/sysaux01.dbf',
'/oracle/u01/app/oracle/oradata/CDB3/25E8659A548818E7E0533C71A8C0C891/datafile/o1_mf_temp_c5xjk0xn_.dbf','/var/u01/app/oracle/oradata/cdb1/pdb5new/temp01.dbf',
'/oracle/u01/app/oracle/oradata/CDB3/25E8659A548818E7E0533C71A8C0C891/datafile/o1_mf_system_c5xjk0x9_.dbf','/var/u01/app/oracle/oradata/cdb1/pdb5new/system01.dbf',
'/oracle/u01/app/oracle/oradata/CDB3/25E8659A548818E7E0533C71A8C0C891/datafile/o1_mf_users_c5xjk8s8_.dbf','/var/u01/app/oracle/oradata/cdb1/pdb5new/users01.dbf');
Pluggable database created.
SQL>

Запускаем созданную БД (PDB). После клонирования новая локальная подключаемая БД (PDB) находится в состоянии MOUNTED.

SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5NEW';
NAME OPEN_MODE
------------------------------ ----------
PDB5NEW MOUNTED
SQL>

Для завершения процесса необходимо открыть смонтированную БД в режиме чтение-запись.

ALTER PLUGGABLE DATABASE pdb5new OPEN;
SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5NEW';
NAME OPEN_MODE
------------------------------ ----------
PDB5NEW READ WRITE
SQL>

Клонирование удаленной неконтейнерной БД (Non-CDB)

Через удаленный терминал (ssh) заходим на сервер с удаленной БД (Non-CDB), настраиваем переменные окружения и устанавливаем соединение с Non-CDB.

export ORAENV_ASK=NO
export ORACLE_SID=db12c
. oraenv
export ORAENV_ASK=YES
sqlplus / as sysdba

Создаем пользователя для удаленного соединения с разрешением клонирования.

CREATE USER remote_clone_user IDENTIFIED BY remote_clone_user;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_clone_user;

Переводим удаленную БД (Non-CDB) в режим read-only.

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;

Через удаленный терминал (ssh) заходим на сервер с локальной БД (CDB), настраиваем переменные окружения и устанавливаем соединение с CDB.

export ORAENV_ASK=NO
export ORACLE_SID=cdb1
. oraenv
export ORAENV_ASK=YES
sqlplus / as sysdba

Определяем строку соединения (tnsname) с удаленной БД (Non-CDB).

DB12C =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = remote.server)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db12c)
)
)
[/vim]

Создаем ссылку для соединения с удаленной БД (remote database link с Non-CDB) и проверяем ее.

DROP DATABASE LINK clone_link;
CREATE DATABASE LINK clone_link
CONNECT TO remote_clone_user IDENTIFIED BY remote_clone_user USING 'db12c';
-- Test link.
DESC user_tables@clone_link

Клонирование БД. В данном случае используется автоматическое управление файлами данных (Oracle Managed Files – OMF), следовательно ручной конвертации имен файлов не требуется и параметр FILE_NAME_CONVERT определять не требуется. Т.к. на удаленной БД подключаемая БД отсутствует, используем NON$CDB в качестве имени PDB.

CREATE PLUGGABLE DATABASE db12cpdb FROM NON$CDB@clone_link;
Pluggable database created.
SQL>

Запускаем созданную БД (PDB). После клонирования новая локальная подключаемая БД (PDB) находится в состоянии MOUNTED.

SELECT name, open_mode FROM v$pdbs WHERE name = 'DB12CPDB';
NAME OPEN_MODE
------------------------------ ----------
DB12CPDB MOUNTED
SQL>

Т.к. PDB создавалась из неконтейнерной БД (Non-CDB), перед тем, как ее открыть, необходимо выполнить скрипт “$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql”.

ALTER SESSION SET CONTAINER=db12cpdb;
@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

Теперь подключаемую БД можно открыть в режиме чтение-запись.

ALTER PLUGGABLE DATABASE db12cpdb OPEN;
SELECT name, open_mode FROM v$pdbs WHERE name = 'DB12CPDB';
NAME OPEN_MODE
------------------------------ ----------
DB12CPDB READ WRITE
SQL>