0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: субд, базы данных, migration, oracle 12c, pdb, cdb, clone, dublicate</p>
1
<p>Теги: субд, базы данных, migration, oracle 12c, pdb, cdb, clone, dublicate</p>
2
<p>Появилась, казалось бы, простая задача - сделать копию рабочего проекта для разработки нового. Уточню - обе контейнерные базы живые, и в них крутятся проекты. Но это оказалось не столь тривиально.</p>
2
<p>Появилась, казалось бы, простая задача - сделать копию рабочего проекта для разработки нового. Уточню - обе контейнерные базы живые, и в них крутятся проекты. Но это оказалось не столь тривиально.</p>
3
<p>Просто снять<strong>backup</strong>rman’ом и восстановить его на другой<strong>cdb</strong>невозможно. Ибо другая<strong>cdb</strong>ничего об этом<strong>pdb</strong>не знает. Использовать<strong>unplug</strong>- тоже не подходит, ведь рабочую базу нельзя тормозить. Везде описана процедура клонирования через<strong>dblink</strong>, но везде также требовалось в начале перевести исходную<strong>pdb</strong>в<strong>read only</strong>состояние через остановку.</p>
3
<p>Просто снять<strong>backup</strong>rman’ом и восстановить его на другой<strong>cdb</strong>невозможно. Ибо другая<strong>cdb</strong>ничего об этом<strong>pdb</strong>не знает. Использовать<strong>unplug</strong>- тоже не подходит, ведь рабочую базу нельзя тормозить. Везде описана процедура клонирования через<strong>dblink</strong>, но везде также требовалось в начале перевести исходную<strong>pdb</strong>в<strong>read only</strong>состояние через остановку.</p>
4
<h2>Обнаружилось несколько методов клонирования</h2>
4
<h2>Обнаружилось несколько методов клонирования</h2>
5
<ol><li>Через<strong>rman</strong>- duplicate через auxiliary cdb создаётся отдельный экземпляр (<strong>instance</strong>) для новой<strong>cdb</strong>, делается duplicate нужной pdb (при этом необходимая структура cdb тоже дублицируется). Из минусов - нужен общий каталог бэкапов, затем нужно отсоединить<strong>pdb</strong>и сделать<strong>clone</strong>в нужную<strong>cdb</strong>.</li>
5
<ol><li>Через<strong>rman</strong>- duplicate через auxiliary cdb создаётся отдельный экземпляр (<strong>instance</strong>) для новой<strong>cdb</strong>, делается duplicate нужной pdb (при этом необходимая структура cdb тоже дублицируется). Из минусов - нужен общий каталог бэкапов, затем нужно отсоединить<strong>pdb</strong>и сделать<strong>clone</strong>в нужную<strong>cdb</strong>.</li>
6
<li>Через<strong>rman</strong>, используя<strong>transportable tablespace</strong>(в подробности<a>не вдавался</a>).</li>
6
<li>Через<strong>rman</strong>, используя<strong>transportable tablespace</strong>(в подробности<a>не вдавался</a>).</li>
7
</ol><p>В конце концов нашли правильное сочетание для поиска нужной инструкции - PDB HOT CLONE, и оказалось всё достаточно просто.<strong>Oracle 12c</strong>поддерживает клонирование на лету, поэтому необязательно переводить pdb в read only.</p>
7
</ol><p>В конце концов нашли правильное сочетание для поиска нужной инструкции - PDB HOT CLONE, и оказалось всё достаточно просто.<strong>Oracle 12c</strong>поддерживает клонирование на лету, поэтому необязательно переводить pdb в read only.</p>
8
<p>Исходные данные: - CDB_source - исходная контейнерная база; - PDB_source - исходная PDB; - CDB_dup - контейнерная база, куда производим клонирование.</p>
8
<p>Исходные данные: - CDB_source - исходная контейнерная база; - PDB_source - исходная PDB; - CDB_dup - контейнерная база, куда производим клонирование.</p>
9
<h2>Поехали!</h2>
9
<h2>Поехали!</h2>
10
<p>На<strong>CDB_source</strong>создаём пользователя для клонирования (во избежание зависаний все контейнеры должны быть открыты):</p>
10
<p>На<strong>CDB_source</strong>создаём пользователя для клонирования (во избежание зависаний все контейнеры должны быть открыты):</p>
11
SQL> CREATE USER c##remote_clone_user IDENTIFIED BYremote_clone_user container=all; User created. SQL> GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;<p>на<strong>CDB_dup</strong>прописываем<strong>tns</strong>:</p>
11
SQL> CREATE USER c##remote_clone_user IDENTIFIED BYremote_clone_user container=all; User created. SQL> GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;<p>на<strong>CDB_dup</strong>прописываем<strong>tns</strong>:</p>
12
cdb_source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = cdb_source)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cdb_source) ) )<p>создаём<strong>DBLINK</strong>и клонируем pdb:</p>
12
cdb_source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = cdb_source)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cdb_source) ) )<p>создаём<strong>DBLINK</strong>и клонируем pdb:</p>
13
SQL> CREATE PUBLIC DATABASE LINK clone_link CONNECT TO c##remote_clone_user IDENTIFIED BYremote_clone_user USING 'CDB_SOURCE'; Database link created. SQL> create pluggable database pdbdup from PDB_SOURCE@clone_link; Pluggable database created. SQL> alter pluggable database pdbdup open; Pluggable database altered.<p><em>На этом всё. Если хотите узнать больше, задавайте вопросы в комментариях или записывайтесь на курс "<a>Реляционные СУБД</a>"!</em></p>
13
SQL> CREATE PUBLIC DATABASE LINK clone_link CONNECT TO c##remote_clone_user IDENTIFIED BYremote_clone_user USING 'CDB_SOURCE'; Database link created. SQL> create pluggable database pdbdup from PDB_SOURCE@clone_link; Pluggable database created. SQL> alter pluggable database pdbdup open; Pluggable database altered.<p><em>На этом всё. Если хотите узнать больше, задавайте вопросы в комментариях или записывайтесь на курс "<a>Реляционные СУБД</a>"!</em></p>
14
14