Šoreiz apskatīsim Oracle 12c jauninājumus. Oracle Database 12c tika laists tautās 2013. gada 1. jūlijā un tautās laidēji domā, ka Oracle 12c ir nākošas paaudzes datubāze[1]. Bet principā izskatās, kas tas vienkārši nozīmē, ka datubāzei ir labāka saderība ar makoņskaitļošanas iespējām. Tagad šo mazulīti varēs iesprausts mākoni.

Iespraužamās datubāzes

Solis tuvāk mākonim, tagad mums ir plugable database aka PDB. Iedomāsimies, ka mums ir liela kompānija un kompānijai ir daudz projektu. Parasti katram projektam ir pa kādai testa videi un varbūt pat vienota izstrādes vide un citas dīvainas vides. Šeit rodas problēma parasti katra vide sliktākajā gadījumā ir uz dažādiem dzelžiem vai arī uz viena dzelža ar OS līmeņa vizualizāciju. Katrai oracle instancei ir atvēlēta sava atmiņas katrā vboxi, līdz ar to daudz CPU un RAM aiziet lai uzturētu tikai instanci. Oracle 12c steidz palīgā un piedāvā Multitenant Architecture, kas šo problēmu atrisina ar augstāka līmeņa iebūvētu vizualizāciju. Ir viena instance kurā tiek iespraustas datubāzes ar visām atbilstoši nepieciešamajām konfigurācijām. Līdz ar to teorētiski varētu uz viena dzelža uzmest instanci un tajā saspraust visas datubāzes, kas agrāk bija izmētātas apkārt. Domāju, ka tagad DB varētu uzmest uz fleškas (bez lielām pūlēm) un aiznest kādam (kāds prieks taisīt testa vidi no produkcijas vides). Un pēc šī, DBA lēkā kā mazs bērns Ziemassvētku rītā.

Ar show con_name mēs varam pateikt kurā datubāzē esam. Lietotāji tagad iekš oracle skaitās common, kas var piekļūt vairākām iespraužamām db (pieder CDB$ROOT) un local, kas tiek taisīts kādā noteiktā datubāzē. Visiem common lietotājiem nosaukums sākas ar c##.

-- taisām common lietotāju
create user c##resnais identified by parole;

-- pārslēdzamies uz iespraužamo datubāzi, man viņu sauc 'vboxpdb'
alter session set container=vboxpdb;
-- show con_name; -- tagad rādīs VBOXPDB 

-- izveidojam lietotāju
create user jza identified by parole;

Jautājums, kā pieslēgties pie lokālā lietotāja? Visas iespraužamas db ir savs SERVICE_NAME, līdz ar to slēdzoties klāt jānorāda attiecīgais SERVICE_NAME (vismaz tā pirmajā brīdi man izskatās un strādā). Šī funkcionalitāte tiešām ir interesanta un varētu būt gana noderīga. Te gan var stāstīt un stāsti, bet nu labi lasiet paši.

Datu tipu izmaiņas

Nopietnā izmaiņas skar VARCHAR2, NVARCHAR2, RAW kuriem maksimālais pieļaujamais izmērs ir palielināti līdz veseliem 32767 baitiem. To var izdarīt mainīto inicializācijas parametru MAX_STRING_SIZE no STANDART pārliekot uz EXTENDED.

Takā mums ir CDB$ROOT un parējās PDB tad ir ar šo fīču jābūt akurātiem. Ja nomainīs CDB$ROOT tad būs jānomaina arī visām PDB un vienai PDB$SEED, bet okey tad mainām uz EXTENDED šādi:

alter system set max_string_size=EXTENDED scope=spfile;
shutdown immediate;
startup upgrade
@?/rdbms/admin/utl32k.sql
shutdown immediate;
startup

ja PDB$SEED bļauj, ka nav migrēts:

-- ORA-14696: MAX_STRING_SIZE migration is incomplete for pluggable database PDB$SEED
-- startējam DB vismaz piejūdzot PDB, jo pilnībā startēt nesanāk
startup mount
alter session set container=PDB$SEED;
alter database open migrate;
alter system set max_string_size = EXTENDED;
@?/rdbms/admin/utl32k.sql
-- pēc šī db vajadzētu varēt startēties

man gan vajadzēja arī atvērt datubāzi pēc vboxpdb (manas PDB) migrēšanas:

alter session set container = vboxpdb;
alter database open;

bet pēc tam es varēju laimīgs uzcelt šo:

create table resna_berta (
    name varchar2(32000)
);

fetch first rows, offset

Tad nu beidzot sakarīgs veids kā atgriezt noteiktu ierakstu skaitu pēc sakārtošanas - FETCH FIRST :x ROWS ONLY. Šim ir arī nopietns pielietojums - pagination ftw! Tagad pa pirkstiem visiem, kas lieto rownum, lai limitētu atgriežamo ierakstu kopu.

-- top 25 krutakie pipari
SELECT * FROM krutakie_pipari_ciema ORDER BY krutums DESC FETCH FIRST 25 ROWS ONLY;
SELECT * FROM krutakie_pipari_ciema ORDER BY krutums DESC OFFSET 25 ROWS FETCH FIRST 25 ROWS ONLY;

Lasīt vairāk par šo maģisko lietu

No Sequence Auto Increment Primary Key

Te būs divi jaunumi DEFAULT Values for Table Columns un Identity Columns.

Beidzot ir ieviesies automātiskās inkrementācijas primārās atslēgas. Vairs nav nepieciešams definēt atsevišķu sekvenci no kuras iegūt unikālu kārtējo identifikatoru. MySQL tas jau bija labu laiku atpakaļ un PostgreSQL ir kaut kas līdzīgs ar serial tabulas būvēšanas laikā.

