Nyissa meg az orákulum alrészét az orosz nyelv fordításában egy másik táblaterület (racle) eloszlásban
A disztribúciós kiadásokat körülbelül 6000 ember olvassa le, és a webhelyet naponta 100 ember látogatja meg, főleg Oroszországból és Ukrajnából. Bár a keresési kérelmek és a "külföldi" látogatók szerint sok van. A legfontosabb, hogy közel száz százalékos célközönség: alkalmazást fejlesztők, adatbázis-adminisztrátorok és általában mindenki, aki érdekes az Oracle technológiák és adatbázisok egyik vagy másik módon.
Várom a javaslatait.
A módosítási táblázat végrehajtása. költözik a táblaterületet?
Meg tudná tisztázni, hogyan valósul meg az alter asztalkezelő t_name movetable térképe. Ezt online (online) és naplózás nélkül (a nologging opcióval) lehet elvégezni. De hogyan változik az adatok egy táblaterületről a másikra? Szükség van-e a kiszolgálónak beillesztési utasításokat kell készítenie, és adatokat kell átadnia a puffer-gyorsítótáron keresztül, mint a szokásos beillesztés vagy valamilyen közvetlen beillesztés?
A következő problémába ütköztem, amelyhez gyors megoldást szeretnék találni:
Van egy 2,5 GB-os táblázat. Szeretném áthelyezni a táblaterületről a-b-re. Minden a és b fájl szalagokra oszlik, és különböző lemezeken található. Ez a táblázat független. Úgy értem, nincsenek kiváltó okok és integritáskorlátozások.
Az első út:
A második út:
A második út gyorsabban dolgozik, mint az első, közvetlen betét használatával?
Melyik összehasonlítás gyorsabban működik, és miért? Az első módszer lehetővé teszi a párhuzamosságot? Jelentős különbség van-e a visszagörgetési szegmens és a válogatási terület használatában?
Tom Kite válasza
Az online módban végzett mozgás művelet csak egy index szervezett tábla (IOT) esetén végezhető el, de nem egy rendszeres táblázathoz, amelyet gyűjteményként szerveznek.
Ennek értelme van:
Az alter asztali operátor t mozgatja a táblaterületet b nologging; áthelyezi az asztalt (a naplózással, ha telepítve van), majd állítsa be a nologging attribútumot.
Mozgás végrehajtása esetén az SQL táblát nem használják a költöztetéshez. Nincs beillesztés.
Ez az átvitel jó, mert minden index, kiváltság, stb. maradnak. Az átruházást követően csak az indexeket kell újraépíteni (de nem újra létrehozni).
A második módszer gyorsabban működhet, ha párhuzamos betéteket használ (győződjön meg róla, hogy az optimalizáló a / * + helyett a / * helyett használja.) De ehhez keményebben kell dolgoznia. Egy 2,5 GB-os tábla esetében nem biztos, hogy megéri-e - több időbe telhet a migrációs eljárás kialakítása, mint a migrálás.
Mozgassa a táblaterületet a nologging opcióval
Az Oracle Enterprise Edition 8.1.7.2 verziójában a következőket teszem:
Nem tudom, hogy naplózással, vagy anélkül működik-e, de miután az asztalt áthelyeztük a nologging módba, nem fordítunk le. És az Oracle 8.1.6 verziójában az eredmény más is?
Tom Kite válasza
Nos, a naplózási / nologging paraméternek két jelentése van a kontextustól függően.
Abban a kontextusban, ahol fent használtuk, arra kértük a portot, hogy naplózás nélkül végezzen, ha az objektum lehetővé teszi a naplózás nélküli munkát.
Ha végrehajtja az "alter table t nologging" kifejezést, a naplózás / nologging attribútum megváltozik.
Mint mindig, megérteni ez segít egy példát. Létrehozzuk a táblázatot, áthelyezzük és megnézzük, hogy a különböző átviteli módok használatával mennyi re-végrehajtási adat keletkezik:
Tehát van egy tesztasztal. Eredetileg az UTILS táblaterületen készült, és:
a naplózási mód IGEN (a naplózás be van állítva). Most nézzük meg, hogy hány újraindítási adat már létrehozta a munkamenetet, és tárolja ezt az értéket a helyettesített V változóban
És most teljesítsük a parancsot. Ezt a parancsot az orosz nyelven lehet megfogalmazni a következőképpen: "Mozgassa a T táblát a felhasználói táblaterületre, és útközben, ha lehetséges, NÉGYSZOLGALÁS NÉLKÜL". Különösen ez a parancs NEM mondja: "Mozgassa az asztalt és változtassa meg a naplózási módot".
Tehát úgy látjuk, hogy körülbelül 4 MB újraindítási adat keletkezett - úgy tűnik, hogy az esemény ténylegesen be van jelentkezve. Ezt a naplózási mód megváltoztatásával lehet megerősíteni:
és újra mozgatva ezt a táblázatot:
Most csak 26 KB-os újraindítási adatokat generáltunk - ez elég ahhoz, hogy regisztrálja az adatszótár változásait, de az átruházott blokkok módosításait. Az objektumot az összes módosítás naplózása nélkül mozgattuk.
Valójában megtudtuk, hogy egy objektumot egyidejűleg nem lehet átvinni és más módon megváltoztatni (ezek a lehetőségek egymást kizáróak - Ön vagy hordozza az objektumot, vagy megváltoztatja azt más módon - egyszerre nem teheti meg)
Helyreállíthatom a műveletet, ha a munkát használják?
Ha az adatbázis összeomlik, és vissza kell állítania, miután a költöztetést áthelyezte, visszaállíthatja ezt a műveletet. És a helyreállítás után, az asztal az eredeti táblaterületen?
Tom Kite válasza
Ez a kudarc okaitól és más körülményektől függ.
A noarchivelog módban futó adatbázisban. mivel csak a hideg üzemmódban végrehajtott utolsó teljes biztonsági mentés idején lehet visszaállítani, ha a média nem sikerül, akkor ez a kérdés egyáltalán nem releváns (tehát archiválási módban kell dolgozni!).
Mit jelent "asztal, határolva, mint egy halom"?
Tom Kite válasza
A táblák gyűjteményként szerveződnek
A gyűjteményként szervezett táblákat az alkalmazások 99 esetben (ha nem több) százalékban használják, bár ez idővel változhat az index által szervezett táblák intenzívebb felhasználása miatt, mivel további táblázatokat hozhat létre ilyen táblázatok használatával. A CREATE TABLE utasítás végrehajtásakor alapértelmezés szerint létrehoz egy gyűjteményként létrehozott táblát. Ha egy másik típusú táblát szeretne létrehozni, akkor ezt kifejezetten meg kell adnia a CREATE utasításban.
A "Heap" egy klasszikus adatstruktúra, amelyet a programozási tanfolyamokon tanulmányoztak. Ez lényegében nagy terület a lemezen vagy a memóriában (adatbázistáblázat esetén, természetesen egy lemezen), önkényesen. Az adatokat akkor helyezzük el, ha van egy helyük számukra, és nem egy bizonyos sorrendben. Sokan úgy vélik, hogy az adatokat a táblázatban ugyanabban a sorrendben kapják meg, mint ott rögzítették, de ez nem garantált, ha kupacként szervezik. Valójában a hátramenet garantált: a vonalak egy teljesen kiszámíthatatlan sorrendben térnek vissza. Ezt nagyon könnyű bizonyítani. Létre kell hoznunk egy ilyen táblát, hogy az adatbázisban a blokkban egy teljes sort helyezzenek el (8 KB-os blokkot használok). Nem szükséges egy példányt létrehozni egy blokk egyetlen sorával. Csak az események előrejelezhető sorrendjét szeretném bemutatni. Ezt a viselkedést minden méretű táblázatban és minden blokk méretű adatbázisban meg fogják figyelni:
.
A rendelkezésre álló ülések listája
Áthelyeztem az asztalokat egy új, helyileg kezelt táblaterületre, majd elemeztem az asztalokat. Nem tudom, miért van az oszlop NUM_FREELIST_BLOCKS = 0 a dba_tables-ban. Minden táblában vannak használatlan blokkok, és egy blokkban csak néhány sor.
Tom Kite válasza
Mivel a blokkok, amelyekben SOHA nem voltak adatok, magasabbak lesznek a maximális jelszintnél, és nem az elérhető helyek listáján.
A rendelkezésre álló helyek listáján a blokkok használat után esnek - ha még soha nem használták őket, a rendelkezésre álló helyek listájában nem lesz.
Közvetlenül az újra létrehozás után, mint az Ön esetében, csak természetes, hogy a rendelkezésre álló helyek listája kicsi, ha egyáltalán van. Ez egyszerűen azt jelenti, hogy minden létező adatblokkot "csomagolt" - nem tudnak több sorba beszúrni. Az adatok módosítása / törlése után néhány blokk jelenik meg az elérhető helyek listájában.
Tekintsük a következő példát (a táblázattér-rendszert a szótár kezeli, és a felhasználók asztalát helyileg kezelik):
Hatalmasan csomagolt asztal - a rendelkezésre álló helyek listáján nincsenek blokkok.
És most - van; A rendelkezésre álló helyek listájához bizonyos sorok törlésével blokkokat adtunk.
Most már nincsenek ott - minden szabad blokk meghaladja a maximális jelszintet (HWM), és nem a rendelkezésre álló helyek listáján.
de ismét megjelenik - a tábla már nem "csomagolt", mivel a webhely egy részét törölték
A táblák átadása a 7.3.4 párhuzamos kiszolgálóban
Az Oracle 7.3.4 párhuzamos kiszolgálót az NCR SVR4-en (nem formattált lemezeken) használjuk. A táblázatok másik táblaterületekre történő áthelyezéséhez használt második megközelítést is használtam, mivel a 7.3.4-es verzióban az alter table move tablespace operátor. Ezt tettem:
Ezután ismét létrehoztam az orgfoo asztal indexeit. Szeretném tudni:
a) Ez jó megoldás a 7.3.4-es verzióhoz? Megtaláltuk a megoldást abban a helyszínen, ahol ajánlott:
- Felhasználói séma bemutatása
- Az összes felhasználói objektum törlése
- Válassza ki a jogosultsággal korlátlan tabspace-t a felhasználótól
- Módosítsa az alapértelmezett táblaterületet a felhasználó számára
- Felhasználói adatok importálása
De csak egy nagy asztalt akarok átvinni, nem minden táblát. Miután törölte az összes objektumot, hogyan adhatok be adatokat két különböző táblaterületre?
b) Miután átnevezte a táblát, újra kell létrehoznia az összes nézetet az alkalmazás futtatása előtt?
c) Az orgfoo táblázathoz (az EHISTDAT táblaterületen) 250 MB-t különítenek el. Ezt az információt a dba_data_files-ból és a dba_free_space-ből kaptam az orgfoo táblázat törlése előtt.
És ha megkérdezi, hogy létrehozta a tempfoo táblát az EKATSDAT-ban és eltávolította az orgfoo táblát. A következő eredményt kaptam:
A dba_extents nézetben a kiterjesztések és blokkok száma is eltérő. Az EHISTDAT táblaterületen 250 MB-ot szabadítottak fel, és a táblaterületben nem 250, hanem csak 110 MB volt. Meg tudná magyarázni ezt? Fontosnak tartja ezeket a lépéseket a lemezterület megtakarításához?
Tom Kite válasza
A módszered elég elfogadható. Kiválaszthatja a külön táblákat, de nem az egész rendszert - ez is megfelelő, de a módszered is jól működik (ha csak újra létrehoz minden korlátozást, triggeret, jogosultságot stb.), Mindez az EXP segédprogram automatikusan történik).
Az asztal átnevezése után nem kell semmit tenni. Saját ábrázolásokat fognak végezni, valamint a tárolt eljárásokat.
Ami a különbségeket illeti a "méretekben" - az újonnan létrehozott asztal új "csomagolt". Ennek eredményeképpen lehet "kevésbé". De mi van a "helytakarékossági hasznossággal" - nem hiszem. Néhány hét / hónap után a tábla vissza fog térni a korábbi méretéhez. Ez olyan, mintha egy diétán ülne - a súly kissé csökken, de a végén ismét "kényelmes" lesz. A táblák rendszeres átszervezése:
a) nem tűnik szükségesnek
b) Nem ajánlom (gyakran a "palacsinta, néhány adat elveszett" hiba miatt az átszervezés során)
c) a lemezterület "ment" néhány napra, és idővel a méret ismét nő az előző stabil szinten.
Egy példa sikertelen, amikor asztalt helyez el a nologging opcióval
Mi történik, ha a példány sikertelenül érkezik a táblázat áttelepítése során? Nem fogjuk elveszteni az adatokat? Nem veszélyes?
Tom Kite válasza
Nem, a munkamegosztás csak a MASK helyreállítását érinti, de nem egy példányi hiba után.
Amikor egy asztalt helyez el a nologging opcióval, a táblázat az állandó szegmensből átmásolódik a TIME szegmensre. A cselekvés legvégén az ideiglenes szegmens állandóvá alakul - akkor a példány valódi tábla lesz.
Ha a példány sikertelen az áttérés során, a SMON folyamat egyszerűen törli az átmeneti szegmenst, és minden úgy fog kinézni, mintha egyáltalán nem érintenénk az asztalhoz (az állandó szegmens a helyén marad).
Ha a példány sikertelen az áttérés után, minden rendben van, mert az adatokat közvetlenül a lemezre írták, és a példány visszaállításakor nem kell visszaállítani.
Ha az adatok átviteli részének megváltoztatása után megváltozik a változás, és hiba történt - minden rendben van, mert ezeknek a változásoknak az újrafuttatására vonatkozó adatok rendelkezésre állnak és visszaállíthatók.
Ha az átvitel és a biztonsági másolatok feltöltése után, amelyekre a cselekvés hatással volt, a DISK DISC előfordul - akkor igen, "problémák vannak". Ezért van a termelési környezetben indokolt az a lehetőség, hogy NE használja, és ha használja, akkor:
- először készítsen biztonsági mentést az objektumokról;
- cselekvést végez naplózás nélkül;
- készítsen biztonsági másolatot az objektumokról.
Szóval, a probléma a hiba a példány nem merül fel egyáltalán!
Tom Kite válasza
Az YMD utasításokat csak akkor hajthatja végre, ha a művelet "online" -en történik (módosítsa az online index újratelepítését, például módosítsa az asztal online mozgását - de csak az index által szervezett táblák esetén).
Az Oracle9i-ben létezik egy dbms_redefinition nevű csomag, amellyel az online objektumok többségét újra létrehozza (ami lehetővé teszi az NMD-operátorok végrehajtását az átállítás során).
Láttam a példáját egy asztal mozgatására. Ebben a 4 MB-os újrafuttatási adat helyett (ha a naplózást engedélyezték a migráció során), csak 26 KB-t generált.
Megpróbáltam ugyanezt tenni, de nem láttam a különbséget. El tudná mondani, mit csinálok rosszul. Itt vannak az eredményei:
Amint látja, amikor az asztalt naplózta, 54320 bájt újraindítási adatok keletkeztek, 53908 bájtban naplózás nélkül. Még többet 412 byte.
Tom Kite válasza
Nem dolgozik a könyvtárban.
Ebben a módban nem szükséges újratöltési adatokat generálni ehhez a művelethez - ezek nem generálódnak, függetlenül a naplózási / naplózási beállításoktól.
Párhuzamosítás?
Tehát, ha "asztalra" kell helyezni a táblát (pl. Egy, a helyileg kezelt szótárból), az INSERT / * + APPEND * / gyorsabb lesz. Mozgassa az asztalt a körbe. ahelyett, hogy a mozgást használná (a nologging opcióval)?
És mi a helyzet az Oracle 8.1.6 STANDARD párhuzamosításával? Használhatok valamit:
A csapat működik, de nem tudom ellenőrizni, hogy van-e párhuzamos végrehajtás.
Tájékoztasson, csak a teljesítmény szempontjából, ami jobb - INSERT és APPEND munkával vagy áthelyezése.
Tom Kite válasza
A párhuzamosítás csak az EE és a PE esetén lehetséges. Lásd a dokumentációt
Tehát SE-ben a párhuzamosság nem áll rendelkezésre.
De miért gondolja, hogy a beillesztés / * + append * / jobbnak kell lennie?
Egyszerűen áthelyezném a T táblát egy nologging módra, és átadnám:
Ez könnyebb, mint a beillesztés. miközben nem elveszti a kiváltságokat és indexeket.
(Ellenőrizze, hogy az akció párhuzamos-e a lekérdezés v $ px_processes végrehajtásával a művelet végrehajtása során)
Mindkét módszert teszteltem, de nem az SQL * Plus környezetben, ezért sajnálom, hogy nem tudom csak kivágni és beilleszteni a "teljes igazságot".
Két asztalteret hoztam létre. Készítettem egy táblázatot a dba_objects alapján és megdupláztam, amíg meg nem találtam
1,8 millió vonal.
350 MB, blokk mérete 16 KB.
Aztán felhelyeztem az asztalt a nodalizálási módba (párhuzamosság nélkül).
A tesztgép kétprocesszoros, az Oracle 8.1.6 EE és a hagyományos lemezek (RAID nélkül). A vizsgálat során minden vizsgálatot legalább kétszer végeztünk:
Szükség esetén ugyanazokat a teszteket ismételjem meg az SQL * Plus környezetben, és másolom az eredményeket.
Tehát, miért helyezi be a * / append * / futás gyorsabb, mint mozgatni?
Az újrafutási adatok 200-350 kB-t generáltak.
Tom Kite válasza
Azt mondanám, hogy a 137 és 125 másodperc közötti különbség (teljes leadási idő) nem jelentős. 12 másodpercig bármit, amit nem mondanak - különösen a számítógépen, amely más műveleteket végez.
De ahogy a teszted azt mutatja, a párhuzamos asztal párhuzamos 2-es munkája 2-szer gyorsabb (az első párhuzamossági kísérlet lassabban tud lassulni, mivel szükséges volt elindítani a PQ-folyamatokat - és mivel a 4 folyamat kezdete olyan sok időt vett igénybe, ütközések a forrás vagy a céllemez elérésekor).
Nem erre gondolnám, hogy a beszúrási munkák gyorsabban működnek. Azt mondanám, hogy sokkal bonyolultabb, kevésbé kényelmes és általában rossz.
Érdekes módon, mivel a táblát áthelyezték, az indexek érvénytelenek lettek, és újra kell építeni őket - és hogyan épül fel az index? A táblázatban az új értékek rowid (úgy gondolom) vagy a meglévő index (rowid, amelyben már nem használható).
Tom Kite válasza
Az asztalra kell hivatkoznia, hogy megkapja a rowid értékeket.
A probléma eredeti megbeszélése itt található.
A legjobb vágyakkal,