Удаленное клонирование подключаемых БД в работающем виде доступно начиная с Oracle 12c версии 12.1.0.1. Доступно 2 варианта создания колона PDB – из подключаемой БД (remote PDB) и неконтейнерной БД (remote non-CDB).
Терминология
- Локальная БД (local) – контейнерная БД (CDB), в которой будет создан новый клон подключаемой БД
- Удаленная БД (remote) – исходная БД – подключаемая (PDB) или неконтейнерная (non-CDB), с которой будет сниматься копия
В примерах, иллюстрирующих процесс клонирования, используются следующие БД:
- cdb1 – Локальная контейнерная БД (CDB), где будут созданы клоны.
- db12c – Удаленная неконтейнерная БД (non-CDB).
- cdb3 – Удаленная контейнерная БД (CDB), где находится исходная подключаемая БД (PDB), с которой будет делаться клон.
- pdb5 – Удаленная подключаемая БД (PDB), с которой будет делаться клон.
Требования
Процесс клонирования удаленной БД, как PDB, так и non-CDB во многом идентичен. Поэтому требования в обоих вариантах одинаковые.
- Пользователь локальной БД должен иметь привилегии CREATE PLUGGABLE DATABASE.
- Удаленная БД (PDB и non-CDB) должна быть запущена в режиме только для чтения (read-only mode).
- В локальной БД должна быть создана ссылка (database link) на удаленную БД. Если клонируется PDB, то ссылка может быть связана с контейнерной удаленной БД (CDB) через глобального пользователя или с подключаемой БД (PDB) через локального или глобального пользователя.
- Пользователь удаленной БД, через которого настроена связь (database link) должен иметь привилегии CREATE PLUGGABLE DATABASE.
- Локальная и удаленная БД должны иметь одинаковые разрядности, установленные опции и кодировки.
- В случае клонирования 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>