Установка Oracle 12c как Контейнерной и Подключаемой базы данных

THE HOLY BIBLE - King James Version - БИБЛИЯ в Синодальном переводе
"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу

Установка Oracle 12c как Контейнерной и Подключаемой базы данных.

Версия Oracle database 12c внесла существенное новшество в 30-ти летний продукт. Теперь внутренний системный "словарь" экземпляра разделён на части, что позволяет создавать "облегчённые" базы данных с усечённым "пользовательским словарём". Такие базы могут быть легко "извлечены" из одной контейнерной базы и "подключены" в другую, как одно целое. При этом такое существенное изменение в продукте остаётся полностью прозрачным для правильно написанного приложения.

Также в новой версии наконец-то появилась достойная альтернатива ужасному Cloud Control - облегчённый простой и эффективный Enterprise Manager Express.

В предлагаемой заметке я привожу пример установки Оракла 12c, создания контейнерной и подключаемой баз и включения Enterprise Manager Express.

Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:



.................. == От Иоанна святое благовествование == .....................
=== Глава 10, Стих 9 ===
1 Истинно, истинно говорю вам: кто не дверью входит во двор овчий, но
 перелазит инуде, тот вор и разбойник;
2 а входящий дверью есть пастырь овцам.
3 Ему придверник отворяет, и овцы слушаются голоса его, и он зовет своих овец
 по имени и выводит их.
4 И когда выведет своих овец, идет перед ними; а овцы за ним идут, потому что
 знают голос его.
5 За чужим же не идут, но бегут от него, потому что не знают чужого голоса.
6 Сию притчу сказал им Иисус; но они не поняли, что такое Он говорил им.
7 Итак, опять Иисус сказал им: истинно, истинно говорю вам, что Я дверь овцам.
8 Все, сколько их ни приходило предо Мною, суть воры и разбойники; но овцы не
 послушали их.
9 Я есмь дверь: кто войдет Мною, тот спасется, и войдет, и выйдет, и пажить
 найдет.

Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.

Словно радуга после дождя, всегда приходящая вместе с теплыми лучами солнца и пением птиц, Слово Божие всегда прямо перед нами - только повернись лицом к свету, открой Библию, прочти чудесные строки - и вот Он, Спаситель Иисус Христос, прямо перед вами. Господь всегда приходит к нам в светлых видениях и мыслях, явно принося милость благодать и прощение для тех, кто захочет услышать.

Но как же часто мы с вами как будто специально отворачиваемся от Приходящего к нам дверями нашей души пастыря и блуждаем по тёмным закоулкам наших сердец, ища мнимых благ, утешающих самолюбие и жадность, но губящих душу! И ведь слышим же голос Иисуса, зовущий нас за Ним, и ведь знает сердце наше голос этот - и так и рвётся к Нему навстречу. Ан нет, вновь опускаем очи наши долу и смотрим пристально под ноги, надеясь найти золотой слиток. Но всё чаще находим лишь объедки после чьего-то грешного застолья ... А ведь всего-то и нужно, что поднять глаза, дать душе рвануть вверх - именно там спасение, пажить с достатком, необходимым для спокойной счастливой независтливой жизни, и вход и выход ...

Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.

Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.

На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.


