Skip to content

Prenos podatkov ​

Prenos podatkov kopira tabele, poglede, procedure in funkcije iz ene baze v drugo — tudi med različnimi pogoni. Iz MySQL v PostgreSQL, iz SQLite v SQL Server, iz produkcije v lokalno kopijo.

Odprete ga prek Orodja → Prenos podatkov ali z desnim klikom na bazo in izbiro Prenos podatkov.

Čarovnik ​

1. Vir in cilj ​

Na vsaki strani izberite povezavo in bazo. NabuSQL za obe prikaže vrsto povezave, ime, gostitelja, vrata in različico strežnika, da lahko potrdite, da ciljate tja, kamor mislite.

2. Izbira objektov ​

Drevo objektov vse združi v Tabele, Pogledi in Funkcije / procedure. Označite, kar želite prenesti.

Označite posamezno tabelo, da jo nastavite posebej: ime njenega ciljnega objekta in njen način — Samodejno (struktura in zapisi) ali Samo DDL (struktura brez podatkov).

3. Možnosti ​

Možnosti tabel

MožnostUčinek
Ustvari tabeleUstvari ciljne tabele. Izklopite, če že obstajajo
Vključi indekseZnova ustvari indekse
Vključi privzete vrednostiPrenese privzete vrednosti stolpcev
Vključi omejitve tujih ključevZnova ustvari omejitve FK
Vključi pogon/vrsto tabelePogon MySQL, npr. InnoDB
Vključi nabor znakovPrenese nabor znakov
Vključi auto incrementOhrani samodejno naraščajoče stolpce
Vključi prožilceKopira prožilce, vezane na izbrane tabele — samo isti pogon, glejte spodaj
Izbriši ciljne objekte pred ustvarjanjemNajprej izbriše, kar je tam
Prilagodi DEFINER ciljnemu uporabnikuPrepiše DEFINER kopiranih pogledov, rutin in prožilcev na račun, s katerim teče prenos. Privzeto vklopljeno

Možnosti zapisov

MožnostUčinek
Ustvari zapiseKopira vrstice, ne le strukture
Uporabi transakcijoPrenos ovije tako, da se ob napaki razveljavi
Uporabi razširjene stavke INSERTINSERT-i z več vrsticami — precej hitreje
Nadaljuj ob napakiNadaljuje mimo neuspešnih vrstic, namesto da se ustavi
Velikost paketaVrstic na paket

Drugo

  • Ustvari ciljno bazo, če ne obstaja — ustvari bazo, če manjka.

4. Izvedba ​

Napredek je prikazan po fazah — ustvarjanje sheme, nato kopiranje — in po objektih. Rezultat je Prenos končan, Končano z napakami s seznamom ali napaka.

Prožilci ​

Vključi prožilce prenese prožilce, ki so vezani na izbrane tabele — v 2. koraku ni posebne skupine prožilcev. Dobro je vedeti dvoje:

  • Ustvarijo se po kopiranju vrstic, kot zadnja faza tabele. Če bi bili ustvarjeni pred zanko vstavljanja, bi se sprožili enkrat za vsako kopirano vrstico, kar bi tiho pokvarilo podatke, namesto da bi prišlo do napake.
  • Samo isti pogon. Telesa prožilca ni mogoče prevesti med narečji, zato se pri prenosu med različnimi pogoni prožilci preskočijo — tiho, ne da bi prenos spodletel.

DEFINER ​

MySQL in MariaDB vsak pogled, proceduro, funkcijo in prožilec označita z DEFINER=`user`@`host`, ta račun pa mora obstajati na strežniku, kamor objekt pristane. Če pogled, ki ga je definiral root@localhost, kopirate na strežnik, kjer se povezujete kot web@%, ga ni mogoče ustvariti ali pa se pokvari ob prvi uporabi.

Prilagodi DEFINER ciljnemu uporabniku — privzeto vklopljeno — prepiše DEFINER vsakega kopiranega pogleda, rutine in prožilca na račun, s katerim je prenos povezan na ciljni strani. Če tega računa ni mogoče ugotoviti, se klavzula odstrani in jo strežnik izpolni sam.

