"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу
Установка 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 Я есмь дверь: кто войдет Мною, тот спасется, и войдет, и выйдет, и пажить
найдет.
Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.
Словно радуга после дождя, всегда приходящая вместе с теплыми лучами солнца и пением птиц, Слово Божие всегда прямо перед нами - только повернись лицом к свету, открой Библию, прочти чудесные строки - и вот Он, Спаситель Иисус Христос, прямо перед вами. Господь всегда приходит к нам в светлых видениях и мыслях, явно принося милость благодать и прощение для тех, кто захочет услышать.
Но как же часто мы с вами как будто специально отворачиваемся от Приходящего к нам дверями нашей души пастыря и блуждаем по тёмным закоулкам наших сердец, ища мнимых благ, утешающих самолюбие и жадность, но губящих душу! И ведь слышим же голос Иисуса, зовущий нас за Ним, и ведь знает сердце наше голос этот - и так и рвётся к Нему навстречу. Ан нет, вновь опускаем очи наши долу и смотрим пристально под ноги, надеясь найти золотой слиток. Но всё чаще находим лишь объедки после чьего-то грешного застолья ... А ведь всего-то и нужно, что поднять глаза, дать душе рвануть вверх - именно там спасение, пажить с достатком, необходимым для спокойной счастливой независтливой жизни, и вход и выход ...
Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.
Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.
На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.
Вернёмся к нашим техническим деталям.
Заметка состоит из нескольких небольших частей, каждая из которых помогает составить представление о ключевых новшествах:
В 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" уже не может помочь во всех ситуациях. Теперь все, включая ДБА, должны подключаться через имя сетевой службы, одним из следующих способов:
При этом в первом случае мы используем уже ставший стандартом 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):
Начало "прелестей" виртуализации ... таким образом, скрипт "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 изменяется в зависимости от контекста так:
В процессе создания 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 привносят целый ряд важных положительных изменений:
В общем, похоже нас ожидают интересные времена и Oracle не даёт нам скучать :-)
Спасибо что зашли,
Будьте благословенны!
Денис
28 Июня 2013 года.