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žnost | Učinek |
|---|---|
| Ustvari tabele | Ustvari ciljne tabele. Izklopite, če že obstajajo |
| Vključi indekse | Znova ustvari indekse |
| Vključi privzete vrednosti | Prenese privzete vrednosti stolpcev |
| Vključi omejitve tujih ključev | Znova ustvari omejitve FK |
| Vključi pogon/vrsto tabele | Pogon MySQL, npr. InnoDB |
| Vključi nabor znakov | Prenese nabor znakov |
| Vključi auto increment | Ohrani samodejno naraščajoče stolpce |
| Vključi prožilce | Kopira prožilce, vezane na izbrane tabele — samo isti pogon, glejte spodaj |
| Izbriši ciljne objekte pred ustvarjanjem | Najprej izbriše, kar je tam |
| Prilagodi DEFINER ciljnemu uporabniku | Prepiše DEFINER kopiranih pogledov, rutin in prožilcev na račun, s katerim teče prenos. Privzeto vklopljeno |
Možnosti zapisov
| Možnost | Učinek |
|---|---|
| Ustvari zapise | Kopira vrstice, ne le strukture |
| Uporabi transakcijo | Prenos ovije tako, da se ob napaki razveljavi |
| Uporabi razširjene stavke INSERT | INSERT-i z več vrsticami — precej hitreje |
| Nadaljuj ob napaki | Nadaljuje mimo neuspešnih vrstic, namesto da se ustavi |
| Velikost paketa | Vrstic 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, vrinjeniENUM(...). - Cele konstrukcije nimajo ustreznice —
AUTO_INCREMENT,ENGINE=InnoDB,DEFAULT CHARSET, vrinjene definicijeKEYznotrajCREATE 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 vmes | Varnostno kopiranje in obnova |
| Drug pogon | Prenos 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 tip | Na cilju, ki ga nima |
|---|---|
UUID | CHAR(36) |
INET4 | VARCHAR(15) |
INET6 | VARCHAR(45) |
VECTOR(n) | VARBINARY(4·n) — isti bajti |
XMLTYPE | LONGTEXT |
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
- Varnostno kopiranje in obnova — isti strežnik, datoteka vmes.
- Primerjava strukture in podatkov — preverite, ali se obe strani pozneje ujemata.