Tad nu mēs tagad varām specificēt iekš DEFAULT sekvences iesaukumu

create sequence sekvence;
create table tabula (
    id          number default sekvence.nextval,
    description varchar2(30)
);
insert into tabula (description) values('look maa no sequence passed!');
insert into tabula (id, description) values (1337, 'booya');

Un otra pieeja ir automātiska primāra lauka veidošana:

create table tabula2 (
  id          number generated always as identity,
  description varchar2(30)
);

insert into tabula2 (description) values('look maa no sequence at all!');
-- šadā datubālā nevar norādīt savu `ID` vērtību.
insert into tabula2 (id, description) values(123, 'grr cant pass my id value');
-- ORA-32795: cannot insert into a generated always identity column

Man gan ir sajūta, ka 1. variants ir ne pārāk labs stils, jo sekvence jau nezin, ka tur saspraustas iekšā savas ID vērtības, bet akurāti lietojot viss ir labs. Bet 2. variants ir baigi interesanta koncepcija, būtu interesanti paskatīties kā šitas uzvestos sistēmu pēc 5 gadiem, kad praktikanti būs apsmērējuši datubāzi.

In Database Row Archiving

Būsim reāli neviens datus datubāzes nedzēš, pat pēc tam kad tas ir paprasīts, piemēram, dzēšos profilu no sistēmas. Parasti ierakstiem tiek uzlikta kāda pazīme, kas nosaka, ka ieraksts ir dzēsts vai prātīgākās sistēmas tas tiek aizsūtīts un noliktavu. Oracle steidz palīgā un tagad ir iespējams ieslēgt rindu arhivēšanu. Uzmūķējam tabulas atbalstu ar

create table sensitiva_informacija (
    id number primary key,
    fantazijas varchar(1024)
) row archival;
-- vai, ja tabula jau ir izveidota
alter table sensitiva_informacija row archival;

Tad mums tabulai pieliekas viltīga kolonna ora_archive_state, kas ir kaut kāds “varchar” tips, kur 0 - nav arhīvā, 1 - ir arhīvā. Ierakstu loģiski dzēstu vai aktivizētu:

-- loģiski dzēšam ierakstu (marķējam kā arhīvētu)
update sensitiva_informacija set ora_archive_state = '1';
-- atdzēšam ierakstu
update sensitiva_informacija set ora_archive_state = '0';

Un pēc loģiskās dzēšanas, mēs neredzēsim nevienu ierakstu tabulā, jo viņi visi ir loģiski dzēsti. Lai ieraudzītu ierakstus vajag nedaudz nepraktisku pieeju.

-- iesledzam
alter session set row archival visibility = all;
--izslēdzam
alter session set row archival visibility = active;

Un ja mēs ieslēdzam tad tagad pieprasījums atgriezīs arī visas neaktīvās rindas - kruta. Diemžēl PRIMARY KEY tomēr neignorēs arhivētos ierakstus un ar DUP_VAL_ON_INDEX var dabūt pa seju. Ne viss ir tik skaits kā gribētos, ja šo kolonnu neliks indeksos tad var gadīties redzēt table scan kur parasti neredzējām (Šeit kaut kur beigās tas bija pieminēts).

Kolonnu redzamība

Šeit vēl ātri pieminēšu līdzīgu jaunu funkciju par neredzamajām kolonnām. Tad tagad mēs varam taisīt neredzamas kolonnas. Tas lai DBA varētu troļļot DEV pievienojot neredzamu NOT NULL kolonnu :). Protams NOT NULL exception pateiks kura kolonna vainīga, bet tāpat būtu jautri.

create table users (
    id      number generated always as identity,
    login   varchar2(100),
    trollis number invisible not null 
);

-- atgriež tikai visible kolonnas
select * from users;
-- atgriež visas norādītās, ja tādas ir, vienalga redzama vai nē
select id, login, trollis from users;
-- beidzam troļļot
alter table users modify(trollis visible);

ENABLE_DDL_LOGGING

Ieslēdzot šo fīču tiek veikta visu DDL auditēšana. Lai ieslēgtu šo maģisko fīču (jābūt gana resnām tiesībām uz šo pasākumu):

ALTER SYSTEM SET ENABLE_DDL_LOGGING=TRUE;
ALTER SESSION SET ENABLE_DDL_LOGGING=TRUE;

Ievērojiet, ka audits var būt gan sesijas līmenī, gan sistēmas. Kad esam ieslēguši uztaisām pāris CREATE, DROP, ALTER un ejam skatīties uz /oracle/base/diag/rdbms/vboxdb/vboxdb/log un cat *.log tur visas komandas būs pierakstītas, tad ejam turpat uz ./ddl kur cat *.xml atgriezīs detalizētāku dokumentu ar visām IP adresēm.

Bet tā šī fīča izskatās kaut kas līdzīgs, ko es savulaik taisīju https://github.com/jzaikovs/plsql-backup priekš cilvēkiem kuriem nav root access. Nez kāpēc man liekas, ka mans risinājums ir nedaudz ērtāks, jo audits glabājas tabulā.

Vairāki indeksi uz vienas kolonnas.

Nu vēl ir tāda jauna fīča kā vairāki dažāda tipa indeksi uz vienu kolonnu, piemēram, B-tree un bitmap indeks. Protams pieprasījuma laikā var tikai vienu no indeksiem izmantot. Es domāju šī iespēja ir vairāk paredzēta, lai vieglāk būtu kaut ko pārbūvēt, lai nebūtu jadropē indekss kamēr uzbūvē jaunu varbūt noderīgi testēšana un optimizācijā.

TL;DR;

Oraklā nākušas klāt vēl daudz jaunu lietu, vismaz aprakstīju tās, kas vairāk likās interesantas. Te būs manuālis no oracle puses par jaunajām fīčām