Izklopite to možnost, če želite DEFINER-je kopirati dobesedno, kar želite pri replikaciji strežnika, katerega računi se na obeh straneh ujemajo.

Profili ​

Shrani profil shrani celotno konfiguracijo — vir, cilj, izbor objektov in možnosti. Naloži profil jo vrne. Splača se pri vsakem prenosu, ki ga izvedete več kot enkrat, na primer pri osveževanju razvojne baze iz produkcije.

Menjava pogona: uporabite to, ne dumpa ​

Dump — iz Varnostnega kopiranja in obnove ali iz mysqldump — je zapisan v SQL izvornega pogona in je namenjen obnovi na enako vrsto strežnika. Če ga usmerite na drug pogon, spodleti že pri prvem stavku, razlogi pa niso površinski:

  • Identifikatorji so v narekovajih na način pogona. Krativci MySQL so povsod drugje sintaktična napaka, pojavijo pa se pri vsaki tabeli in stolpcu v datoteki.
  • Tipi se ne ujemajo — int(11), datetime, longtext, vrinjeni ENUM(...).
  • Cele konstrukcije nimajo ustreznice — AUTO_INCREMENT, ENGINE=InnoDB, DEFAULT CHARSET, vrinjene definicije KEY znotraj CREATE TABLE, LOCK TABLES.
  • Ubežanje nizov se razlikuje. MySQL narekovaj ubeži kot \'; PostgreSQL poševnico nazaj bere dobesedno, zato se niz konča prezgodaj. Ta težava pokvari podatke, namesto da bi glasno spodletela, zato je najhujša od štirih.

Prenos podatkov se vsemu temu izogne, ker nikoli ne prenaša besedila SQL. Prebere izvorno shemo, znova ustvari DDL za narečje cilja in vrstice kopira prek gonilnika, z vrednostmi, vezanimi kot parametri, namesto prilepljenimi v stavke.

Pravilo:

Uporabite
Isti pogon ali datoteka vmesVarnostno kopiranje in obnova
Drug pogonPrenos podatkov

Opombe pri prenosu med pogoni ​

Pri prehodu med pogoni se tipi preslikajo, ne kopirajo. Preverite rezultat, kadar vir uporablja tipe, značilne za pogon — MySQL ENUM, polja PostgreSQL, SQL Server UNIQUEIDENTIFIER.

Procedure in funkcije se kopirajo kot izvorno besedilo. Narečja SQL se med pogoni razlikujejo, zato bo rutino, ki deluje na MySQL, po prihodu na PostgreSQL pogosto treba urediti. Tabele in pogledi so deli, ki potujejo brez težav.

Začnite s poskusnim zagonom

Pri prvem prenosu med neznanimi strežniki izberite eno tabelo, nastavite Samo DDL in ga zaženite. Videli boste, kako se tipi preslikajo, preden se lotite celotne kopije.

Med MySQL in MariaDB ​

Oba si delita narečje, zato tipi stolpcev običajno potujejo natanko tako, kot so deklarirani. Izjema je tip, ki ga ciljna različica nima — običajno novejši tipi MariaDB, ki gredo v MySQL ali starejši MariaDB. Takšni stolpci se ustvarijo kot navaden tip, ki hrani iste vrednosti, predogled pa na to opozori, preden se karkoli izvede:

Izvorni tipNa cilju, ki ga nima
UUIDCHAR(36)
INET4VARCHAR(15)
INET6VARCHAR(45)
VECTOR(n)VARBINARY(4·n) — isti bajti
XMLTYPELONGTEXT
JSON (MySQL pred 5.7.8, MariaDB pred 10.2.7)LONGTEXT

Kaj ima cilj, se določi iz njegove dejanske različice — po enakih pravilih kot seznam tipov — zato deluje tudi, kadar je bil strežnik MariaDB shranjen kot povezava MySQL.

Povezano ​