sql >> Databáze >  >> RDS >> Mysql

Funkce zálohování PDO MySQL

Ten zálohovací skript je směšný a nikdo by neměl dělat jeho další verzi. Ten skript jsem už viděl, stejně jako podobné pokusy a mají spoustu problémů:

  • Neodděluje názvy tabulek ve zpětných značkách
  • Nezpracovává hodnoty NULL
  • Nezpracovává znakové sady
  • Nezpracovává binární data
  • Nezálohuje VIEW
  • Nezálohuje SPUŠTĚČE nebo ULOŽENÉ PROCEDURY ani ULOŽENÉ FUNKCE či UDÁLOSTI
  • Používá zastaralé rozšíření mysql (ale to je důvod, proč chcete verzi PDO, ne?)
  • Používá addlashes() namísto správné escapovací funkce MySQL.
  • Připojí vše údaje pro všechny tabulky do jednoho opravdu dlouhého řetězce, před výstupem celého obsahu. To znamená, že musíte být schopni uložit celou databázi do jednoho řetězce, což téměř jistě překročí limit maximální paměti PHP.

Viz také moje minulá odpověď o nešťastném zálohovacím skriptu Davida Walshe:

K vašemu komentáři:

Přečtěte si komentáře na stránce, na kterou jste odkazovali. Mnoho lidí identifikovalo problémy a někteří mají opravy nebo alespoň návrhy.

Skutečnost, že tento skript připojuje vše do jednoho řetězce, je myslím narušující, ale nemělo by být obtížné změnit skript tak, aby se výstupní soubor otevřel nejprve , poté během cyklu vytiskněte data každého řádku a po cyklu zavřete soubor. To je tak trochu nesmysl, nejsem si jistý, proč to scénář nedělá. Ale je docela jasné, že skript nebyl testován příliš dobře.

Ale každopádně bych se nepokoušel znovu vynalézt toto kolo. Mysqldump nebo mydump tuto práci dělají dobře. FWIW, nemusíte spouštět mysqldump na stejném serveru, kde je umístěna databáze. Mysqldump podporuje volbu pro --host takže můžete spustit mysqldump kdekoli pro zálohování vzdálené databáze, pokud brány firewall neblokují připojení vašeho klienta. V zásadě, pokud můžete připojit aplikaci PHP k databázi z nějakého klientského hostitele, můžete připojit mysqldump.

Pokud to opravdu není možnost, pak bych použil funkci výpisu databáze phpmyadmin. Ty jsou vyzrálé a osvědčené a vše správně vysypou. Zde je článek, který popisuje, jak používat funkci výpisu:

http://www.techrepublic. com/blog/smb-technologist/import-and-export-databases-using-phpmyadmin/

[Kopírování mých komentářů z vaší odpovědi:]

To se dostává do kontroly kódu, což není účelem StackOverflow. Ale stručně:

  • žádná správná podpora pro NULL (převedete je na '');
  • nedůsledně odděluje názvy tabulek;
  • používání uvozovek jiných než ANSI jako oddělovačů řetězců;
  • použití dotazů s vyrovnávací pamětí na velkých tabulkách prolomí maximální limit paměti PHP;
  • připojením všech řádků k velké tabulce dojde k porušení maximálního limitu paměti PHP;
  • použití addlashes() místo PDO::quote();
  • kontrola chyb dotazu pouze na konci funkce;
  • nekontroluje se neúspěšné vytvoření souboru;
  • rozšíření gzip nelze načíst
  • Také pravděpodobně stále nepodporuje data UTF8.

Ano, je to lepší než původní scénář Davida Walshe. :-)

NULL není totéž jako '' v SQL (kromě Oracle, ale ty v tomto případě nesplňují standard SQL). Viz MySQL, lepší vložit NULL nebo prázdné řetězec?

Špatně jsem si přečetl kód problému s limitem paměti. Píšete výstup pro každý řádek, takže je to v pořádku (pokud řádek neobsahuje 1GB blob nebo něco).

Neměli byste však vydávat pouze jeden příkaz INSERT se sadou řádků oddělených čárkami. Dokonce i mysqldump --extended-insert vypíše konečnou délku dat a poté spustí nový příkaz INSERT. Kritériem je, zda se délka příkazu INSERT vejde do argumentu volby pro --net-buffer-length .

V ANSI SQL se jednoduché uvozovky '' používají k oddělení řetězcových literálů nebo datových literálů. Dvojité uvozovky "" se používají k oddělování identifikátorů, jako je název tabulky nebo názvy sloupců. Ve výchozím nastavení s nimi MySQL zachází stejně, ale to je nestandardní. Viz Používají různé databáze různé uvozovky? . Pokud se pokusíte importovat zálohovaná data na server MySQL, kde máte SET SQL_MODE=ANSI_QUOTES , import se nezdaří.

Příklad:query('SELECT * FROM '.$table); a ve skutečnosti každý z dalších případů, kdy v dotazu použijete $table. Tabulku jste oddělili pouze jednou, v příkazu INSERT vypíše váš skript.

MySQL vždy rozpoznává zpětná znaménka jako oddělovače identifikátorů a jednoduché uvozovky pro řetězce/data. Ale dvojité uvozovky mění význam v závislosti na SQL_MODE, který jsem zmínil. Nemůžete předpokládat, který SQL_MODE je účinný v instanci MySQL, na které obnovujete, takže je nejlepší, když použijete zpětná znaménka pro identifikátory a jednoduché uvozovky pro řetězce. Důvod, proč byste je při dotazování tabulky oddělovali, je ten, že můžete mít názvy tabulek, které jsou vyhrazená slova SQL nebo které obsahují speciální znaky atd.

Můžete vložit všechny číselné typy bez oddělovačů. Oddělovače potřebují pouze řetězce a data. Viz dev.mysql.com/doc/refman/5.6/en/literals.html



  1. načíst data spinner ze sqlite a mysql

  2. Jak se připojit k MySQL na Amazon EC2 z Windows?

  3. Prohledávání sloupce obsahujícího data CSV v tabulce MySQL na existenci vstupních hodnot

  4. mysql REPLACE dotaz s více primárními klíči