Вернёмся к нашим техническим деталям.

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

  • Установка ОС и Oracle 12c в silent режиме
  • Настройка и запуск Network Listener
  • Создание "Контейнерной" базы данных, без схем пользователя
  • Регистрация новой "Контейнерной" базы в Enterprise Manager Express
  • Создание "Подключаемой" базы из существующего "образца", предназначенной для хранения данных приложения
  • В 12-том Оракле данные пользователя и приложений должны храниться исключительно в "подключаемых" базах. "Контейнерная" база содержит только "системную" часть словаря, "корневую" системную базу и "начальную" базу-пустышку. Возможно создание "монолитной" базы "по старинке", так же как это делалось в 10 и 11 версиях, но от этого способа надо как можно скорее отказываться.

    Установка ОС и Oracle 12c в silent режиме

    Как всегда, всё начинается с операционной системы. Установим Oracle Linux Server release 5.8 в виде виртуальной или физической машины. Я использую Virtual Box и просто "клонирую" уже имеющуюся систему:

    .................. == От Иоанна святое благовествование == .....................
    === Глава 10, Стих 9 ===
    9 Я есмь дверь: кто войдет Мною, тот спасется, и  войдет,  и  выйдет,  и  пажить
    найдет.
    10 Вор приходит только для того, чтобы  украсть,  убить  и  погубить.  Я  пришел
    для того, чтобы имели жизнь и имели с избытком.
    11 Я  есмь  пастырь  добрый:  пастырь  добрый  полагает  жизнь  свою  за   овец.
    12 А наемник, не пастырь, которому овцы не  свои,  видит  приходящего  волка,  и
    оставляет овец, и бежит; и волк расхищает овец, и разгоняет их.
    13 А   наемник   бежит,   потому   что   наемник,   и   нерадит    об     овцах.
    14 Я   есмь   пастырь   добрый;   и   знаю   Моих,   и    Мои    знают     Меня.
    15 Как Отец знает Меня, _так_ и Я  знаю  Отца;  и  жизнь  Мою  полагаю  за овец.
    16 Есть у Меня и другие  овцы,  которые  не  сего  двора,  и  тех  надлежит  Мне
    привести: и они услышат голос Мой, и будет одно стадо и один Пастырь.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c distro]$ uname -a
    Linux db12c 2.6.32-300.38.1.el5uek #1 SMP x86_64 x86_64 x86_64 GNU/Linux
    [oracle@db12c distro]$ cat /etc/oracle-release
    Oracle Linux Server release 5.8
    [oracle@db12c distro]$
    
    -- Для отображения элементов "ls" в цвете, добавьте это в /etc/bashrc,
    -- LS_COLORS должна представлять одну длинную строку:
    LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:
    bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:
    tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:
    *.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:
    *.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:
    *.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:
    *.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:
    *.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:
    *.rz=01;31:*.rm=01;35:*.rmvb=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:
    *.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:
    *.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:';
    export LS_COLORS
    
    -- Также для vim:
    [oracle@db12c distro]$ cat ~/.vimrc
    colo ron
    set ic
    set nocp
    

    Если вы используете виртуализацию - создайте "snapshot" сейчас, до начала установки Oracle. Это позволит "откатить" машину назад в случае неудачи.

    Во время установки, запуска и тестирования базы наблюдайте за производительностью вашей ОС. В моём случае я наблюдаю за самим "хостом", а не за "виртуалкой":

    .......... == Первое соборное послание святого апостола Иоанна == ..............
    === Глава 4, Стих 21 ===
    20 Кто говорит: "я люблю Бога", а брата  своего  ненавидит,  тот  лжец:  ибо  не
    любящий брата своего, которого видит, как  может  любить  Бога,  Которого  не
    видит?
    21 И мы имеем  от  Него  такую  заповедь,  чтобы  любящий  Бога  любил  и  брата
    своего.
    
    (b+/b-, c+/c-, +/-, *) >
    
    
    [ora1@db12host ORA12cProduction2]$ sar -bq -m TEMP 30
    Linux 3.6.9-2.fc17.x86_64 (db12host)    12/08/2013      _x86_64_        (2 CPU)
    
    11:31:52 AM       tps      rtps      wtps   bread/s   bwrtn/s
    11:32:22 AM    207.50     91.53    115.97  14977.00   5026.33
    -- разделите 2 последние колонки на 2 для KBytes, один block = 0.5KB
    
    11:31:52 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
    11:32:22 AM         4       318      1.14      1.19      1.08         1
    
    11:31:52 AM    TEMP      degC     %temp               DEVICE
    11:32:22 AM       1     40.00      0.00     acpitz-virtual-0
    11:32:22 AM       2     68.00     68.00     nouveau-pci-0300
    11:32:22 AM       3     39.00     43.33       atk0110-acpi-0
    11:32:22 AM       4     41.00     91.11       atk0110-acpi-0
    11:32:22 AM       5     37.00      0.00      k8temp-pci-00c3
    11:32:22 AM       6     45.00      0.00      k8temp-pci-00c3
    

    Таким образом я также отслеживаю температуру процессора, материнской платы и видео карты. Данные могут быть неточны - сравните с показаниями в BIOS.

    Теперь распакуем архив файла поставки:

    .............. == Соборное послание святого апостола Иакова == .................
    === Глава 4, Стих 2 ===
    1 Откуда у вас вражды и распри? не отсюда ли, от  вожделений  ваших,  воюющих  в
    членах ваших?
    2 Желаете -- и не имеете; убиваете  и  завидуете  --  и  не  можете  достигнуть;
    препираетесь и враждуете -- и не имеете, потому что не просите.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c distro]$ unzip ../database_12.1Production2_1of2.zip
    ...
    [oracle@db12c distro]$ unzip ../database_12.1Production2_2of2.zip
    
    -- Измените значение vm.swappiness на 100 в /etc/sysctl.conf и проверьте
    [root@db12c ~]# grep swap /etc/sysctl.conf
    vm.swappiness = 100
    [root@db12c ~]# sysctl -p | grep swap
    vm.swappiness = 100
    [root@db12c ~]#
    

    Подготовка к установке

    Теперь подключимся к машине через ssh, X11 forwarding не понадобится, и проверим состав каталогов и наличие файла "ответов" для программы установки Оракла:

    [ora1@db12host ~]$ ssh oracle@192.168.56.201
    Last login: Fri Dec  7 16:39:53 2013 from 192.168.56.1
    ............................ == Книга Неемии == ................................
    === Глава 9, Стих 18 ===
    18 И хотя они сделали себе литoго тельца,  и  сказали:  вот  бог  твой,  который
    вывел тебя из Египта, и хотя делали великие оскорбления,
    19 но Ты, по великому  милосердию  Твоему,  не  оставлял  их  в  пустыне;  столп
    облачный не отходил от них днем, чтобы вести их по  пути,  и  столп  огненный
    -- ночью, чтобы светить им на пути, по которому им идти.
    
    (b+/b-, c+/c-, +/-, *) >
    
    ...
    [oracle@db12c database]$ ls
    install  response  rpm  runInstaller  sshsetup  stage
    [oracle@db12c database]$ pwd
    /home/oracle/distro/database
    [oracle@db12c database]$
    
    -- Запустите такую команду для просмотра возможных параметров установщика:
    ./runInstaller -help
    
    -- Подготовьте файл для silent installation:
    [oracle@db12c response]$ ls
    dbca.rsp  db_install.rsp  netca.rsp
    [oracle@db12c response]$ pwd
    /home/oracle/distro/database/response
    [oracle@db12c response]$
    [oracle@db12c response]$ cp db_install.rsp ~
    
    ... отредактируйте файл соответственно:
    [oracle@db12c response]$ cat ~/db_install.rsp
    oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v12.1.0
    oracle.install.option=INSTALL_DB_SWONLY
    ORACLE_HOSTNAME=db12c
    UNIX_GROUP_NAME=oinstall
    INVENTORY_LOCATION=/u01/app/oraInv
    SELECTED_LANGUAGES=en
    ORACLE_HOME=/u01/app/orabase/ora12c
    ORACLE_BASE=/u01/app/orabase
    oracle.install.db.InstallEdition=EE
    oracle.install.db.DBA_GROUP=dba
    oracle.install.db.OPER_GROUP=dba
    oracle.install.db.BACKUPDBA_GROUP=dba
    oracle.install.db.DGDBA_GROUP=dba
    oracle.install.db.KMDBA_GROUP=dba
    oracle.install.db.rac.configurationType=
    oracle.install.db.CLUSTER_NODES=
    oracle.install.db.isRACOneInstall=
    oracle.install.db.racOneServiceName=
    oracle.install.db.rac.serverpoolName=
    oracle.install.db.rac.serverpoolCardinality=
    oracle.install.db.config.starterdb.type=
    oracle.install.db.config.starterdb.globalDBName=
    oracle.install.db.config.starterdb.SID=
    oracle.install.db.ConfigureAsContainerDB=
    oracle.install.db.config.PDBName=
    oracle.install.db.config.starterdb.characterSet=
    oracle.install.db.config.starterdb.memoryOption=
    oracle.install.db.config.starterdb.memoryLimit=
    oracle.install.db.config.starterdb.installExampleSchemas=
    oracle.install.db.config.starterdb.password.ALL=
    oracle.install.db.config.starterdb.password.SYS=
    oracle.install.db.config.starterdb.password.SYSTEM=
    oracle.install.db.config.starterdb.password.DBSNMP=
    oracle.install.db.config.starterdb.password.PDBADMIN=
    oracle.install.db.config.starterdb.managementOption=
    oracle.install.db.config.starterdb.omsHost=
    oracle.install.db.config.starterdb.omsPort=
    oracle.install.db.config.starterdb.emAdminUser=
    oracle.install.db.config.starterdb.emAdminPassword=
    oracle.install.db.config.starterdb.enableRecovery=
    oracle.install.db.config.starterdb.storageType=
    oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
    oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
    oracle.install.db.config.asm.diskGroup=
    oracle.install.db.config.asm.ASMSNMPPassword=
    MYORACLESUPPORT_USERNAME=
    MYORACLESUPPORT_PASSWORD=
    SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
    JULLINE_SECURITY_UPDATES=true
    PROXY_HOST=
    PROXY_PORT=
    PROXY_USER=
    PROXY_PWD=
    PROXY_REALM=
    COLLECTOR_SUPPORTHUB_URL=
    oracle.installer.autoupdates.option=SKIP_UPDATES
    oracle.installer.autoupdates.downloadUpdatesLoc=
    AUTOUPDATES_MYORACLESUPPORT_USERNAME=
    AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
    [oracle@db12c response]$
    

    Запуск программы установки

    Я предпочитаю устанавливать Oracle Database в "молчаливом" режиме, который позволяет мне чётко видеть происходящее, обнаруживать ошибки, легко повторять установку на нескольких машинах (узлах кластера?) и продлевать срок службы мышки.

    .......... == Первое соборное послание святого апостола Иоанна == ..............
    === Глава 4, Стих 16 ===
    16 И мы познали любовь, которую имеет к нам Бог, и уверовали  в  нее.  Бог  есть
    любовь, и пребывающий в любви пребывает в Боге, и Бог в нем.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c database]$ ./runInstaller -silent -showProgress \
    -responseFile /home/oracle/db_install.rsp
    ...
    A log of this session is currently saved as:
    /tmp/OraInstall2013-12-07_05-48-06PM/installActions2013-12-07_05-48-06PM.log
    ...
    You can find the log of this install session at:
    /u01/app/oraInv/logs/installActions2013-12-07_05-48-06PM.log
    Prepare in progress.
    ..................................................   9% Done.
    Prepare successful.
    Copy files in progress.
    ..................................................   15% Done.
    ..................................................   20% Done.
    ...
    ..................................................   81% Done.
    ..........
    Copy files successful.
    Link binaries in progress.
    ..........
    Link binaries successful.
    Setup files in progress.
    ........................................
    Setup files successful.
    ..................................................   86% Done.
    Setup Inventory in progress.
    Setup Inventory successful.
    ..........
    Finish Setup in progress.
    ..................................................   94% Done.
    
    Finish Setup successful.
    The installation of Oracle Database 12c was successful.
    Please check '/u01/app/oraInv/logs/silentInstall2013-12-07_05-48-06PM.log'
    for more details.
    
    Execute Root Scripts in progress.
    
    As a root user, execute the following script(s):
    1. /u01/app/oraInv/orainstRoot.sh
    2. /u01/app/orabase/ora12c/root.sh
    
    
    ..................................................   100% Done.
    
    Execute Root Scripts successful.
    Successfully Setup Software.
    

    Действия после установки

    После установки, как указано в лог файле, мы запустим скрипт от имени суперпользователя:

    .............. == Послание к Галатам святого апостола Павла == .................
    === Глава 5, Стих 21 ===
    19 Дела   плоти   известны;   они   суть:   прелюбодеяние,   блуд,    нечистота,
    непотребство,
    20 идолослужение,   волшебство,   вражда,   ссоры,   зависть,   гнев,    распри,
    разногласия, [соблазны,] ереси,
    21 ненависть, убийства, пьянство, бесчинство и  тому  подобное.  Предваряю  вас,
    как и прежде предварял, что поступающие так Царствия Божия не наследуют.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [root@db12c ~]# /u01/app/oraInv/orainstRoot.sh
    Changing permissions of /u01/app/oraInv.
    Adding read,write permissions for group.
    Removing read,write,execute permissions for world.
    
    Changing groupname of /u01/app/oraInv to oinstall.
    The execution of the script is complete.
    [root@db12c ~]#
    [root@db12c ~]# /u01/app/orabase/ora12c/root.sh
    Check /u01/app/orabase/ora12c/install/root_db12c_2013-12-07_18-40-07.log
    for the output of root script
    [root@db12c ~]#
    [root@db12c ~]# cat /u01/app/orabase/ora12c/install/root_db12c_2013-12-07_18-40-07.log
    
    Performing root user operation for Oracle 12c
    
    The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/orabase/ora12c
    
    Creating /etc/oratab file...
    Entries will be added to the /etc/oratab file as needed by
    Database Configuration Assistant when a database is created
    Finished running generic part of root script.
    Now product-specific root actions will be performed.
    [root@db12c ~]#
    

    Теперь остались мелочи - добавить вновь установленный Оракл в маршрут поиска файлов и проверить переменные среды пользователя:

    [oracle@db12c ~]$ tail .bashrc
    # User specific aliases and functions
    export ORACLE_HOSTNAME=db12c
    export ORACLE_HOME=/u01/app/orabase/ora12c
    export ORACLE_BASE=/u01/app/orabase
    export PATH=$ORACLE_HOME/bin:$PATH
    [oracle@db12c ~]$  source ~/.bashrc
    ..................... == Книга Премудрости Соломона == .........................
    === Глава 10, Стих 11 ===
    11 Когда  из  корыстолюбия  обижали  его,  она  предстала   и   обогатила   его,
    12 сохранила его от врагов, и обезопасила  от  коварствовавших  против  него,  и
    в крепкой борьбе доставила ему победу, дабы он знал,  что  благочестие  всего
    сильнее.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@db12c ~]$ env | grep ORA
    ORACLE_BASE=/u01/app/orabase
    ORACLE_HOSTNAME=db12c
    ORACLE_HOME=/u01/app/orabase/ora12c
    [oracle@db12c ~]$ which netca
    /u01/app/orabase/ora12c/bin/netca
    [oracle@db12c ~]$
    

    Настройка и запуск Network Listener

    После того, как все двоичные файлы и библиотеки Оракла были установлены на предыдущем этапе, нам надо начать с конфигурирования и запуска сетевых процессов. Для подготовки listener файла мы будем использовать "помощника сетевой конфигурации":

    .......... == Второе послание к Тимофею святого апостола Павла == ..............
    === Глава 4, Стих 3 ===
    3 Ибо будет время, когда  здравого  учения  принимать  не  будут,  но  по  своим
    прихотям будут избирать себе учителей, которые льстили бы слуху;
    4 и    от    истины    отвратят    слух     и     обратятся     к        басням.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c ~]$ cp distro/database/response/netca.rsp ~
    ... отредактируйте файл следующим образом: ...
    [oracle@db12c ~]$ cat netca.rsp
    [GENERAL]
    RESPONSEFILE_VERSION="12.1"
    CREATE_TYPE="CUSTOM"
    [oracle.net.ca]
    INSTALLED_COMPONENTS={"server","net8","javavm"}
    INSTALL_TYPE=""typical""
    LISTENER_NUMBER=1
    LISTENER_NAMES={"LISTENER"}
    LISTENER_PROTOCOLS={"TCP;1521"}
    LISTENER_START=""LISTENER""
    NAMING_METHODS={"TNSNAMES","ONAMES","HOSTNAME"}
    NSN_NUMBER=1
    NSN_NAMES={"EXTPROC_CONNECTION_DATA"}
    NSN_SERVICE={"PLSExtProc"}
    NSN_PROTOCOLS={"TCP;HOSTNAME;1521"}
    
    [oracle@db12c ~]$ netca -silent -responsefile /home/oracle/netca.rsp
    Parsing command line arguments:
    Parameter "silent" = true
    Parameter "responsefile" = /home/oracle/netca.rsp
    Done parsing command line arguments.
    Oracle Net Services Configuration:
    Profile configuration complete.
    Oracle Net Listener Startup:
    Running Listener Control:
    /u01/app/orabase/ora12c/bin/lsnrctl start LISTENER
    Listener Control complete.
    Listener started successfully.
    Listener configuration complete.
    Oracle Net Services configuration successful. The exit code is 0
    [oracle@db12c ~]$
    

    Теперь Oracle Listener "слушает" на TCP порту 1521, принимая входящие подключения клиентов. Единственная неувязка - у нас ещё нет базы данных "позади" listener'a и подключаться не к чему. Следующий шаг позволит нам исправить ситуацию.

    Обратите внимание - в Oracle 12c уже потребуется решительно перейти от использования "SID" к указанию "service name" в строке подключения клиента. Более того, наступили времена когда "connect / as sysdba" уже не может помочь во всех ситуациях. Теперь все, включая ДБА, должны подключаться через имя сетевой службы, одним из следующих способов:

  • connect sys/секретное_слово@//db12c:1521/service1 as sysdba
  • connect sys/секретное_слово@TNS_SERVICE1 as sysdba
  • connect sys/секретное_слово as sysdba
  • При этом в первом случае мы используем уже ставший стандартом EzConnect, не требующий для клиента файла сетевой конфигурации tnsnames.ora. Второй случай требует создания в таком файле записи с именем TNS_SERVICE1, a третий вариант предполагает предварительную установку переменных среды путём запуска файла "oraenv". Также нам вновь становится очень полезной подзабытая переменная окружения TWO_TASK - она упростит работу с "подключаемыми" базами (pluggable databases). Мои примеры строки подключения предполагают что база данных использует имя сетевой службы "service1", которое уже зарегистрировано с "listener".

    Создание "Контейнерной" базы данных, без схем пользователя

    Для создания пустой "контейнерной базы" я использую тот же самый Database Configuration Assistant.

    ................... == От Луки святое благовествование == ......................
    === Глава 12, Стих 13 ===
    13 Некто из народа сказал Ему: Учитель! скажи брату  моему,  чтобы  он  разделил
    со мною наследство.
    14 Он же  сказал  человеку  тому:  кто  поставил  Меня  судить  или  делить вас?
    15 При этом сказал им: смотрите, берегитесь  любостяжания,  ибо  жизнь  человека
    не зависит от изобилия его имения.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c response]$ pwd
    /home/oracle/distro/database/response
    [oracle@db12c response]$ cp dbca.rsp ~
    ... редактируем файл ...
    [oracle@db12c ~]$ cat dbca.rsp
    [GENERAL]
    RESPONSEFILE_VERSION = "12.1.0"
    OPERATION_TYPE = "createDatabase"
    [CREATEDATABASE]
    GDBNAME = "CDB"
    SID = "CDB"
    CREATEASCONTAINERDATABASE = true  ---- ВАЖНО
    TEMPLATENAME = "General_Purpose.dbc"
    OBFUSCATEDPASSWORDS = FALSE
    SYSPASSWORD = "oracle"
    SYSTEMPASSWORD = "oracle"
    EMCONFIGURATION = "NONE"
    SYSMANPASSWORD = "oracle"
    CHARACTERSET = "AL32UTF8"
    NATIONALCHARACTERSET= "AL16UTF16"
    LISTENERS = "LISTENER"  ---- Имя, использованное на прошлом шаге
    SAMPLESCHEMA=TRUE
    MEMORYPERCENTAGE = "60"
    DATABASETYPE = "MULTIPURPOSE"
    TOTALMEMORY = "1800"
    [createTemplateFromDB]
    SOURCEDB = "myhost:1521:orcl"
    SYSDBAUSERNAME = "system"
    TEMPLATENAME = "My Copy TEMPLATE"
    [createCloneTemplate]
    SOURCEDB = "orcl"
    TEMPLATENAME = "My Clone TEMPLATE"
    [DELETEDATABASE]
    SOURCEDB = "orcl"
    [generateScripts]
    TEMPLATENAME = "New Database"
    GDBNAME = "orcl12.localdomain"
    [CONFIGUREDATABASE]
    [ADDINSTANCE]
    DB_UNIQUE_NAME = "orcl12c.localdomain"
    NODELIST=
    SYSDBAUSERNAME = "sys"
    [DELETEINSTANCE]
    DB_UNIQUE_NAME = "orcl12c.localdomain"
    INSTANCENAME = "orcl12c"
    SYSDBAUSERNAME = "sys"
    
    [oracle@db12c ~]$ dbca -silent -responseFile /home/oracle/dbca.rsp
    Copying database files
    1% complete
    3% complete
    37% complete
    Creating and starting Oracle instance
    40% complete
    45% complete
    50% complete
    55% complete
    56% complete
    57% complete
    58% complete
    59% complete
    62% complete
    Completing Database Creation
    66% complete
    70% complete
    74% complete
    85% complete
    96% complete
    100% complete
    Look at the log file "/u01/app/orabase/cfgtoollogs/dbca/CDB/CDB.log" for further details.
    [oracle@db12c ~]$
    [oracle@db12c ~]$ cat /u01/app/orabase/cfgtoollogs/dbca/CDB/CDB.log
    Copying database files
    DBCA_PROGRESS : 1%
    DBCA_PROGRESS : 3%
    DBCA_PROGRESS : 37%
    Creating and starting Oracle instance
    DBCA_PROGRESS : 40%
    DBCA_PROGRESS : 45%
    DBCA_PROGRESS : 50%
    DBCA_PROGRESS : 55%
    DBCA_PROGRESS : 56%
    DBCA_PROGRESS : 57%
    DBCA_PROGRESS : 58%
    DBCA_PROGRESS : 59%
    DBCA_PROGRESS : 62%
    Completing Database Creation
    DBCA_PROGRESS : 66%
    DBCA_PROGRESS : 70%
    DBCA_PROGRESS : 74%
    DBCA_PROGRESS : 85%
    DBCA_PROGRESS : 96%
    DBCA_PROGRESS : 100%
    Database creation complete. For details check the logfiles at:
    /u01/app/orabase/cfgtoollogs/dbca/CDB.
    Database Information:
    Global Database Name:CDB
    System Identifier(SID):CDB
    [oracle@db12c ~]$
    

    Новая база данных создана - но мы не будем хранить в ней никаких данных конечных пользователей. Эта база, в соответствии с её именем, является просто контейнером для хранения "системных" компонентов - и они используются совместно всеми "подключенными" базами, устраняя ненужное дублирование данных и уменьшая число рекурсивных системных вызовов.

    Тем не менее, контейнерная база регистрируется листенером и мы можем подключаться к ней, как показано ниже. Но прежде всего нам надо было создать тот самый "системный" каталог в нашей пустой контейнерной базе - обычно это делалось скриптами, так же это делается и сейчас. Одно "НО" - в нашей "пустой" контейнерной базе CDB уже сейчас имеются две "подключаемые" базы - "root" и "seed". В каждой из этих PDB наш DBCA, используя скрипт, должен был создать индивидуальную "пользовательскую" часть (копию) каталога, и при этом в самом "контейнере" CDB - одну общую для всех "системную" часть разделённого каталога Oracle.

    Значит ли это, что нам придётся вручную запускать каждый из скриптов три раза? Или значительно большее число раз, в зависимости от количества уже "подключённых" баз? Как всегда, на помощь приходит Perl. (Заметили ли вы уже, что все "серьёзные" системные утилиты, близкие к "ядру" базы Oracle пишутся на Perl, а вся "клиентская" мишура - на Java?) Итак, очередной новый Ораклячий скрипт - "catcon.pl", позволяющий нам (или DBCA, как в примере вверху) запустить один и тот же скрипт по одному разу в каждой из уже подключенных pluggable databases. При создании контейнерной базы CDB вверху, DBCA в самом конце создания базы запустил для нас этот скрипт "catcon.pl" три раза, создав в каждой из имеющихся баз соответствующие (общие или индивидуальные) компоненты системного каталога скриптами "catalog.sql", "catproc.sql" и "pupbld.sql". Фактически, мы могли бы выполнить этот же шаг вручную таким образом (например, после создания контейнерной базы через SQL Statement CREATE DATABASE, не используя DBCA):

  • perl catcon.pl -u SYS -d $ORACLE_HOME/rdbms/admin -b catalog catalog.sql
  • perl catcon.pl -u SYS -d $ORACLE_HOME/rdbms/admin -b catproc catproc.sql
  • perl catcon.pl -u SYSTEM -d $ORACLE_HOME/sqlplus/admin -b pupbld pupbld.sql
  • Начало "прелестей" виртуализации ... таким образом, скрипт "catcon.pl" даёт нам возможность запускать любой, даже пользовательский, SQL скрипт во всех pluggable databases за один раз, экономя время.

    Пора проверить результат нашей установки - можем ли мы подключиться к вновь созданной контейнерной базе CDB? Заметьте - в выводе listener мы не видим никаких строк с типом протокола "RAW". Это важно - смотрите следующий фрагмент ниже.

    ........................ == Песнь песней Соломона == ...........................
    === Глава 8, Стих 7 ===
    7 Большие воды не могут потушить любви,  и  реки  не  зальют  ее.  Если  бы  кто
    давал все  богатство  дома  своего  за  любовь,  то  он  был  бы  отвергнут  с
    презреньем.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c ~]$ lsnrctl stat
    
    LSNRCTL for Linux: Version 12.1.0.0.2 - Production on 07-JUL-2013 22:13:24
    
    Copyright (c) 1991, 2013, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.0.2 - Production
    Start Date                07-JUL-2013 20:23:09
    Uptime                    0 days 1 hr. 50 min. 15 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/orabase/ora12c/network/admin/listener.ora
    Listener Log File         /u01/app/orabase/diag/tnslsnr/db12c/listener/alert/log.xml
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db12c.localdomain)(PORT=1521)))
    Services Summary...
    Service "CDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    Service "CDBXDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@db12c ~]$
    

    Уже очевидно, что мы сможем подключиться к базе CDB через SQL*Plus. Но как же графики и картинки? Тут ситуация на удивление улучшилась значительно!

    Регистрация новой "Контейнерной" базы в Enterprise Manager Express

    Мы можем "создать" внутри самой базы необходимые компоненты так, что Enterprise Manager Express (используя встроенную XML DB - в нашем примере выше это "CDBXDB") будет "обслуживать" только эту базу, не требуя никаких дополнительных систем типа Cloud Control. К тому же, сама функциональность Enterprise Manager Express изначально ориентирована на разработчиков и администраторов баз данных, что очень радует и упрощает работу. С самого начала, главная страница Enterprise Manager Express предоставляет нам в одном месте всю необходимую для работы информацию. Видно что EM Express разрабатывал специалист по базам данных, а не разработчик Java приложений.

    - использую SQLPlus, как SYS в контейнерной базе CDB:
    select dbms_xdb_config.GETHTTPPORT() from dual;
    - результат "0" (так и должно быть - мы пропустили этап
    - конфигурирования EM при создании базы через DBCA, хотя это
    - можно было сделать - смотрите подробности в "response file"):
    
    exec DBMS_XDB_CONFIG.SETHTTPPORT(8080); -- всё что требуется для EM Express.
    
    select dbms_xdb_config.GETHTTPPORT() from dual; -- проверка
    DBMS_XDB_CONFIG.GETHTTPPORT()
    -----------------------------
    8080
    
    - Эта процедура создала все необходимые обьекты в XML DB и запустила ЕМ
    
    - убедимся что listener начал использовать протокол "RAW" на нужном порту:
    [oracle@db12c app]$ lsnrctl status
    
    LSNRCTL for Linux: Version 12.1.0.0.2 - Production on 07-JUL-2013 22:26:06
    
    Copyright (c) 1991, 2013, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.0.2 - Production
    Start Date                07-JUL-2013 20:23:09
    Uptime                    0 days 2 hr. 2 min. 58 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/orabase/ora12c/network/admin/listener.ora
    Listener Log File         /u01/app/orabase/diag/tnslsnr/db12c/listener/alert/log.xml
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db12c.localdomain)(PORT=1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db12c.localdomain)(PORT=8080))
    (Presentation=HTTP)(Session=RAW)) -- EM Express.
    Services Summary...
    Service "CDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    Service "CDBXDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@db12c app]$
    

    Повторюсь, EM Express не является J2EE приложением, не требует Weblogic или других локальных контейнеров. Это простое и изящное продолжение DB Control'a, с добавкой дополнительных возможностей, взятых из SQL Active Reports. И всё это находится непосредственно внутри базы, использует только XML DB и не имеет внешних зависимостей.

    Откроем вебброузер и зайдём на адрес "http://db12c.localdomain:8080/em". Убедитесь что дополнения вроде NoScript, Adblock and FlashBlock не блокируют веб сайт. Зайдите под именем пользователя "sys/oracle", отметив при этом опцию "as sysdba".

    Теперь зайдите на страницу "Performance/Performance Hub" - это удачно дополняет функциональность "SQL Active Report". Будьте внимательны и проверьте лицензирование вашего сервера - EM Express использует различные EM Packs, которые должны иметь отдельную лицензию.

    Отключить EM Express также просто:

    - как пользователь sys:
    exec DBMS_XDB_CONFIG.SETHTTPPORT(0);
    
    - Проверим listener - RAW session protocol исчез.
    [oracle@db12c ~]$ lsnrctl status
    
    LSNRCTL for Linux: Version 12.1.0.0.2 - Production on 08-JUL-2013 18:13:35
    
    Copyright (c) 1991, 2013, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.0.2 - Production
    Start Date                07-JUL-2013 20:23:09
    Uptime                    0 days 2 hr. 50 min. 26 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/orabase/ora12c/network/admin/listener.ora
    Listener Log File
    /u01/app/orabase/diag/tnslsnr/db12c/listener/alert/log.xml
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db12c.localdomain)(PORT=1521)))
    Services Summary...
    Service "CDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    Service "CDBXDB" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@db12c ~]$
    

    На мой взгляд, EM Express - одно из самых удачных нововведений Oracle 12c.

    Создание "Подключаемой" базы из существующего "образца"

    Все наши действия до этого момента были бесполезны для конечного пользователя. Несмотря на обилие уже выданных команд, приложениям всё ещё негде хранить данные. Настало время создать подключаемую базу (pluggable database). Существует несколько способов создания PDB - мы будем создавать базу путём копирования структуры существующего образца ("seed") - этот образец был создан заодно с CDB.

    - Эту операцию можно повторять много раз - она позволяет быстро
    - и просто создавать новые PDB, уже подключенные к существующей CDB.
    
    - Убедитесь что вы подключены к контейнеру - CDB:
    - (также можно использовать
    - select Sys_Context('Userenv', 'Con_Name') "current container" from Dual
    - )
    
    18:17:00 SQL> select cdb from v$database;
    
    CDB
    ---
    YES
    
    1 row selected.
    
    Elapsed: 00:00:00.10
    18:20:53 SQL>
    18:20:53 SQL> select * from cdb_pdbs;
    
    PDB_ID
    ----------
    PDB_NAME
    --------------------------------------------------------------------------------------------
    DBID    CON_UID GUID                             STATUS        CREATION_SCN     CON_ID
    ---------- ---------- -------------------------------- ------------- ------------ ----------
    2
    PDB$SEED
    4043999884 4043999884 C40F9B49FC9C19E0E0430BAAE80AFF01 NORMAL             1660761          1
    
    
    1 row selected.
    
    Elapsed: 00:00:00.08
    18:21:47 SQL>
    
    18:25:37 SQL> show con_name
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    18:26:21 SQL>
    

    Из имени контейнера видно, что мы подключены к "корню" "CDB$ROOT" контейнерной базы CDB, в которой (видно из "cdb_pdbs") имеется "образец" "PDB$SEED" - именно из него мы и будем создавать новую клиентскую базу.

    - Прежде всего решим где размещать файлы данных новой базы
    18:33:32 SQL> alter system set db_create_file_dest='/u01/app/orabase/oradata' scope=both;
    
    System altered.
    
    Elapsed: 00:00:00.07
    18:33:41 SQL>
    18:44:32 SQL> create pluggable database pdb1
    18:44:40   2  admin user p1dba identified by p1dba;
    
    Pluggable database created.
    
    Elapsed: 00:01:17.89
    18:46:09 SQL>
    

    Проверим появилась ли новая база в нашем "общем" системном словаре Oracle:

    18:49:21 SQL> select * from cdb_pdbs;
    
    PDB_ID
    ----------
    PDB_NAME
    --------------------------------------------------------------------------------------------
    DBID    CON_UID GUID                             STATUS        CREATION_SCN     CON_ID
    ---------- ---------- -------------------------------- ------------- ------------ ----------
    2
    PDB$SEED
    4043999884 4043999884 C40F9B49FC9C19E0E0430BAAE80AFF01 NORMAL             1660761          1
    
    3
    PDB1
    3309215587 3309215587 D05381DB3F5F130AE043C938A8C06D91 NEW                1762184          1
    
    
    
    
    2 rows selected.
    
    Elapsed: 00:00:00.07
    18:49:27 SQL>
    

    Теперь значение GUID будет использовано для имён файлов данных этой PDB. Также заметьте разницу в значениях столбца "CON_ID" в этом запросе (из "cdb_pdbs") и в последующем (из "v$pdbs"). Значение CON_ID изменяется в зависимости от контекста так:

  • 0 - записи принадлежат "контейнеру" CDB или "монолитной" non-CDB базе
  • 1 - записи принадлежат подключаемой базе-контейнеру "CDB$ROOT"
  • другое - записи принадлежат пользовательской PDB или "PDB$SEED"
  • В процессе создания PDB появляются записи в alert log, здесь я пересоздаю PDB повторно:

    .......................... == Книга Екклезиаста == .............................
    === Глава 11, Стих 10 ===
    10 И удаляй печаль от сердца твоего, и  уклоняй  злое  от  тела  твоего,  потому
    что детство и юность - суета.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@db12c ~]$ tail -40f /u01/app/orabase/diag/rdbms/cdb/CDB/trace/alert_CDB.log
    ...
    create pluggable database pdb1
    admin user p1dba identified by *
    
    ****************************************************************
    Pluggable Database PDB1 with pdb id - 3 is created as UNUSABLE.
    If any errors are encountered before the pdb is marked as NORMAL,
    then the pdb must be dropped
    ****************************************************************
    Deleting old file#5 from file$
    Deleting old file#7 from file$
    Adding new file#10 to file$(old file#5)
    Adding new file#11 to file$(old file#7)
    Successfully created internal service pdb1 at open
    
    XDB installed.
    
    XDB initialized.
    ALTER SYSTEM: Flushing buffer cache inst=0 container=3 local
    ****************************************************************
    Post plug operations are now complete.
    Pluggable database PDB1 with pdb id - 3 is now marked as NORMAL.
    ****************************************************************
    Completed: create pluggable database pdb1
    admin user p1dba identified by *
    ...
    

    Заметьте появление "container=3" в вызове "ALTER SYSTEM". Также наличие "inst=0" наводит нас на мысль что pluggable databases работают и в RAC :-) В ОС были созданы следующие файлы и новая подключаемая база была зарегистрирована для listener как новая сетевая служба (service):

    [oracle@db12c ~]$ ls -latrh /u01/app/orabase/oradata/CDB/ \
    D05381DB3F5F130AE043C938A8C06D91/datafile/ -- Используется GUID PDB
    total 811M
    drwxr-x--- 3 oracle oinstall 4.0K Dec  8 18:44 ..
    -rw-r----- 1 oracle oinstall  21M Dec  8 18:45 o1_mf_temp_8d5w1o5n_.dbf
    drwxr-x--- 2 oracle oinstall 4.0K Dec  8 18:45 .
    -rw-r----- 1 oracle oinstall 261M Dec  8 18:46 o1_mf_system_8d5vzmrx_.dbf
    -rw-r----- 1 oracle oinstall 551M Dec  8 18:46 o1_mf_sysaux_8d5w0f44_.dbf
    [oracle@db12c ~]$
    [oracle@db12c ~]$ lsnrctl status
    ....
    Service "pdb1" has 1 instance(s).
    Instance "CDB", status READY, has 1 handler(s) for this service...
    ...
    

    Подключение к новой PDB

    Как я уже говорил, сетевые службы стали особенно важны - подключиться к PDB можно только через её service (в нашем случае "pdb1").

    - Прежде всего проверим состояние нашей PDB. ИЗ sqlplus, подключившись к CDB:
    18:49:27 SQL> select * from v$pdbs;
    
    CON_ID       DBID    CON_UID GUID        NAME        OPEN_MODE  RES
    ---------- ---------- ---------- ----------- ----------- ---------- ---
    OPEN_TIME                                    CREATE_SCN
    -------------------------------------------- ----------
    2 4043999884 4043999884 C40F9B49... PDB$SEED    READ ONLY  NO
    08-JUL-13 06.42.22.906 PM                    1660761
    
    3 3309215587 3309215587 D05381DB... PDB1        MOUNTED
    08-JUL-13 06.46.09.061 PM                    1762184
    
    
    2 rows selected.
    
    Elapsed: 00:00:00.13
    
    Наша PDB1 имеет статус "mounted", но не "open". Откроем её:
    18:53:07 SQL> show con_name
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    18:53:16 SQL> alter pluggable database pdb1 open;
    
    Pluggable database altered.
    
    Elapsed: 00:00:07.53
    18:53:34 SQL> select con_id, OPEN_MODE, name
    18:53:44   2  from v$pdbs;      -- Вновь "косяк" с именами v$ представлений,
    --  в стиле Oracle 9i :-)
    
    CON_ID OPEN_MODE  NAME
    ---------- ---------- -----------
    2 READ ONLY  PDB$SEED
    3 READ WRITE PDB1
    
    2 rows selected.
    
    Elapsed: 00:00:00.04
    18:53:48 SQL>
    

    Обратите внимание - запуск "контейнерного" экземпляра CDB открывает саму CDB но оставляет все подключаемые PDB в смонтированном, но неоткрытом состоянии. Открыть все PDB за один раз можно командой "alter pluggable database all open" - но она сработает только если вы подключены к "CDB$ROOT". Все вновь созданные PDB находятся в состоянии "mount".

    Также с введением PDB появляется новый принцип - каждое приложение должно иметь собственную подключаемую базу. Это позволяет избежать неприятностей с совпадающими именами объектов, синонимов и прочее. Кроме того логическая "изоляция" данных каждого приложения упрощает поддержку и миграцию.

    Итак, мы открыли вновь созданную подключаемую базу PDB1 - но всё это было сделано при подключении к контейнерной базе CDB. Теперь подключимся (наконец-то!) к самой PDB1.

    18:53:48 SQL> connect p1dba/p1dba@db12c/pdb1
    ERROR: ORA-01045: user P1DBA lacks CREATE SESSION privilege; logon denied
    

    Мы забыли присвоить роль "DBA" нашему "admin" пользователю в PDB1. Легко исправить - подключимся к контейнеру PDB1 но как пользователь "SYS" из контейнера CDB (поскольку единственный пользователь нашей подключаемой базы не имеет привилегий администратора и не может подсоединиться к PDB). Надеюсь понятно, почему стало так важно использование "EzConnect" - десятки новых PDB потребуют десятков изменений tnsnames ...

    - Пользователь SYS из CDB подключается к контейнеру PDB
    18:56:53 SQL> connect sys/oracle@db12c/pdb1 as sysdba
    Connected.
    18:57:08 SQL>
    18:58:53 SQL> show user
    USER is "SYS"
    18:58:56 SQL> show con_name
    
    CON_NAME
    ------------------------------
    PDB1
    18:58:59 SQL> grant dba to p1dba;
    
    Grant succeeded.
    
    Elapsed: 00:00:00.58
    18:59:35 SQL>
    - "Локальный" пользователь-администратор p1dba подключается
    - к "своему" контейнеру - как к службе базы CDB
    18:59:35 SQL> connect p1dba/p1dba@db12c/pdb1
    Connected.
    18:59:54 SQL> show user
    USER is "P1DBA"
    18:59:57 SQL> show con_name
    
    CON_NAME
    ------------------------------
    PDB1
    19:00:05 SQL>
    
    19:01:29 SQL> l
    1  select con_id, name
    2* from v$datafile
    19:01:32 SQL> /.
    
    CON_ID NAME
    ---------- ------------------------------------------------------------------------------
    Важно -- 0 /u01/app/orabase/oradata/CDB/undotbs01.dbf
    3 /u01/app/orabase/oradata/CDB/D05381DB.../datafile/o1_mf_system_8d5vzmrx_.dbf
    3 /u01/app/orabase/oradata/CDB/D05381DB.../datafile/o1_mf_sysaux_8d5w0f44_.dbf
    
    3 rows selected.
    
    Elapsed: 00:00:00.02
    19:01:32 SQL>
    

    Заметим, что "контейнерная" база CDB предоставляет "общий" tablespace UNDO для всех "подключаемых" баз PDB, но при этом каждая из PDB имеет свою собственную "копию" SYSTEM, SYSAUX и TEMP.

    Также запомним что "локальный" администратор подключаемой базы PDB не может подсоединиться к "корню" контейнерной базы CDB:

    19:04:12 SQL> connect p1dba/p1dba@db12c/CDB
    ERROR:
    ORA-01017: invalid username/password; logon denied
    
    Warning: You are no longer connected to ORACLE.
    19:04:18 SQL>
    

    Работа с подключаемой базой

    Проверить параметры одной PDB можно так.

    19:07:44 SQL> l
    1  select con_id, NAME, VALUE, ISPDB_MODIFIABLE
    2  from v$parameter
    3* order by con_id, NAME
    19:08:09 SQL>
    

    Кроме того, пользователь "SYS" из контейнерной базы CDB, но подключенный к PDB, не сможет изменить "системную" часть "разделённого" словаря Oracle. Этот же пользователь сможет выполнить эту же самую операцию, но подключившись к контейнеру "CDB$ROOT". Это сделано в качестве попытки защитить ДБА от самих себя?

    12:06:35 SQL> show user con_name
    USER is "SYS"
    
    CON_NAME
    ------------------------------
    PDB1
    12:06:50 SQL> drop view dba_users;
    drop view dba_users
    *
    ERROR at line 1:
    ORA-65040: operation not allowed from within a pluggable database
    

    Возьмём на заметку, что единственно возможный способ установления сессии, имеющей PDB в качестве начального контейнера - это указание имени сетевой службы (service) в строке подключения. Сие означает, что текущий контейнер можно изменять в ходе работы с уже подключенной сессией.

    Также "разделённый" словарь Oracle означает что при обновлении (upgrade) Oracle Home нам понадобится запускать скрипт только на CDB. Множество мелких PDB не потребуют обновлений, поскольку PDB могут "видеть" (но не изменять!) уже обновлённые объекты из "общей" части системного словаря CDB. Внутренние механизмы под названием "metadata link" и "object link" позволяют всем PDB видеть "общую" часть стандартных объектов, поставляемых Ораклом в составе "database dictionary".

    Демонстрируя смену текущего контейнера, попытаюсь ввести некие ограничения на объём дискового пространства, потребляемого одной PDB. Предположим, что моя PDB должна "укладываться" со всеми её tablespaces (users, sys and temp) в рамки 2 Гб и при этом не потреблять более 0.8 Гб "общего" TEMP tablespace, предоставляемого CDB.

    - Сейчас я подключен как SYS в CDB$ROOT
    13:05:04 SQL> alter session set container=pdb1
    13:05:34   2  ; -- теперь я SYS в PDB1
    
    Session altered.
    
    Elapsed: 00:00:00.36
    13:05:35 SQL> show user con_name
    USER is "SYS"
    
    CON_NAME
    ------------------------------
    PDB1
    13:05:49 SQL> alter pluggable database storage(maxsize 2g);
    
    Pluggable database altered.
    
    Elapsed: 00:00:00.15
    13:05:59 SQL> alter pluggable database storage(max_shared_temp_size 800m);
    
    Pluggable database altered.
    
    Elapsed: 00:00:00.06
    13:06:22 SQL>
    

    Что бы это значило?

    Ну что, дорогой читатель, с вас хватило "новинок виртуализации"? :-) Если всё ещё нет - подумайте о PDB на платформе RAC ...

    На мой взгляд, вместе со значительным усложнением продукта, подключаемые pluggable databases привносят целый ряд важных положительных изменений:

  • Быстрое и эффективное "клонирование" баз данных для новых приложений, а также для тестирования и разработки. На мой взгляд, механизм PDB делает всю концепцию "storage snapshots" просто ненужной
  • Быстрый "перенос" существующих баз данных (путём отключения- копирования- подключения) на новую платформу или систему с новой версией Oracle
  • Упрощение и значительное ускорение процесса обновления версии продукта - даже для десятков баз данных приложений обновление требуется всего единожды - для контейнерной базы CDB
  • Разделение обязанностей администраторов баз данных приложений и самих данных - имея доступ только к одной PDB, администратор не может изменять или видеть данные в других контейнерах
  • Значительное уменьшение числа необходимых экземпляров Oracle - а значит, удешевление лицензирования путём более эффективного использования CPU. Такое же число баз данных потребует значительно меньше процессов на уровне ОС - всеми фоновыми процессами экземпляра владеет CDB и предоставляет их для совместного использования всеми PDB
  • "Разделённый" системный словарь Oracle позволяет хранить "клиентскую" часть метаданных в самой PDB, перенося их из одной системы в другую вместе с данными пользователя
  • Все PDB защищены через Data Guard и RAC на уровне CDB, при этом резервное копирование и восстановление может быть выполнено индивидуально для каждой PDB, независимо от остальных.
  • В общем, похоже нас ожидают интересные времена и Oracle не даёт нам скучать :-)

    Спасибо что зашли,

    Будьте благословенны!
    Денис

    28 Июня 2013 года.