Kopírování databáze v phpMyAdmin a jak jinak?

Jestliže máte databázi s provázanými integritními omezeními možná, že jste narazili na problém, kdy kopírování databáze v phpMyAdminu nefunguje. Nebo máte příliš velkou databázi a import není možný. Ale jak jinak to udělat?


1. Referenční integrita při kopírování v phpMyAdmin

Nemohu si pomoci, ale kopírování databáze mi v phpMyAdmin nefunguje. Pokud exportuju databázi a pokusím se ji znovu importovat do jiné prázdné databáze, vše proběhne v pořádku a to nemám vypnutou kontrolu referenčních klíčů. Naopak pokud zvolím úpravy v phpMyAdminu a dám kopírovat pouze strukturu databáze a žádná data, stejně mi to ohlásí chybu referenčních klíčů a přitom nekopíruji data. Nejde mi to do hlavy.

PhpMyAdmin sází na to, že definici referenčních omezení vytváří až po vytvoření všech tabulek, tím se snaží předcházet chybě, kdy výsledkem mysqldump je sql skript, který referenční omezení vytváří přímo s tabulkou. Důsledkem čehož jsou způsobeny problémy s pokusem vytvoření reference na tabulku, která má být vytvářena až za pár řádků.

Jestliže jste objevili stejnou chybu ať způsobenou mezi židlí a klávesnicí nebo chybou phpMyAdminu řešení bylo naznačeno výše, tedy 1. export databáze, 2. vytvoření nové databáze, 3. import exportovaného skriptu. Problém v tomto případě nastane, když je databáze příliš velká a soubor nelze importovat zpět.

2. Příliš velká databáze - kopírování nebo přejmenování databáze

Nevyhneme se použití příkazové řádky. Pokud máte na svém serveru přístup nebo testujete na lokálním serveru, pak ke kopírování databáze probíhá sousledem těchto příkazů.

Zálohování mysql databáze pomocí mysqldump

  1. mysqldump -u uživatel -p nazevdatabaze > nazevzalohy.sql

Import databáze ze skriptu

Konzoli otevřeme voláním mysql.exe obvykle v adresáři mysql/bin, pokud je mysql chráněna heslem pak používám parametr -u stanovuje uživatele a parametr -p stanovuje, že bude používáno heslo.

mysql -u uživatel -p

Pro set names si vyberte znakovou sadu ve které je psán importovaný soubor. Příkaz nastaví v jaké znakové sadě bude s mysql serverem komunikováno.

mysql>set names utf8;

Vytvoření nové databáze.

mysql>create database kopiedatabaze;

Nastavíme používání databáze.

mysql>use kopiedatabaze;

Tady příjde na řadu problém s referenční integritou, kde konzole skolabuje na pokusu vytvořit referenci k tabulce, která zatím neexistuje. Proto musíme nejprve vypnout kontrolu referenčních klíčů.

mysql>SET FOREIGN_KEY_CHECKS = 0;

A nyní je na řadě načtení skriptu s sql.

mysql>source nazevzalohy.sql;

Ještě znovu zapneme kontrolu referenčních klíčů a je hotovo.

mysql>SET FOREIGN_KEY_CHECKS = 1;

Rekapitulace:

  1. mysqldump -u uživatel -p nazevdatabaze > nazevzalohy.sql
  2. mysql -u uživatel -p
  3. mysql>set names utf8;
  4. mysql>create database kopiedatabaze;
  5. mysql>use kopiedatabaze;
  6. mysql>SET FOREIGN_KEY_CHECKS = 0;
  7. mysql>source nazevzalohy.sql;
  8. mysql>SET FOREIGN_KEY_CHECKS = 1; 

Stejný postup budeme muset použít v případě přejmenování databáze.

podobné články

22.03.2011MySQL sort NULL columns, řazení NULL sloupců, order NULL last(13%)
07.12.2009ORM, dibi, MySQL defaultní hodnoty (pokračování článku)(13%)
03.12.2009MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM(13%)
25.07.2009Daily MySQL backup, windows batch file(13%)
27.01.2009Jak na svátky v PHP a MySQL?(13%)
24.01.2009Jeden dotaz do databáze nebo tisíce? ... je to stejné?(13%)
08.12.2008INSERT INTO ... ON DUPLICATE UPDATE, ale co když nechceme, aby se nový záznam vytvořil, ale jen upravil existující?(13%)
30.06.2008MySQL SELECT ALL DUPLICATES, aneb jak nalézt všechny duplicitní řádky(13%)
06.04.2008Mysql pořadí řádku v dotazu, druhý díl, problém pořadí zpracování uživatelských proměnných(13%)
05.04.2008Mysql pořadí řádku v dotazu(13%)